From 0a9a2099baaa56c453eb0903258f329c9d4bc25d Mon Sep 17 00:00:00 2001 From: Rejean Loyer Date: Mon, 25 Feb 2013 19:30:12 -0500 Subject: [PATCH] code dump. unfortunate lack of commits. rick click menu on files/folders. comparative multiple folders listing. FileSystemIterator, FileSystemCache and FileSystemCacheIterator. --- explorer/explorer.epj | 67 +- explorer/res/explorerIcon.png | Bin 0 -> 1176 bytes explorer/src/Explorer.ec | 70 +- explorer/src/ExplorerWindow.ec | 762 ++++++++++++---- explorer/tests/t1FileSystemCache.ec | 13 + libede/EDE.epj | 274 +++++- libede/res/actions/address-book-new.png | Bin 0 -> 796 bytes libede/res/actions/appointment-new.png | Bin 0 -> 897 bytes libede/res/actions/bookmark-new.png | Bin 0 -> 686 bytes libede/res/actions/contact-new.png | Bin 0 -> 628 bytes libede/res/actions/document-new.png | Bin 0 -> 477 bytes libede/res/actions/document-open.png | Bin 0 -> 672 bytes libede/res/actions/document-print-preview.png | Bin 0 -> 779 bytes libede/res/actions/document-print.png | Bin 0 -> 544 bytes libede/res/actions/document-properties.png | Bin 0 -> 464 bytes libede/res/actions/document-save-as.png | Bin 0 -> 866 bytes libede/res/actions/document-save.png | Bin 0 -> 911 bytes libede/res/actions/edit-clear.png | Bin 0 -> 773 bytes libede/res/actions/edit-copy.png | Bin 0 -> 498 bytes libede/res/actions/edit-cut.png | Bin 0 -> 807 bytes libede/res/actions/edit-delete.png | Bin 0 -> 680 bytes libede/res/actions/edit-find-replace.png | Bin 0 -> 776 bytes libede/res/actions/edit-find.png | Bin 0 -> 617 bytes libede/res/actions/edit-paste.png | Bin 0 -> 561 bytes libede/res/actions/edit-redo.png | Bin 0 -> 591 bytes libede/res/actions/edit-select-all.png | Bin 0 -> 441 bytes libede/res/actions/edit-undo.png | Bin 0 -> 650 bytes libede/res/actions/folder-new.png | Bin 0 -> 635 bytes libede/res/actions/format-indent-less.png | Bin 0 -> 436 bytes libede/res/actions/format-indent-more.png | Bin 0 -> 435 bytes libede/res/actions/format-justify-center.png | Bin 0 -> 330 bytes libede/res/actions/format-justify-fill.png | Bin 0 -> 317 bytes libede/res/actions/format-justify-left.png | Bin 0 -> 324 bytes libede/res/actions/format-justify-right.png | Bin 0 -> 342 bytes libede/res/actions/format-text-bold.png | Bin 0 -> 705 bytes libede/res/actions/format-text-italic.png | Bin 0 -> 619 bytes libede/res/actions/format-text-strikethrough.png | Bin 0 -> 611 bytes libede/res/actions/format-text-underline.png | Bin 0 -> 673 bytes libede/res/actions/go-bottom.png | Bin 0 -> 663 bytes libede/res/actions/go-down.png | Bin 0 -> 683 bytes libede/res/actions/go-first.png | Bin 0 -> 666 bytes libede/res/actions/go-home.png | Bin 0 -> 606 bytes libede/res/actions/go-jump.png | Bin 0 -> 723 bytes libede/res/actions/go-last.png | Bin 0 -> 685 bytes libede/res/actions/go-next.png | Bin 0 -> 676 bytes libede/res/actions/go-previous.png | Bin 0 -> 655 bytes libede/res/actions/go-top.png | Bin 0 -> 636 bytes libede/res/actions/go-up.png | Bin 0 -> 652 bytes libede/res/actions/list-add.png | Bin 0 -> 323 bytes libede/res/actions/list-remove.png | Bin 0 -> 247 bytes libede/res/actions/mail-forward.png | Bin 0 -> 681 bytes libede/res/actions/mail-mark-junk.png | Bin 0 -> 882 bytes libede/res/actions/mail-mark-not-junk.png | Bin 0 -> 756 bytes libede/res/actions/mail-message-new.png | Bin 0 -> 619 bytes libede/res/actions/mail-reply-all.png | Bin 0 -> 868 bytes libede/res/actions/mail-reply-sender.png | Bin 0 -> 693 bytes libede/res/actions/mail-send-receive.png | Bin 0 -> 540 bytes libede/res/actions/media-eject.png | Bin 0 -> 628 bytes libede/res/actions/media-playback-pause.png | Bin 0 -> 464 bytes libede/res/actions/media-playback-start.png | Bin 0 -> 660 bytes libede/res/actions/media-playback-stop.png | Bin 0 -> 429 bytes libede/res/actions/media-record.png | Bin 0 -> 653 bytes libede/res/actions/media-seek-backward.png | Bin 0 -> 764 bytes libede/res/actions/media-seek-forward.png | Bin 0 -> 782 bytes libede/res/actions/media-skip-backward.png | Bin 0 -> 770 bytes libede/res/actions/media-skip-forward.png | Bin 0 -> 771 bytes libede/res/actions/process-stop.png | Bin 0 -> 820 bytes libede/res/actions/system-lock-screen.png | Bin 0 -> 764 bytes libede/res/actions/system-log-out.png | Bin 0 -> 799 bytes libede/res/actions/system-search.png | Bin 0 -> 935 bytes libede/res/actions/system-shutdown.png | Bin 0 -> 534 bytes libede/res/actions/tab-new.png | Bin 0 -> 514 bytes libede/res/actions/view-fullscreen.png | Bin 0 -> 650 bytes libede/res/actions/view-refresh.png | Bin 0 -> 912 bytes libede/res/actions/window-new.png | Bin 0 -> 583 bytes libede/res/apps/accessories-calculator.png | Bin 0 -> 686 bytes libede/res/apps/accessories-character-map.png | Bin 0 -> 558 bytes libede/res/apps/accessories-text-editor.png | Bin 0 -> 574 bytes libede/res/apps/help-browser.png | Bin 0 -> 932 bytes libede/res/apps/internet-group-chat.png | Bin 0 -> 422 bytes libede/res/apps/internet-mail.png | Bin 0 -> 550 bytes libede/res/apps/internet-news-reader.png | Bin 0 -> 474 bytes libede/res/apps/internet-web-browser.png | Bin 0 -> 928 bytes libede/res/apps/office-calendar.png | Bin 0 -> 603 bytes .../res/apps/preferences-desktop-accessibility.png | Bin 0 -> 652 bytes .../preferences-desktop-assistive-technology.png | Bin 0 -> 720 bytes libede/res/apps/preferences-desktop-font.png | Bin 0 -> 553 bytes .../preferences-desktop-keyboard-shortcuts.png | Bin 0 -> 653 bytes libede/res/apps/preferences-desktop-locale.png | Bin 0 -> 452 bytes libede/res/apps/preferences-desktop-multimedia.png | Bin 0 -> 650 bytes .../apps/preferences-desktop-remote-desktop.png | Bin 0 -> 734 bytes .../res/apps/preferences-desktop-screensaver.png | Bin 0 -> 707 bytes libede/res/apps/preferences-desktop-theme.png | Bin 0 -> 757 bytes libede/res/apps/preferences-desktop-wallpaper.png | Bin 0 -> 793 bytes .../res/apps/preferences-system-network-proxy.png | Bin 0 -> 829 bytes libede/res/apps/preferences-system-session.png | Bin 0 -> 690 bytes libede/res/apps/preferences-system-windows.png | Bin 0 -> 462 bytes libede/res/apps/system-file-manager.png | Bin 0 -> 378 bytes libede/res/apps/system-installer.png | Bin 0 -> 665 bytes libede/res/apps/system-software-update.png | Bin 0 -> 964 bytes libede/res/apps/system-users.png | Bin 0 -> 911 bytes libede/res/apps/utilities-system-monitor.png | Bin 0 -> 611 bytes libede/res/apps/utilities-terminal.png | Bin 0 -> 668 bytes libede/res/categories/applications-accessories.png | Bin 0 -> 937 bytes libede/res/categories/applications-development.png | Bin 0 -> 765 bytes libede/res/categories/applications-games.png | Bin 0 -> 346 bytes libede/res/categories/applications-graphics.png | Bin 0 -> 635 bytes libede/res/categories/applications-internet.png | Bin 0 -> 864 bytes libede/res/categories/applications-multimedia.png | Bin 0 -> 592 bytes libede/res/categories/applications-office.png | Bin 0 -> 769 bytes libede/res/categories/applications-other.png | Bin 0 -> 609 bytes libede/res/categories/applications-system.png | Bin 0 -> 588 bytes .../categories/preferences-desktop-peripherals.png | Bin 0 -> 873 bytes libede/res/categories/preferences-desktop.png | Bin 0 -> 440 bytes libede/res/categories/preferences-system.png | Bin 0 -> 611 bytes libede/res/devices/audio-card.png | Bin 0 -> 879 bytes libede/res/devices/audio-input-microphone.png | Bin 0 -> 703 bytes libede/res/devices/battery.png | Bin 0 -> 873 bytes libede/res/devices/camera-photo.png | Bin 0 -> 864 bytes libede/res/devices/camera-video.png | Bin 0 -> 701 bytes libede/res/devices/computer.png | Bin 0 -> 725 bytes libede/res/devices/drive-harddisk.png | Bin 0 -> 603 bytes libede/res/devices/drive-optical.png | Bin 0 -> 720 bytes libede/res/devices/drive-removable-media.png | Bin 0 -> 510 bytes libede/res/devices/input-gaming.png | Bin 0 -> 812 bytes libede/res/devices/input-keyboard.png | Bin 0 -> 587 bytes libede/res/devices/input-mouse.png | Bin 0 -> 720 bytes libede/res/devices/media-flash.png | Bin 0 -> 607 bytes libede/res/devices/media-floppy.png | Bin 0 -> 561 bytes libede/res/devices/media-optical.png | Bin 0 -> 931 bytes libede/res/devices/multimedia-player.png | Bin 0 -> 516 bytes libede/res/devices/network-wired.png | Bin 0 -> 699 bytes libede/res/devices/network-wireless.png | Bin 0 -> 635 bytes libede/res/devices/printer.png | Bin 0 -> 481 bytes libede/res/devices/video-display.png | Bin 0 -> 662 bytes libede/res/emblem-not.png | Bin 0 -> 623 bytes libede/res/emblems/emblem-favorite.png | Bin 0 -> 788 bytes libede/res/emblems/emblem-important.png | Bin 0 -> 717 bytes libede/res/emblems/emblem-photos.png | Bin 0 -> 644 bytes libede/res/emblems/emblem-readonly.png | Bin 0 -> 430 bytes libede/res/emblems/emblem-symbolic-link.png | Bin 0 -> 459 bytes libede/res/emblems/emblem-system.png | Bin 0 -> 629 bytes libede/res/emblems/emblem-unreadable.png | Bin 0 -> 669 bytes libede/res/emotes/face-angel.png | Bin 0 -> 992 bytes libede/res/emotes/face-crying.png | Bin 0 -> 1027 bytes libede/res/emotes/face-devilish.png | Bin 0 -> 1020 bytes libede/res/emotes/face-glasses.png | Bin 0 -> 1008 bytes libede/res/emotes/face-grin.png | Bin 0 -> 1016 bytes libede/res/emotes/face-kiss.png | Bin 0 -> 919 bytes libede/res/emotes/face-monkey.png | Bin 0 -> 784 bytes libede/res/emotes/face-plain.png | Bin 0 -> 978 bytes libede/res/emotes/face-sad.png | Bin 0 -> 992 bytes libede/res/emotes/face-smile-big.png | Bin 0 -> 1014 bytes libede/res/emotes/face-smile.png | Bin 0 -> 986 bytes libede/res/emotes/face-surprise.png | Bin 0 -> 984 bytes libede/res/emotes/face-wink.png | Bin 0 -> 983 bytes libede/res/mimetypes/application-certificate.png | Bin 0 -> 830 bytes libede/res/mimetypes/application-x-executable.png | Bin 0 -> 560 bytes libede/res/mimetypes/audio-x-generic.png | Bin 0 -> 688 bytes libede/res/mimetypes/font-x-generic.png | Bin 0 -> 627 bytes libede/res/mimetypes/image-x-generic.png | Bin 0 -> 558 bytes libede/res/mimetypes/package-x-generic.png | Bin 0 -> 540 bytes libede/res/mimetypes/text-html.png | Bin 0 -> 709 bytes libede/res/mimetypes/text-x-generic-template.png | Bin 0 -> 446 bytes libede/res/mimetypes/text-x-generic.png | Bin 0 -> 333 bytes libede/res/mimetypes/text-x-script.png | Bin 0 -> 516 bytes libede/res/mimetypes/video-x-generic.png | Bin 0 -> 823 bytes libede/res/mimetypes/x-office-address-book.png | Bin 0 -> 753 bytes libede/res/mimetypes/x-office-calendar.png | Bin 0 -> 604 bytes .../res/mimetypes/x-office-document-template.png | Bin 0 -> 628 bytes libede/res/mimetypes/x-office-document.png | Bin 0 -> 392 bytes libede/res/mimetypes/x-office-drawing-template.png | Bin 0 -> 782 bytes libede/res/mimetypes/x-office-drawing.png | Bin 0 -> 541 bytes .../mimetypes/x-office-presentation-template.png | Bin 0 -> 710 bytes libede/res/mimetypes/x-office-presentation.png | Bin 0 -> 567 bytes .../mimetypes/x-office-spreadsheet-template.png | Bin 0 -> 780 bytes libede/res/mimetypes/x-office-spreadsheet.png | Bin 0 -> 704 bytes libede/res/places/folder-remote.png | Bin 0 -> 697 bytes libede/res/places/folder-saved-search.png | Bin 0 -> 711 bytes libede/res/places/folder.png | Bin 0 -> 581 bytes libede/res/places/network-server.png | Bin 0 -> 642 bytes libede/res/places/network-workgroup.png | Bin 0 -> 517 bytes libede/res/places/start-here.png | Bin 0 -> 658 bytes libede/res/places/user-desktop.png | Bin 0 -> 722 bytes libede/res/places/user-home.png | Bin 0 -> 679 bytes libede/res/places/user-trash.png | Bin 0 -> 655 bytes libede/res/status/audio-volume-high.png | Bin 0 -> 685 bytes libede/res/status/audio-volume-low.png | Bin 0 -> 500 bytes libede/res/status/audio-volume-medium.png | Bin 0 -> 592 bytes libede/res/status/audio-volume-muted.png | Bin 0 -> 632 bytes libede/res/status/battery-caution.png | Bin 0 -> 816 bytes libede/res/status/dialog-error.png | Bin 0 -> 653 bytes libede/res/status/dialog-information.png | Bin 0 -> 863 bytes libede/res/status/dialog-warning.png | Bin 0 -> 603 bytes libede/res/status/folder-drag-accept.png | Bin 0 -> 615 bytes libede/res/status/folder-open.png | Bin 0 -> 625 bytes libede/res/status/folder-visiting.png | Bin 0 -> 429 bytes libede/res/status/image-loading.png | Bin 0 -> 481 bytes libede/res/status/image-missing.png | Bin 0 -> 427 bytes libede/res/status/mail-attachment.png | Bin 0 -> 649 bytes libede/res/status/network-error.png | Bin 0 -> 646 bytes libede/res/status/network-idle.png | Bin 0 -> 393 bytes libede/res/status/network-offline.png | Bin 0 -> 470 bytes libede/res/status/network-receive.png | Bin 0 -> 456 bytes libede/res/status/network-transmit-receive.png | Bin 0 -> 408 bytes libede/res/status/network-transmit.png | Bin 0 -> 455 bytes libede/res/status/network-wireless-encrypted.png | Bin 0 -> 681 bytes libede/res/status/printer-error.png | Bin 0 -> 652 bytes libede/res/status/software-update-available.png | Bin 0 -> 740 bytes libede/res/status/software-update-urgent.png | Bin 0 -> 564 bytes libede/res/status/user-trash-full.png | Bin 0 -> 786 bytes libede/res/status/weather-clear-night.png | Bin 0 -> 961 bytes libede/res/status/weather-clear.png | Bin 0 -> 682 bytes libede/res/status/weather-few-clouds-night.png | Bin 0 -> 965 bytes libede/res/status/weather-few-clouds.png | Bin 0 -> 763 bytes libede/res/status/weather-overcast.png | Bin 0 -> 975 bytes libede/res/status/weather-severe-alert.png | Bin 0 -> 977 bytes libede/res/status/weather-showers-scattered.png | Bin 0 -> 1045 bytes libede/res/status/weather-showers.png | Bin 0 -> 959 bytes libede/res/status/weather-snow.png | Bin 0 -> 998 bytes libede/res/status/weather-storm.png | Bin 0 -> 1031 bytes libede/src/FileSystemBox.ec | 983 +++++++++++++++++++-- libede/src/FileSystemCache.ec | 475 ++++++++++ libede/src/FileSystemIterator.ec | 118 +++ libede/src/FileSystemSearch.ec | 26 +- 225 files changed, 2504 insertions(+), 284 deletions(-) create mode 100644 explorer/res/explorerIcon.png create mode 100644 explorer/tests/t1FileSystemCache.ec create mode 100644 libede/res/actions/address-book-new.png create mode 100644 libede/res/actions/appointment-new.png create mode 100644 libede/res/actions/bookmark-new.png create mode 100644 libede/res/actions/contact-new.png create mode 100644 libede/res/actions/document-new.png create mode 100644 libede/res/actions/document-open.png create mode 100644 libede/res/actions/document-print-preview.png create mode 100644 libede/res/actions/document-print.png create mode 100644 libede/res/actions/document-properties.png create mode 100644 libede/res/actions/document-save-as.png create mode 100644 libede/res/actions/document-save.png create mode 100644 libede/res/actions/edit-clear.png create mode 100644 libede/res/actions/edit-copy.png create mode 100644 libede/res/actions/edit-cut.png create mode 100644 libede/res/actions/edit-delete.png create mode 100644 libede/res/actions/edit-find-replace.png create mode 100644 libede/res/actions/edit-find.png create mode 100644 libede/res/actions/edit-paste.png create mode 100644 libede/res/actions/edit-redo.png create mode 100644 libede/res/actions/edit-select-all.png create mode 100644 libede/res/actions/edit-undo.png create mode 100644 libede/res/actions/folder-new.png create mode 100644 libede/res/actions/format-indent-less.png create mode 100644 libede/res/actions/format-indent-more.png create mode 100644 libede/res/actions/format-justify-center.png create mode 100644 libede/res/actions/format-justify-fill.png create mode 100644 libede/res/actions/format-justify-left.png create mode 100644 libede/res/actions/format-justify-right.png create mode 100644 libede/res/actions/format-text-bold.png create mode 100644 libede/res/actions/format-text-italic.png create mode 100644 libede/res/actions/format-text-strikethrough.png create mode 100644 libede/res/actions/format-text-underline.png create mode 100644 libede/res/actions/go-bottom.png create mode 100644 libede/res/actions/go-down.png create mode 100644 libede/res/actions/go-first.png create mode 100644 libede/res/actions/go-home.png create mode 100644 libede/res/actions/go-jump.png create mode 100644 libede/res/actions/go-last.png create mode 100644 libede/res/actions/go-next.png create mode 100644 libede/res/actions/go-previous.png create mode 100644 libede/res/actions/go-top.png create mode 100644 libede/res/actions/go-up.png create mode 100644 libede/res/actions/list-add.png create mode 100644 libede/res/actions/list-remove.png create mode 100644 libede/res/actions/mail-forward.png create mode 100644 libede/res/actions/mail-mark-junk.png create mode 100644 libede/res/actions/mail-mark-not-junk.png create mode 100644 libede/res/actions/mail-message-new.png create mode 100644 libede/res/actions/mail-reply-all.png create mode 100644 libede/res/actions/mail-reply-sender.png create mode 100644 libede/res/actions/mail-send-receive.png create mode 100644 libede/res/actions/media-eject.png create mode 100644 libede/res/actions/media-playback-pause.png create mode 100644 libede/res/actions/media-playback-start.png create mode 100644 libede/res/actions/media-playback-stop.png create mode 100644 libede/res/actions/media-record.png create mode 100644 libede/res/actions/media-seek-backward.png create mode 100644 libede/res/actions/media-seek-forward.png create mode 100644 libede/res/actions/media-skip-backward.png create mode 100644 libede/res/actions/media-skip-forward.png create mode 100644 libede/res/actions/process-stop.png create mode 100644 libede/res/actions/system-lock-screen.png create mode 100644 libede/res/actions/system-log-out.png create mode 100644 libede/res/actions/system-search.png create mode 100644 libede/res/actions/system-shutdown.png create mode 100644 libede/res/actions/tab-new.png create mode 100644 libede/res/actions/view-fullscreen.png create mode 100644 libede/res/actions/view-refresh.png create mode 100644 libede/res/actions/window-new.png create mode 100644 libede/res/apps/accessories-calculator.png create mode 100644 libede/res/apps/accessories-character-map.png create mode 100644 libede/res/apps/accessories-text-editor.png create mode 100644 libede/res/apps/help-browser.png create mode 100644 libede/res/apps/internet-group-chat.png create mode 100644 libede/res/apps/internet-mail.png create mode 100644 libede/res/apps/internet-news-reader.png create mode 100644 libede/res/apps/internet-web-browser.png create mode 100644 libede/res/apps/office-calendar.png create mode 100644 libede/res/apps/preferences-desktop-accessibility.png create mode 100644 libede/res/apps/preferences-desktop-assistive-technology.png create mode 100644 libede/res/apps/preferences-desktop-font.png create mode 100644 libede/res/apps/preferences-desktop-keyboard-shortcuts.png create mode 100644 libede/res/apps/preferences-desktop-locale.png create mode 100644 libede/res/apps/preferences-desktop-multimedia.png create mode 100644 libede/res/apps/preferences-desktop-remote-desktop.png create mode 100644 libede/res/apps/preferences-desktop-screensaver.png create mode 100644 libede/res/apps/preferences-desktop-theme.png create mode 100644 libede/res/apps/preferences-desktop-wallpaper.png create mode 100644 libede/res/apps/preferences-system-network-proxy.png create mode 100644 libede/res/apps/preferences-system-session.png create mode 100644 libede/res/apps/preferences-system-windows.png create mode 100644 libede/res/apps/system-file-manager.png create mode 100644 libede/res/apps/system-installer.png create mode 100644 libede/res/apps/system-software-update.png create mode 100644 libede/res/apps/system-users.png create mode 100644 libede/res/apps/utilities-system-monitor.png create mode 100644 libede/res/apps/utilities-terminal.png create mode 100644 libede/res/categories/applications-accessories.png create mode 100644 libede/res/categories/applications-development.png create mode 100644 libede/res/categories/applications-games.png create mode 100644 libede/res/categories/applications-graphics.png create mode 100644 libede/res/categories/applications-internet.png create mode 100644 libede/res/categories/applications-multimedia.png create mode 100644 libede/res/categories/applications-office.png create mode 100644 libede/res/categories/applications-other.png create mode 100644 libede/res/categories/applications-system.png create mode 100644 libede/res/categories/preferences-desktop-peripherals.png create mode 100644 libede/res/categories/preferences-desktop.png create mode 100644 libede/res/categories/preferences-system.png create mode 100644 libede/res/devices/audio-card.png create mode 100644 libede/res/devices/audio-input-microphone.png create mode 100644 libede/res/devices/battery.png create mode 100644 libede/res/devices/camera-photo.png create mode 100644 libede/res/devices/camera-video.png create mode 100644 libede/res/devices/computer.png create mode 100644 libede/res/devices/drive-harddisk.png create mode 100644 libede/res/devices/drive-optical.png create mode 100644 libede/res/devices/drive-removable-media.png create mode 100644 libede/res/devices/input-gaming.png create mode 100644 libede/res/devices/input-keyboard.png create mode 100644 libede/res/devices/input-mouse.png create mode 100644 libede/res/devices/media-flash.png create mode 100644 libede/res/devices/media-floppy.png create mode 100644 libede/res/devices/media-optical.png create mode 100644 libede/res/devices/multimedia-player.png create mode 100644 libede/res/devices/network-wired.png create mode 100644 libede/res/devices/network-wireless.png create mode 100644 libede/res/devices/printer.png create mode 100644 libede/res/devices/video-display.png create mode 100644 libede/res/emblem-not.png create mode 100644 libede/res/emblems/emblem-favorite.png create mode 100644 libede/res/emblems/emblem-important.png create mode 100644 libede/res/emblems/emblem-photos.png create mode 100644 libede/res/emblems/emblem-readonly.png create mode 100644 libede/res/emblems/emblem-symbolic-link.png create mode 100644 libede/res/emblems/emblem-system.png create mode 100644 libede/res/emblems/emblem-unreadable.png create mode 100644 libede/res/emotes/face-angel.png create mode 100644 libede/res/emotes/face-crying.png create mode 100644 libede/res/emotes/face-devilish.png create mode 100644 libede/res/emotes/face-glasses.png create mode 100644 libede/res/emotes/face-grin.png create mode 100644 libede/res/emotes/face-kiss.png create mode 100644 libede/res/emotes/face-monkey.png create mode 100644 libede/res/emotes/face-plain.png create mode 100644 libede/res/emotes/face-sad.png create mode 100644 libede/res/emotes/face-smile-big.png create mode 100644 libede/res/emotes/face-smile.png create mode 100644 libede/res/emotes/face-surprise.png create mode 100644 libede/res/emotes/face-wink.png create mode 100644 libede/res/mimetypes/application-certificate.png create mode 100644 libede/res/mimetypes/application-x-executable.png create mode 100644 libede/res/mimetypes/audio-x-generic.png create mode 100644 libede/res/mimetypes/font-x-generic.png create mode 100644 libede/res/mimetypes/image-x-generic.png create mode 100644 libede/res/mimetypes/package-x-generic.png create mode 100644 libede/res/mimetypes/text-html.png create mode 100644 libede/res/mimetypes/text-x-generic-template.png create mode 100644 libede/res/mimetypes/text-x-generic.png create mode 100644 libede/res/mimetypes/text-x-script.png create mode 100644 libede/res/mimetypes/video-x-generic.png create mode 100644 libede/res/mimetypes/x-office-address-book.png create mode 100644 libede/res/mimetypes/x-office-calendar.png create mode 100644 libede/res/mimetypes/x-office-document-template.png create mode 100644 libede/res/mimetypes/x-office-document.png create mode 100644 libede/res/mimetypes/x-office-drawing-template.png create mode 100644 libede/res/mimetypes/x-office-drawing.png create mode 100644 libede/res/mimetypes/x-office-presentation-template.png create mode 100644 libede/res/mimetypes/x-office-presentation.png create mode 100644 libede/res/mimetypes/x-office-spreadsheet-template.png create mode 100644 libede/res/mimetypes/x-office-spreadsheet.png create mode 100644 libede/res/places/folder-remote.png create mode 100644 libede/res/places/folder-saved-search.png create mode 100644 libede/res/places/folder.png create mode 100644 libede/res/places/network-server.png create mode 100644 libede/res/places/network-workgroup.png create mode 100644 libede/res/places/start-here.png create mode 100644 libede/res/places/user-desktop.png create mode 100644 libede/res/places/user-home.png create mode 100644 libede/res/places/user-trash.png create mode 100644 libede/res/status/audio-volume-high.png create mode 100644 libede/res/status/audio-volume-low.png create mode 100644 libede/res/status/audio-volume-medium.png create mode 100644 libede/res/status/audio-volume-muted.png create mode 100644 libede/res/status/battery-caution.png create mode 100644 libede/res/status/dialog-error.png create mode 100644 libede/res/status/dialog-information.png create mode 100644 libede/res/status/dialog-warning.png create mode 100644 libede/res/status/folder-drag-accept.png create mode 100644 libede/res/status/folder-open.png create mode 100644 libede/res/status/folder-visiting.png create mode 100644 libede/res/status/image-loading.png create mode 100644 libede/res/status/image-missing.png create mode 100644 libede/res/status/mail-attachment.png create mode 100644 libede/res/status/network-error.png create mode 100644 libede/res/status/network-idle.png create mode 100644 libede/res/status/network-offline.png create mode 100644 libede/res/status/network-receive.png create mode 100644 libede/res/status/network-transmit-receive.png create mode 100644 libede/res/status/network-transmit.png create mode 100644 libede/res/status/network-wireless-encrypted.png create mode 100644 libede/res/status/printer-error.png create mode 100644 libede/res/status/software-update-available.png create mode 100644 libede/res/status/software-update-urgent.png create mode 100644 libede/res/status/user-trash-full.png create mode 100644 libede/res/status/weather-clear-night.png create mode 100644 libede/res/status/weather-clear.png create mode 100644 libede/res/status/weather-few-clouds-night.png create mode 100644 libede/res/status/weather-few-clouds.png create mode 100644 libede/res/status/weather-overcast.png create mode 100644 libede/res/status/weather-severe-alert.png create mode 100644 libede/res/status/weather-showers-scattered.png create mode 100644 libede/res/status/weather-showers.png create mode 100644 libede/res/status/weather-snow.png create mode 100644 libede/res/status/weather-storm.png create mode 100644 libede/src/FileSystemCache.ec create mode 100644 libede/src/FileSystemIterator.ec diff --git a/explorer/explorer.epj b/explorer/explorer.epj index eb35059..804866e 100644 --- a/explorer/explorer.epj +++ b/explorer/explorer.epj @@ -35,15 +35,35 @@ "MemoryGuard" : true, "Console" : true } + }, + { + "Name" : "Test", + "Options" : { + "Debug" : true, + "MemoryGuard" : true, + "Console" : true + } } ], "Files" : [ { "Folder" : "extern", "Files" : [ - "/sdk/extras/gui/controls/SelectorBar.ec", - "/sdk/extras/gui/controls/ToolBar.ec", - "/sdk/extras/gui/IconBag.ec" + { + "FileName" : "../../../sdk/extras/gui/controls/ToolBar.ec", + "Options" : { + "ExcludeFromBuild" : true + } + }, + "../../../sdk/extras/gui/controls/SearchBox.ec" + ], + "Configurations" : [ + { + "Name" : "Test", + "Options" : { + "ExcludeFromBuild" : true + } + } ] }, { @@ -77,7 +97,43 @@ "Files" : [ "Explorer.ec", "ExplorerWindow.ec" + ], + "Configurations" : [ + { + "Name" : "Test", + "Options" : { + "ExcludeFromBuild" : true + } + } ] + }, + { + "Folder" : "tests", + "Files" : [ + { + "FileName" : "t1FileSystemCache.ec", + "Configurations" : [ + { + "Name" : "Test", + "Options" : { + "ExcludeFromBuild" : false + } + } + ] + } + ], + "Options" : { + "ExcludeFromBuild" : true + } + }, + { + "Folder" : "tools", + "Files" : [ + + ], + "Options" : { + "ExcludeFromBuild" : true + } } ], "ResourcesPath" : "res", @@ -89,6 +145,7 @@ "view-icons.png", "view-list.png", "view-showcase-left.png", - "view-showcase-right.png" + "view-showcase-right.png", + "explorerIcon.png" ] -} \ No newline at end of file +} diff --git a/explorer/res/explorerIcon.png b/explorer/res/explorerIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..472484f11279c3e37a20ddcc8277c516ad246115 GIT binary patch literal 1176 zcmV;J1ZVq+P)1yxd$0C6kuV7bR+PdY00{*lQ*M=l z8i@j0IzB)oK0r!@M1^RfLrAAU7s-kOiqb{G#>6NV#`n5+-j|u38H#(!I(Lo}a#ASx zOOJMTcK3OH^E@-NyCMujUZ>=1js9N%@BwbzxZx|Mem2IuchLhvh}>HH`NM|~zg!tW znx z&Mh?nAq1P7oB6@P!AHRDl>lh1(=5xxrAr$aW3bkq30%yC5Q1v8T0cBI{9=21`_`;~ znVfUlTKn$b$Z5|!&XdlVufDtg z{_MP%0o`cSt6FQ+AChLZ%>LhFqBx(7Z0TsvBM}Qt0W>N;D$@u-XLfnM6&qu8zdxYc z?Gk5}dbNZ#lN;pJ!Lx=t&)ie96SLNlWQH`$!HM|>RxCkQsRXoIEixmh1tqLgcycwb zi*cG$Z~BaeIo7%-3jleZt0)@L?+?)C4XS~Ua}H0Qo97pkgHfu{xh3!=ajLB``OyM^ zF(xaQOH`X1tkudmKnk(E_%A5q9HUf|TZiWfg0jbHk|`m?$pV12HXDt`91j%h^-Jj7 zzS8J3ZHY4jPT)`dls(DlRON!Fldzb9)c1Y7AfQQ^OxX*AOy-!wy2(Ca?8H=Vm#s*g zgTW}ZxpRvE*4kt|9@824R9a=CM3d?1O9;q~MH`3CExDO)%P*OgL>Y$T#1qn6T7pyv zfeadyNs60>X%$s}D(4*iBtcj^SO93Z+hS*D$3(GWaO(K; zWQgp(;tse($HzmPB*O>0?RG5;!*~t=cu^Gn^vj|6Os(Vpw*Sf>yJzIU0$80M96$Ks z>*6&r`!#E~+s$BY?af-y+H^Q6g comparedPaths = null; SetLoggingMode(debug, null); + for(c = 1; c < argc; c++) + { + if(!strcmp(argv[c], "#")) + { + argc = c; + break; + } + } + if(argc > 1) { if(!strcmpi(argv[1], "go") && argc > 2) - goPath = argv[2]; + openArgsStartAt = 2; else if(!strcmpi(argv[1], "find") && argc > 2) { char * unquoted; @@ -50,20 +64,49 @@ class Explorer : GuiApplication } else if(!strcmpi(argv[1], "search") && argc > 2) searchPath = argv[2]; + else if(!strcmpi(argv[1], "compare") && argc > 2) + { + QuickPathTool goPath { }; + comparedPaths = { }; + if(argc == 3) + { + goPath = ""; // current dir + comparedPaths.Add(goPath); + } + for(c = 2; c < argc; c++) + { + char * s; + goPath = argv[c]; + s = goPath; + if(s) + comparedPaths.Add(CopyString(s)); + } + if(comparedPaths.count < 2) + PrintLn("compare requires at least 2 existing directories to work."); + } else if(!strcmpi(argv[1], "image") && argc > 2) ; else if(!strcmpi(argv[1], "slides") && argc > 2) ; else - goPath = argv[1]; + openArgsStartAt = 1; } else - goPath = ""; - if(goPath) + openArgsStartAt = -1; + + if(openArgsStartAt) { - ExplorerWindow explorerWnd { }; - explorerWnd.Create(); - explorerWnd.GoTo(goPath, false, false); + QuickPathTool goPath { }; + for(c = openArgsStartAt; c < argc; c++) + { + goPath = openArgsStartAt == -1 ? "" : argv[c]; + if(goPath) + { + ExplorerWindow explorerWnd { }; + explorerWnd.Create(); + explorerWnd.location = goPath;//explorerWnd.GoTo(goPath, false, false); + } + } } else if(searchPath) { @@ -71,6 +114,15 @@ class Explorer : GuiApplication explorerWnd.Create(); //explorerWnd.SearchLocation(searchPath); } + else if(comparedPaths && comparedPaths.count > 1) + { + // compare /s1/library/dummies /s1/library/movies /s1/oldlib/movies "/home/redj/.gvfs/d02-2tb on kimji/library/movies" + ExplorerWindow explorerWnd { }; + explorerWnd.Create(); + explorerWnd.view.columnsCompareStyle = true; + explorerWnd.comparedLocations = comparedPaths; + // delete comparedPaths; + } return true; } } @@ -115,7 +167,7 @@ struct QuickPathTool delete original; } } - get { return path[0] ? path : null; } + get { return path[0] ? (char*)path : null; } } property bool { get { return path[0] != '\0'; } } }; diff --git a/explorer/src/ExplorerWindow.ec b/explorer/src/ExplorerWindow.ec index 54a6a6a..f1c0a2d 100644 --- a/explorer/src/ExplorerWindow.ec +++ b/explorer/src/ExplorerWindow.ec @@ -1,6 +1,7 @@ import "Explorer" -import "IconBag" -import "ToolBar" +//import "IconBag" +//import "ToolBar" +import "SearchBox" #ifdef _DEBUG define title = "Ecere Explorer (Debug)"; @@ -16,11 +17,13 @@ define selectionText = Color { 20, 30, 40 }; define toolBarBackgroundColor = backgroundColor;//white; //Color { 240, 240, 250 }; define toolBarForegroundColor = foregroundColor;//white; //Color { 240, 240, 250 }; */ -define backgroundColor = beige;//white; //Color { 128, 145, 175 }; //200, 224, 224 }; //lightGray; -define foregroundColor = black; -define selectionColor = app.currentSkin.selectionColor; -define selectionText = app.currentSkin.selectionText; -define toolBarBackgroundColor = backgroundColor;//white; //Color { 240, 240, 250 }; +define backgroundColor = Color { 155, 170, 160 }; +//define backgroundColor = Color { 250, 250, 255 }; +//define backgroundColor = beige;//white; //Color { 128, 145, 175 }; //200, 224, 224 }; //lightGray; +define foregroundColor = Color { 45, 45, 45 };//black; +define selectionColor = Color { 80, 140, 110 };//app.currentSkin.selectionColor; +define selectionText = black;//app.currentSkin.selectionText; +define toolBarBackgroundColor = Color { 170, 187, 176 }; //backgroundColor;//white; //Color { 240, 240, 250 }; define toolBarForegroundColor = foregroundColor;//white; //Color { 240, 240, 250 }; enum ExplorerToolId @@ -48,6 +51,85 @@ enum ExplorerToolId hasHeader }; +enum Icon +{ + missing, + newWindow, goBack, goForward, goUp, goHome, newFile, newFolder, + browse, + panelTree, panelSearch, + addressBar, + refresh, + viewList, viewDetails, viewIcons, viewCards, viewShowcase, viewTree, viewCustom, + previewPictures, + searchInFileName, inFileNameMatchCase, inFileNameMatchWord, + searchInFileContent, inFileContentMatchCase, inFileContentMatchWord, + searchInSubDirs, searchStart, searchStop, + hasHeader +}; +static char * iconNames[Icon::enumSize] = +{ + "<:ecere>emblems/unreadable.png", /* missing */ + + "<:ecere>actions/windowNew.png", /* newWindow */ + "<:ecere>actions/goPrevious.png", /* goBack */ + "<:ecere>actions/goNext.png", /* goForward */ + "<:ecere>actions/goUp.png", /* goUp */ + "<:ecere>actions/goHome.png", /* goHome */ + "<:ecere>mimeTypes/file.png", /* newFile */ + "<:ecere>actions/folderNew.png", /* newFolder */ + + ":browse.png", /* browse */ + + ":panel-tree.png", /* panelTree */ + "<:ecere>actions/editFind.png", /* panelSearch */ + + "", /* addressBar */ + + "<:ecere>actions/viewRefresh.png", /* refresh */ + + ":view-list.png", /* viewList */ + ":view-details.png", /* viewDetails */ + ":view-icons.png", /* viewIcons */ + ":view-cards.png", /* viewCards */ + ":view-showcase-right.png", /* viewShowcase */ + ":panel-tree.png", /* viewTree */ + ":view-custom.png", /* viewCustom */ + + "<:ecere>mimeTypes/image.png", /* previewPictures */ + + "", /* searchInFileName */ + "<:ecere>emblems/unreadable.png", /* inFileNameMatchCase */ + "<:ecere>emblems/unreadable.png", /* inFileNameMatchWord */ + "", /* searchInFileContent */ + "<:ecere>emblems/unreadable.png", /* inFileContentMatchCase */ + "<:ecere>emblems/unreadable.png", /* inFileContentMatchWord */ + ":browse.png", /* searchInSubDirs */ + "<:ecere>actions/editFind.png", /* searchStart */ + "<:ecere>emblems/unreadable.png", /* searchStop */ + "<:ecere>emblems/unreadable.png" /* hasHeader */ +}; + +class IconToolButton : ToolButton +{ + //inactive = true; + //bitmapAlignment = left; + + property Icon icon + { + set + { + bitmap = BitmapResource { fileName = iconNames[value], alphaBlend = true }; + //id = value; + } + } +} + +class ToggleIconToolButton : IconToolButton +{ + toggle = true; +} + + class ExplorerWindow : Window { text = title; @@ -62,6 +144,7 @@ class ExplorerWindow : Window minClientSize = { 600, 300 }; nativeDecorations = true; tabCycle = true; + icon = { ":explorerIcon.png" }; /* bool userMode; @@ -82,17 +165,20 @@ class ExplorerWindow : Window Menu fileMenu { menu, "File", f }; Menu windowMenu { menu, "Window", w }; - MenuItem itemNewWindow - { - windowMenu, "New Window", n; - - bool NotifySelect(MenuItem selection, Modifiers mods) - { - ExplorerWindow { }.Create(); - return true; - } - }; + MenuItem itemNewWindow { windowMenu, "New Window", n, NotifySelect = NewWindow_NotifySelect }; + bool NewWindow_NotifySelect(MenuItem selection, Modifiers mods) + { + //ExplorerWindow { }.Create(); + ExplorerWindow w { };//.Create(); + w.location = location; + w.view.autoLoad = true; + w.Create(); + w.Activate(); // tocheck: not working? + return true; + } + +#if 0 IconBag iconBag { //window = guiApp.desktop; @@ -100,47 +186,9 @@ class ExplorerWindow : Window alphaBlend = true; iconNames = [ - "<:ecere>emblems/unreadable.png", /* none */ - - "<:ecere>actions/windowNew.png", /* newWindow */ - "<:ecere>actions/goPrevious.png", /* goBack */ - "<:ecere>actions/goNext.png", /* goForward */ - "<:ecere>actions/goUp.png", /* goUp */ - "<:ecere>actions/goHome.png", /* goHome */ - "<:ecere>mimeTypes/file.png", /* newFile */ - "<:ecere>actions/folderNew.png", /* newFolder */ - - ":browse.png", /* browse */ - - ":panel-tree.png", /* panelTree */ - "<:ecere>actions/editFind.png", /* panelSearch */ - - "", /* addressBar */ - - "<:ecere>actions/viewRefresh.png", /* refresh */ - - ":view-list.png", /* viewList */ - ":view-details.png", /* viewDetails */ - ":view-icons.png", /* viewIcons */ - ":view-cards.png", /* viewCards */ - ":view-showcase-right.png", /* viewShowcase */ - ":panel-tree.png", /* viewTree */ - ":view-custom.png", /* viewCustom */ - - "<:ecere>mimeTypes/image.png", /* previewPictures */ - - "", /* searchInFileName */ - "<:ecere>emblems/unreadable.png", /* inFileNameMatchCase */ - "<:ecere>emblems/unreadable.png", /* inFileNameMatchWord */ - "", /* searchInFileContent */ - "<:ecere>emblems/unreadable.png", /* inFileContentMatchCase */ - "<:ecere>emblems/unreadable.png", /* inFileContentMatchWord */ - ":browse.png", /* searchInSubDirs */ - "<:ecere>actions/editFind.png", /* searchStart */ - "<:ecere>emblems/unreadable.png", /* searchStop */ - "<:ecere>emblems/unreadable.png" /* hasHeader */ ]; }; +#endif Stacker stack { @@ -151,6 +199,9 @@ class ExplorerWindow : Window opacity = 0.0f; tabCycle = true; + flipper = panels; + flipSpring = true; + anchor = { left = 0, top = 0, right = 0, bottom = 0 }; //moveable = false; }; @@ -164,28 +215,37 @@ class ExplorerWindow : Window background = toolBarBackgroundColor; tabCycle = true; - iconBag = iconBag; + //iconBag = iconBag; + inactive = false; + + flipper = addressBar; + flipSpring = true; - void NotifyToolClick(ToolButton button) +#if 0 + bool NotifyClicked(Button button, int x, int y, Modifiers mods) { + bool noViewActivation = false; ExplorerToolId id = (ExplorerToolId)button.id; switch(id) { case none: break; case newWindow: - ExplorerWindow { }.Create(); + { + noViewActivation = true; + NewWindow_NotifySelect(null, 0); break; + } case goBack: case goForward: historyIndex += id == goBack ? -1 : 1; - GoToHistoryIndex(false, false, false); + GoToHistoryIndex(/*false, false, */false); break; case goHome: { char * home = getenv("HOME"); if(home && home[0] && FileExists(home).isDirectory) - GoTo(home, false, false); + location = home;//GoTo(home, false, false); break; } case goUp: @@ -198,17 +258,15 @@ class ExplorerWindow : Window newPath[0] = '/'; newPath[1] = 0; } - GoTo(newPath, false, false); + location = newPath;//GoTo(newPath, false, false); delete newPath; break; } case newFile: - if(CreateNewFileDialog { master = this, parent = parent, currentDirectory = view.path }.Modal() == ok ) - Refresh(); + NewFile(view, null, 0); break; case newFolder: - if(CreateDirectoryDialog { master = this, parent = parent, currentDirectory = view.path }.Modal() == ok ) - Refresh(); + NewFolder(view, null, 0); break; case panelTree: SearchStop(); @@ -219,7 +277,7 @@ class ExplorerWindow : Window { split.rightPane = view; view.anchor = { top = 0, bottom = 0, right = 0 }; - GoTo(addressBar.path, false, false); + location = addressBar.path;//GoTo(addressBar.path, false, false); ReadyTree(); } else @@ -228,7 +286,6 @@ class ExplorerWindow : Window view.anchor = { left = 2, top = 0, bottom = 0, right = 0 }; } //search.visible = !button.checked; - panels.size = { panels.size.w, panels.size.h }; // TOFIX : another Stacker fix needed break; case panelSearch: ToggleSearchMode(button.checked); @@ -250,9 +307,8 @@ class ExplorerWindow : Window //split.rightPane = null; //view.anchor = { left = 2, top = 0, bottom = 0, right = 0 }; - GoTo(addressBar.path, false, false); + location = addressBar.path;//GoTo(addressBar.path, false, false); } - //panels.size = { panels.size.w, panels.size.h }; // TOFIX : another Stacker fix needed break; case refresh: Refresh(); @@ -290,29 +346,65 @@ class ExplorerWindow : Window view.hasHeader ^= true; break; } - view.Activate(); + if(!noViewActivation) + view.Activate(); + return true; } +#endif }; Window { toolBar, size = { w = 8 }, inactive = true }; - ToolButton goBack { toolBar, this, id = ExplorerToolId::goBack, hotKey = { left, alt = true }, disabled = true }; + IconToolButton goBack { toolBar, this, icon = goBack, hotKey = { left, alt = true }, toolTip = "Back", disabled = true; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + historyIndex += -1; + GoToHistoryIndex(/*false, false, */false); + view.Activate(); + return true; + } + }; Window { toolBar, size = { w = 2 }, inactive = true }; - ToolButton goForward { toolBar, this, id = ExplorerToolId::goForward, hotKey = { right, alt = true }, disabled = true }; + IconToolButton goForward { toolBar, this, icon = goForward, hotKey = { right, alt = true }, toolTip = "Forward", disabled = true; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + historyIndex += 1; + GoToHistoryIndex(/*false, false, */false); + view.Activate(); + return true; + } + }; Window { toolBar, size = { w = 2 }, inactive = true }; - ToolButton refresh { toolBar, this, id = ExplorerToolId::refresh, hotKey = { r, ctrl = true } }; + IconToolButton refresh { toolBar, this, icon = refresh, hotKey = { r, ctrl = true }, toolTip = "Refresh"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + Refresh(); + view.Activate(); + return true; + } + }; Window { toolBar, size = { w = 2 }, inactive = true }; - ToolButton goHome { toolBar, this, id = ExplorerToolId::goHome, hotKey = { h, ctrl = true } }; + IconToolButton goHome { toolBar, this, icon = goHome, hotKey = { h, ctrl = true }, toolTip = "Go Home"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + char * home = getenv("HOME"); + if(home && home[0] && FileExists(home).isDirectory) + location = home;//GoTo(home, false, false); + view.Activate(); + return true; + } + }; Window { toolBar, size = { w = 8 }, inactive = true }; PathBox addressBar { toolBar, this; - size = { 300, 22 }, id = ExplorerToolId::addressBar; + size = { 300, 22 };//, icon = addressBar; typeExpected = directory; borderStyle = deep; background = toolBarBackgroundColor; foreground = toolBarForegroundColor; selectionColor = selectionColor; selectionText = selectionText; + toolTip = "Location"; bool OnKeyDown(Key key, unichar ch) { @@ -326,47 +418,185 @@ class ExplorerWindow : Window bool NotifyModified(PathBox pathBox) { - GoTo(pathBox.path, false, false); + location = pathBox.path;//GoTo(pathBox.path, false, false); return true; } }; - FlipStacker { toolBar, spring = previous }; + //FlipStacker { toolBar, spring = previous }; Window { toolBar, size = { w = 8 }, inactive = true }; - ToolButton newFile { toolBar, this, id = ExplorerToolId::newFile, hotKey = { n, ctrl = true } }; + IconToolButton newFile { toolBar, this, icon = newFile, hotKey = { l, ctrl = true }, toolTip = "Create New File"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + NewFile(view, null, 0); + view.Activate(); + return true; + } + }; Window { toolBar, size = { w = 2 }, inactive = true }; - ToolButton newFolder { toolBar, this, id = ExplorerToolId::newFolder, hotKey = { d, ctrl = true } }; + IconToolButton newFolder { toolBar, this, icon = newFolder, hotKey = { d, ctrl = true }, toolTip = "Create New Folder"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + NewFolder(view, null, 0); + view.Activate(); + return true; + } + }; Window { toolBar, size = { w = 8 }, inactive = true }; - ToolButton goUp { toolBar, this, id = ExplorerToolId::goUp, hotKey = { up, alt = true } }; + IconToolButton goUp { toolBar, this, icon = goUp, hotKey = { up, alt = true }, toolTip = "Go to Parent Folder"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + char * path = view.path; + char * newPath = new char[strlen(path)+1]; + StripLastDirectory(path, newPath); + if(!newPath[0]) + { + newPath[0] = '/'; + newPath[1] = 0; + } + location = newPath;//GoTo(newPath, false, false); + delete newPath; + view.Activate(); + return true; + } + }; Window { toolBar, size = { w = 8 }, inactive = true }; - //GroupToggleToolButton selectedPanel; - ToggleToolButton panelTree { toolBar, this, id = ExplorerToolId::panelTree, hotKey = { t, ctrl = true }/*, selected = &selectedPanel*//*, checked = true*/ }; - ToggleToolButton panelSearch { toolBar, this, id = ExplorerToolId::panelSearch, hotKey = { f, ctrl = true }/*, selected = &selectedPanel*/ }; + //GroupToggleIconToolButton selectedPanel; + ToggleIconToolButton panelTree { toolBar, this, icon = panelTree/*, selected = &selectedPanel*//*, checked = true*/, toolTip = "Toggle Tree Panel"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + SearchStop(); + //ToggleSearchMode(false); + tree.visible = button.checked; + split.visible = button.checked; + if(button.checked) + { + split.rightPane = view; + view.anchor = { top = 0, bottom = 0, right = 0 }; + location = addressBar.path;//GoTo(addressBar.path, false, false); + ReadyTree(); + } + else + { + split.rightPane = null; + view.anchor = { left = 2, top = 0, bottom = 0, right = 0 }; + } + //search.visible = !button.checked; + view.Activate(); + return true; + } + }; + ToggleIconToolButton panelSearch { toolBar, this, icon = panelSearch, hotKey = { f, ctrl = true }/*, selected = &selectedPanel*/, toolTip = "Toggle Search"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + ToggleSearchMode(button.checked); + + //tree.visible = false; //!button.checked; + //split.visible = false; //!button.checked; + if(button.checked) + { + /*split.rightPane = view; + view.anchor = { top = 0, bottom = 0, right = 0 };*/ + //split.rightPane = null; + //view.anchor = { left = 2, top = 0, bottom = 0, right = 0 }; + + //SearchStart(); + searchInFileName.Activate(); + } + else + { + //split.rightPane = null; + //view.anchor = { left = 2, top = 0, bottom = 0, right = 0 }; + + location = addressBar.path;//GoTo(addressBar.path, false, false); + } + view.Activate(); + return true; + } + }; //selectedPanel = panelTree; Window { toolBar, size = { w = 8 }, inactive = true }; - /*OptionToolButton selectedView; - OptionToolButton viewList { toolBar, this, id = ExplorerToolId::viewList, selected = &selectedView, checked = true }; - OptionToolButton viewDetails { toolBar, this, id = ExplorerToolId::viewDetails, selected = &selectedView }; - OptionToolButton viewIcons { toolBar, this, id = ExplorerToolId::viewIcons, selected = &selectedView }; - OptionToolButton viewTiles { toolBar, this, id = ExplorerToolId::viewCards, selected = &selectedView }; - OptionToolButton viewShowcase { toolBar, this, id = ExplorerToolId::viewShowcase, selected = &selectedView }; - OptionToolButton viewTree { toolBar, this, id = ExplorerToolId::viewTree, selected = &selectedView }; + /*OptionIconToolButton selectedView; + OptionIconToolButton viewList { toolBar, this, icon = viewList, selected = &selectedView, checked = true }; + OptionIconToolButton viewDetails { toolBar, this, icon = viewDetails, selected = &selectedView }; + OptionIconToolButton viewIcons { toolBar, this, icon = viewIcons, selected = &selectedView }; + OptionIconToolButton viewTiles { toolBar, this, icon = viewCards, selected = &selectedView }; + OptionIconToolButton viewShowcase { toolBar, this, icon = viewShowcase, selected = &selectedView }; + OptionIconToolButton viewTree { toolBar, this, icon = viewTree, selected = &selectedView }; selectedView = viewList;*/ - //ToggleToolButton viewList { toolBar, this, id = ExplorerToolId::viewList, checked = true }; - ToggleToolButton viewDetails { toolBar, this, id = ExplorerToolId::viewDetails }; - //ToggleToolButton viewIcons { toolBar, this, id = ExplorerToolId::viewIcons }; - //ToggleToolButton viewTiles { toolBar, this, id = ExplorerToolId::viewCards }; - ToggleToolButton viewShowcase { toolBar, this, id = ExplorerToolId::viewShowcase }; - ToggleToolButton viewTree { toolBar, this, id = ExplorerToolId::viewTree }; + //ToggleIconToolButton viewList { toolBar, this, icon = viewList, checked = true }; + /*case viewList: + view.details = false; + view.treeBranches = false; + view.Refresh(); + break;*/ + ToggleIconToolButton viewDetails { toolBar, this, icon = viewDetails, toolTip = "Toggle Listing Details"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + view.details = true; + view.treeBranches = false; + view.Refresh(); + view.Activate(); + return true; + } + }; + /*case viewCards: + //SwitchViews(toolId); + view.details = false; + view.treeBranches = false; + view.Refresh(); + break;*/ + //ToggleIconToolButton viewIcons { toolBar, this, icon = viewIcons }; + //ToggleIconToolButton viewTiles { toolBar, this, icon = viewCards }; + ToggleIconToolButton viewShowcase { toolBar, this, icon = viewShowcase, toolTip = "Toggle Showcase"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + view.preview = button.checked; + view.Refresh(); + view.Activate(); + return true; + } + }; + ToggleIconToolButton viewTree { toolBar, this, icon = viewTree, hotKey = { t, ctrl = true }, toolTip = "Toggle Tree Listing"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + view.treeBranches = button.checked; + view.Refresh(); + view.Activate(); + return true; + } + }; Window { toolBar, size = { w = 8 }, inactive = true }; - ToggleToolButton previewPictures { toolBar, this, id = ExplorerToolId::previewPictures }; + ToggleIconToolButton previewPictures { toolBar, this, icon = previewPictures, toolTip = "Toggle Picture Preview"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + view.previewPictures = button.checked; + view.Refresh(); + view.Activate(); + return true; + } + }; Window { toolBar, size = { w = 8 }, inactive = true }; - ToolButton hasHeader { toolBar, this, id = ExplorerToolId::hasHeader }; + ToggleIconToolButton hasHeader { toolBar, this, icon = hasHeader, toolTip = "Toggle Listing Header"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + view.hasHeader ^= true; + view.Activate(); + return true; + } + }; Window { toolBar, size = { w = 8 }, inactive = true }; - ToolButton newWindow { toolBar, this, id = ExplorerToolId::newWindow, hotKey = { w, ctrl = true } }; + IconToolButton newWindow { toolBar, this, icon = newWindow, hotKey = { w, ctrl = true }, toolTip = "Open New Window"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + NewWindow_NotifySelect(null, 0); + return true; + } + }; Window { toolBar, size = { w = 8 }, inactive = true }; +#if 0 /*void OnDestroy() { iconBag.window = null; @@ -383,6 +613,7 @@ class ExplorerWindow : Window { iconBag.Unload(); } +#endif Stacker panels { @@ -399,7 +630,7 @@ class ExplorerWindow : Window //size = { h = 400 }; }; - FlipStacker flipStack { stack, spring = previous }; + //FlipStacker flipStack { stack, spring = previous }; //Window searchSpace { stack, size = { h = 32 }, background = toolBarBackgroundColor, inactive = true, opacity = 0.0f }; @@ -412,9 +643,14 @@ class ExplorerWindow : Window borderStyle = none; background = toolBarBackgroundColor; tabCycle = true; - iconBag = iconBag; + //iconBag = iconBag; + inactive = false; - void NotifyToolClick(ToolButton button) + flipper = searchInFileContent; + flipSpring = true; + +#if 0 + bool NotifyClicked(Button button, int x, int y, Modifiers mods) { ExplorerToolId id = (ExplorerToolId)button.id; switch(id) @@ -429,23 +665,26 @@ class ExplorerWindow : Window break; } view.Activate(); + return true; } +#endif }; - Window { searchBar, size = { w = 8 }, inactive = true }; - Label { searchBar, this, labeledWindow = searchInFileName}; - Window { searchBar, size = { w = 2 }, inactive = true }; - EditBox searchInFileName + //Label { searchBar, this, labeledWindow = searchInFileName}; + //Window { searchBar, size = { w = 2 }, inactive = true }; + SearchBox searchInFileName { searchBar, this; - size = { 200, 22 }, id = ExplorerToolId::searchInFileName; + size = { 200, 22 };//, icon = searchInFileName; borderStyle = deep; background = toolBarBackgroundColor; foreground = toolBarForegroundColor; selectionColor = selectionColor; selectionText = selectionText; - text = "File Name:"; + //text = "File Name:"; + caption = "Search File Names"; + toolTip = "Search File Names"; bool NotifyKeyDown(EditBox editBox, Key key, unichar ch) { @@ -465,22 +704,34 @@ class ExplorerWindow : Window }; Window { searchBar, size = { w = 2 }, inactive = true }; #ifndef __WIN32__ - ToggleToolButton inFileNameMatchCase { searchBar, this, id = ExplorerToolId::inFileNameMatchCase }; + ToggleIconToolButton inFileNameMatchCase { searchBar, this, icon = inFileNameMatchCase, toolTip = "Toggle Match Case"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + return true; + } + }; #endif - ToggleToolButton inFileNameMatchWord { searchBar, this, id = ExplorerToolId::inFileNameMatchWord }; + ToggleIconToolButton inFileNameMatchWord { searchBar, this, icon = inFileNameMatchWord, toolTip = "Toggle Match Whole Word"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + return true; + } + }; Window { searchBar, size = { w = 8 }, inactive = true }; - Label { searchBar, this, labeledWindow = searchInFileContent}; - Window { searchBar, size = { w = 2 }, inactive = true }; - EditBox searchInFileContent + //Label { searchBar, this, labeledWindow = searchInFileContent}; + //Window { searchBar, size = { w = 2 }, inactive = true }; + SearchBox searchInFileContent { searchBar, this; - size = { 200, 22 }, id = ExplorerToolId::searchInFileContent; + size = { 200, 22 };//, icon = searchInFileContent; borderStyle = deep; background = toolBarBackgroundColor; foreground = toolBarForegroundColor; selectionColor = selectionColor; selectionText = selectionText; - text = "File Content:"; + //text = "File Content:"; + caption = "Search File Contents"; + toolTip = "Search File Contents"; bool NotifyKeyDown(EditBox editBox, Key key, unichar ch) { @@ -496,15 +747,44 @@ class ExplorerWindow : Window return true; }*/ }; - FlipStacker { searchBar, spring = previous }; - ToggleToolButton inFileContentMatchCase { searchBar, this, id = ExplorerToolId::inFileContentMatchCase }; - ToggleToolButton inFileContentMatchWord { searchBar, this, id = ExplorerToolId::inFileContentMatchWord }; + //FlipStacker { searchBar, spring = previous }; + ToggleIconToolButton inFileContentMatchCase { searchBar, this, icon = inFileContentMatchCase, toolTip = "Toggle Match Case"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + return true; + } + }; + ToggleIconToolButton inFileContentMatchWord { searchBar, this, icon = inFileContentMatchWord, toolTip = "Toggle Match Whole Word"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + return true; + } + }; Window { searchBar, size = { w = 8 }, inactive = true }; - ToggleToolButton searchInSubDirs { searchBar, this, id = ExplorerToolId::searchInSubDirs, checked = true }; + ToggleIconToolButton searchInSubDirs { searchBar, this, icon = searchInSubDirs, checked = true, toolTip = "Toggle Include Subfolders"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + return true; + } + }; Window { searchBar, size = { w = 8 }, inactive = true }; - ToolButton searchStart { searchBar, this, id = ExplorerToolId::searchStart, hotKey = { s, ctrl = true } }; + IconToolButton searchStart { searchBar, this, icon = searchStart, hotKey = { s, ctrl = true }, toolTip = "Start Search"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + SearchStart(); + view.Activate(); + return true; + } + }; Window { searchBar, size = { w = 8 }, inactive = true }; - ToolButton searchStop { searchBar, this, id = ExplorerToolId::searchStop, hotKey = { escape }, disabled = true; }; + IconToolButton searchStop { searchBar, this, icon = searchStop, hotKey = { escape }, disabled = true, toolTip = "Stop Search"; + bool NotifyClicked(Button button, int x, int y, Modifiers mods) + { + SearchStop(); + view.Activate(); + return true; + } + }; Window { searchBar, size = { w = 8 }, inactive = true }; @@ -553,7 +833,7 @@ class ExplorerWindow : Window { char p[MAX_LOCATION]; node.GetPath(p); - GoTo(node.path, false, true); + location = node.path;//GoTo(node.path, false, true); } } return true; @@ -575,6 +855,7 @@ class ExplorerWindow : Window split = 300; }; + //FileSystemCache testCache; FileSystemBox view { panels, this; @@ -593,6 +874,15 @@ class ExplorerWindow : Window multiSelect = true; autoLoad = false; + //iteratorClass = class(FileSystemCacheIterator); + //iteratorClass = class(FileSystemIterator); + + bool NotifyIteratorInit(FileSystemBox box, FileSystemIterator fileSystemIterator) + { + //((FileSystemCacheIterator)fileSystemIterator).cache = testCache; + //((FileSystemIterator)fileSystemIterator) + } + bool NotifyNodeOpen(FileSystemBox box, FileSystemBoxSelection selection) { FileSystemNode node = selection.node; @@ -601,26 +891,26 @@ class ExplorerWindow : Window if(node.type.isFile) { char path[MAX_LOCATION]; - #ifndef __WIN32__ - char command[MAX_LOCATION]; - node.GetPath(path); - /*_FileType t = node.type; - if(t == ewsFile || t == epjFile || - t == ecFile || t == ehFile || - t == cppFile || t == hppFile || - t == cFile || t == hFile || - t == textFile || t == webFile)*/ - sprintf(command, "gnome-open \"%s\"", path); - /*else - sprintf(command, "%s", path);*/ - Execute(command); - #else + //#ifndef __WIN32__ + // char command[MAX_LOCATION]; + // node.GetPath(path); + // /*_FileType t = node.type; + // if(t == ewsFile || t == epjFile || + // t == ecFile || t == ehFile || + // t == cppFile || t == hppFile || + // t == cFile || t == hFile || + // t == textFile || t == webFile)*/ + // sprintf(command, "gnome-open \"%s\"", path); + // /*else + // sprintf(command, "%s", path);*/ + // Execute(command); + //#else node.GetPath(path); ShellOpen(path); - #endif + //#endif } else if(node.type.isFolder) - GoTo(node.path, true, false); + location = node.path;//GoTo(node.path, true, false); } UpdateHistoryItem(selection); return true; @@ -628,7 +918,110 @@ class ExplorerWindow : Window bool NotifyNodeSelect(FileSystemBox box, FileSystemBoxSelection selection) { - UpdateHistoryItem(selection); + if(!comparedLocations) + UpdateHistoryItem(selection); + return true; + } + + bool NotifyNodeMenu(FileSystemBox box, Menu menu, FileSystemBoxSelection selection) + { + char * text; + char * itemString; + FileSystemNode node = selection.node; + + //PrintLn(node.name); + if(box.selection.nodes.count == 1) + itemString = node.name; + else + itemString = PrintString(box.selection.nodes.count, " items"); + text = PrintString("Open ", itemString); + MenuItem { menu, text, o, disabled = false; + NotifySelect = FileSystemBox::MenuOpen + /*bool FileSystemBox::NotifySelect(MenuItem selection, Modifiers mods) + { + for(node : this.selection.nodes) + { + // todo: somehow bring MenuOpen / OpenNode behavior ourside + } + return true; + }*/ + }; + //delete text; + if(node.type == folder) + { + text = PrintString("Open ", itemString, " in another window"); + MenuItem { menu, text, w, disabled = false; + bool FileSystemBox::NotifySelect(MenuItem selection, Modifiers mods) + { + for(node : this.selection.nodes) + { + ExplorerWindow ew { /*location = this.selection.node.path*/ };//.Create(); + ew.Create(); + ew.location = /*this.selection.*/node.path; + } + return true; + } + }; + //delete text; + MenuDivider { menu }; + text = PrintString("Open ", itemString, " in shell"); + MenuItem { menu, text, w, disabled = false; + bool FileSystemBox::NotifySelect(MenuItem selection, Modifiers mods) + { + for(node : this.selection.nodes) + { + if(node.stats.attribs) + ShellOpen(/*this.selection.*/node.path); + } + return true; + } + }; + //delete text; + MenuDivider { menu }; + MenuItem { menu, "Create File", w, NotifySelect = NewFile, disabled = false }; + MenuItem { menu, "Create Folder", w, NotifySelect = NewFolder, disabled = false }; + } + if(panelSearch.checked) + { + MenuDivider { menu }; + MenuItem { menu, "Open Containing Folder", f, NotifySelect = FileSystemBox::MenuOpen, disabled = false; + bool FileSystemBox::NotifySelect(MenuItem selection, Modifiers mods) + { + char path[MAX_LOCATION]; + StripLastDirectory(this.selection.node.path, path); + this.path = path; + return true; + } + }; + MenuItem { menu, "Open Containing Folder in another window", r, NotifySelect = FileSystemBox::MenuOpen, disabled = false; + bool FileSystemBox::NotifySelect(MenuItem selection, Modifiers mods) + { + char path[MAX_LOCATION]; + ExplorerWindow ew { /*location = this.selection.node.path*/ };//.Create(); + ew.Create(); + StripLastDirectory(this.selection.node.path, path); + ew.location = path; + return true; + } + }; + delete itemString; + } + if(node.isListItem/* && TODO: unless node is at root location*/) + { + MenuDivider { menu }; + MenuItem { menu, "Replace by Parent\tCtrl+R", r, NotifySelect = FileSystemBox::MenuReplaceListItemByContainingDir, disabled = false }; + } + else if(box.mode == list) + { + MenuDivider { menu }; + MenuItem { menu, "Replace List Item\tCtrl+R", r, NotifySelect = FileSystemBox::MenuReplaceListItemByChild, disabled = false }; + } + MenuDivider { menu }; + MenuItem { menu, "Cut\tCtrl+X", t, NotifySelect = null, disabled = false }; + MenuItem { menu, "Copy\tCtrl+C", c, NotifySelect = null, disabled = false }; + MenuItem { menu, "Paste\tCtrl+V", p, NotifySelect = null, disabled = false /*!clipboard*/ }; + MenuItem { menu, "Delete\tDel", d, NotifySelect = null, disabled = false }; + //MenuDivider { menu }; return true; } @@ -668,7 +1061,6 @@ class ExplorerWindow : Window //searchSpace.visible = !inSearch; searchBar.visible = inSearch; history[historyIndex].inSearch = inSearch; - size = { size.w, size.h }; view.pathColumn = inSearch; /*if(inSearch) searchThread.InitResults();*/ @@ -701,43 +1093,88 @@ class ExplorerWindow : Window } } - void GoTo(char * location, bool viewIsAtLocation, bool treeIsAtLocation) + //void NewFile() + bool FileSystemBox::NewFile(MenuItem selection, Modifiers mods) { - HistoryItem item = null; - if(!history.count || fstrcmp(history[historyIndex].path, location)) + if(master._class == class(ExplorerWindow)) { - int c; - for(c = 0; c < history.count; c++) - if(!fstrcmp(history[c].path, location)) - break; - if(c == history.count) + ExplorerWindow ew = (ExplorerWindow)master; + if(CreateNewFileDialog { /*master = */ew/*, parent = parent*/, currentDirectory = selection ? ew.view.selection.node.path : ew.view.path }.Modal() == ok ) + ew.Refresh(); + } + } + + //void NewFolder() + bool FileSystemBox::NewFolder(MenuItem selection, Modifiers mods) + { + if(master._class == class(ExplorerWindow)) + { + ExplorerWindow ew = (ExplorerWindow)master; + if(CreateDirectoryDialog { /*master = */ew/*, parent = parent*/, currentDirectory = selection ? ew.view.selection.node.path : ew.view.path }.Modal() == ok ) + ew.Refresh(); + } + } + + //void GoTo(char * location/*, bool viewIsAtLocation, bool treeIsAtLocation*/) + property char * location + { + set + { + HistoryItem item = null; + if(!history.count || fstrcmp(history[historyIndex].path, value)) { - item = { path = CopyString(location) }; - if(history.count) + int c; + for(c = 0; c < history.count; c++) + if(!fstrcmp(history[c].path, value)) + break; + if(c == history.count) { - while(historyIndex < history.count-1) + item = { path = CopyString(value) }; + if(history.count) { - delete history[history.count-1].path; - history.count--; + while(historyIndex < history.count-1) + { + delete history[history.count-1].path; + history.count--; + } } + history.Add(item); + historyIndex = history.count-1; } - history.Add(item); - historyIndex = history.count-1; + else + historyIndex = c; } - else - historyIndex = c; + GoToHistoryIndex(/*viewIsAtLocation, treeIsAtLocation, */item != null); + } + get { return view.path; } + } + + property Array comparedLocations + { + set + { + // dd + view.comparedPaths = value; + } + get + { + return view.comparedPaths; } - GoToHistoryIndex(viewIsAtLocation, treeIsAtLocation, item != null); } - void GoToHistoryIndex(bool viewIsAtLocation, bool treeIsAtLocation, bool updateHistoryItem) + void GoToHistoryIndex(/*bool viewIsAtLocation, bool treeIsAtLocation, */bool updateHistoryItem) { + bool viewIsAtLocation; + bool treeIsAtLocation; HistoryItem item = history[historyIndex]; goBack.disabled = historyIndex == 0; goForward.disabled = historyIndex == history.count-1; goUp.disabled = !fstrcmp(item.path, "/"); + viewIsAtLocation = !fstrcmp(item.path, tree.path); + treeIsAtLocation = !fstrcmp(item.path, view.path); + if(!viewIsAtLocation) { if(item.inSearch != panelSearch.checked) @@ -752,7 +1189,8 @@ class ExplorerWindow : Window } else*/ { - view.path = item.path; + if(fstrcmp(view.path, item.path)) + view.path = item.path; item.holdRecordingSelection = true; view.SelectMultipleByPath(item.selection); } @@ -937,7 +1375,7 @@ class ExplorerWindow : Window /*void SearchLocation(char * location) { - GoTo(location); + location = location;//GoTo(location); search.location.editBox.contents = location; }*/ diff --git a/explorer/tests/t1FileSystemCache.ec b/explorer/tests/t1FileSystemCache.ec new file mode 100644 index 0000000..cbdac5b --- /dev/null +++ b/explorer/tests/t1FileSystemCache.ec @@ -0,0 +1,13 @@ +import "ecere" +import "EDE" + +class t1 : Application +{ + void Main() + { + DummyFileSystemCacheWindow dw { }; + //FileSystemCache cache; + /*cache = */FileSystemCache::Cache("somepath", false, dw); + delete dw; + } +} diff --git a/libede/EDE.epj b/libede/EDE.epj index 1dd2ea0..7fb0b90 100644 --- a/libede/EDE.epj +++ b/libede/EDE.epj @@ -1,8 +1,6 @@ { "Version" : 0.2, "ModuleName" : "EDE", - "Description" : "Ecere Desktop Environment", - "License" : "", "Options" : { "Warnings" : "All", "DefaultNameSpace" : "ede", @@ -46,12 +44,274 @@ "Files" : [ "FileSystemBox.ec", "FileSystemSearch.ec", - "CreateNewFileDialog.ec" + "CreateNewFileDialog.ec", + "FileSystemCache.ec", + "FileSystemIterator.ec" ] } ], - "ResourcesPath" : "", + "ResourcesPath" : "res", "Resources" : [ - - ] -} \ No newline at end of file + { + "Folder" : "actions", + "Files" : [ + "address-book-new.png", + "appointment-new.png", + "bookmark-new.png", + "contact-new.png", + "document-new.png", + "document-open.png", + "document-print-preview.png", + "document-print.png", + "document-properties.png", + "document-save-as.png", + "document-save.png", + "edit-clear.png", + "edit-copy.png", + "edit-cut.png", + "edit-delete.png", + "edit-find-replace.png", + "edit-paste.png", + "edit-redo.png", + "edit-select-all.png", + "edit-undo.png", + "folder-new.png", + "format-indent-less.png", + "format-indent-more.png", + "format-justify-center.png", + "format-justify-fill.png", + "format-justify-left.png", + "format-justify-right.png", + "format-text-bold.png", + "format-text-italic.png", + "format-text-strikethrough.png", + "format-text-underline.png", + "go-bottom.png", + "go-down.png", + "go-home.png", + "go-jump.png", + "go-last.png", + "go-next.png", + "go-previous.png", + "go-top.png", + "go-up.png", + "list-add.png", + "list-remove.png", + "mail-forward.png", + "mail-mark-junk.png", + "mail-mark-not-junk.png", + "mail-message-new.png", + "mail-reply-all.png", + "mail-reply-sender.png", + "mail-send-receive.png", + "media-playback-pause.png", + "media-playback-start.png", + "media-playback-stop.png", + "media-record.png", + "media-seek-backward.png", + "media-seek-forward.png", + "media-skip-backward.png", + "media-skip-forward.png", + "process-stop.png", + "system-lock-screen.png", + "system-log-out.png", + "system-search.png", + "system-shutdown.png", + "tab-new.png", + "view-fullscreen.png", + "view-refresh.png", + "window-new.png", + "edit-find.png", + "go-first.png", + "media-eject.png" + ] + }, + { + "Folder" : "apps", + "Files" : [ + "preferences-desktop-keyboard-shortcuts.png", + "accessories-calculator.png", + "accessories-character-map.png", + "accessories-text-editor.png", + "help-browser.png", + "internet-group-chat.png", + "internet-mail.png", + "internet-news-reader.png", + "internet-web-browser.png", + "office-calendar.png", + "preferences-desktop-accessibility.png", + "preferences-desktop-assistive-technology.png", + "preferences-desktop-font.png", + "preferences-desktop-locale.png", + "preferences-desktop-multimedia.png", + "preferences-desktop-remote-desktop.png", + "preferences-desktop-screensaver.png", + "preferences-desktop-theme.png", + "preferences-desktop-wallpaper.png", + "preferences-system-network-proxy.png", + "preferences-system-session.png", + "preferences-system-windows.png", + "system-file-manager.png", + "system-installer.png", + "system-software-update.png", + "system-users.png", + "utilities-system-monitor.png", + "utilities-terminal.png" + ] + }, + { + "Folder" : "categories", + "Files" : [ + "applications-accessories.png", + "applications-development.png", + "applications-games.png", + "applications-graphics.png", + "applications-internet.png", + "applications-multimedia.png", + "applications-office.png", + "applications-other.png", + "applications-system.png", + "preferences-desktop-peripherals.png", + "preferences-desktop.png", + "preferences-system.png" + ] + }, + { + "Folder" : "devices", + "Files" : [ + "audio-card.png", + "audio-input-microphone.png", + "battery.png", + "camera-photo.png", + "camera-video.png", + "computer.png", + "drive-harddisk.png", + "drive-optical.png", + "drive-removable-media.png", + "input-gaming.png", + "input-keyboard.png", + "input-mouse.png", + "media-flash.png", + "media-floppy.png", + "media-optical.png", + "multimedia-player.png", + "network-wired.png", + "network-wireless.png", + "printer.png", + "video-display.png" + ] + }, + { + "Folder" : "emblems", + "Files" : [ + "emblem-favorite.png", + "emblem-important.png", + "emblem-photos.png", + "emblem-readonly.png", + "emblem-symbolic-link.png", + "emblem-system.png", + "emblem-unreadable.png" + ] + }, + { + "Folder" : "emotes", + "Files" : [ + "face-angel.png", + "face-crying.png", + "face-devilish.png", + "face-glasses.png", + "face-grin.png", + "face-kiss.png", + "face-monkey.png", + "face-plain.png", + "face-sad.png", + "face-smile-big.png", + "face-smile.png", + "face-surprise.png", + "face-wink.png" + ] + }, + { + "Folder" : "mimetypes", + "Files" : [ + "application-certificate.png", + "application-x-executable.png", + "audio-x-generic.png", + "font-x-generic.png", + "image-x-generic.png", + "package-x-generic.png", + "text-html.png", + "text-x-generic-template.png", + "text-x-generic.png", + "text-x-script.png", + "video-x-generic.png", + "x-office-address-book.png", + "x-office-calendar.png", + "x-office-document-template.png", + "x-office-document.png", + "x-office-drawing-template.png", + "x-office-drawing.png", + "x-office-presentation-template.png", + "x-office-presentation.png", + "x-office-spreadsheet-template.png", + "x-office-spreadsheet.png" + ] + }, + { + "Folder" : "places", + "Files" : [ + "folder-remote.png", + "folder-saved-search.png", + "folder.png", + "network-server.png", + "network-workgroup.png", + "start-here.png", + "user-desktop.png", + "user-home.png", + "user-trash.png" + ] + }, + { + "Folder" : "status", + "Files" : [ + "network-error.png", + "audio-volume-high.png", + "audio-volume-low.png", + "audio-volume-medium.png", + "audio-volume-muted.png", + "battery-caution.png", + "dialog-error.png", + "dialog-information.png", + "dialog-warning.png", + "folder-drag-accept.png", + "folder-open.png", + "folder-visiting.png", + "image-loading.png", + "image-missing.png", + "mail-attachment.png", + "network-idle.png", + "network-offline.png", + "network-receive.png", + "network-transmit-receive.png", + "network-transmit.png", + "network-wireless-encrypted.png", + "printer-error.png", + "software-update-available.png", + "software-update-urgent.png", + "user-trash-full.png", + "weather-clear-night.png", + "weather-clear.png", + "weather-few-clouds-night.png", + "weather-few-clouds.png", + "weather-overcast.png", + "weather-severe-alert.png", + "weather-showers-scattered.png", + "weather-showers.png", + "weather-snow.png", + "weather-storm.png" + ] + }, + "emblem-not.png" + ], + "Description" : "Ecere Desktop Environment" +} diff --git a/libede/res/actions/address-book-new.png b/libede/res/actions/address-book-new.png new file mode 100644 index 0000000000000000000000000000000000000000..2098cfdf361b358ac382bea61a1d3cf8a66bdb65 GIT binary patch literal 796 zcmV+%1LOROP);y z08cd6u?+wK010qNS#tmY3ljhU3ljkVnw%H_000McNliru)d>#=G96HDdo}<705x<) zSad^gZEa<4bO0!0DIhX1Ff<@aVQY0_AX9W@X>Mh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00L-9L_t(I%axMNOH@%9#((GBd*;I#XGR@o)TU^xB$Ft@irNS5gf>A) z+wd<4Tqw9Of)+s#v=8^9+jc>Vz>THp7|dAeI5VR2eVzN&;^xPc1U+yz2hQ(2&-1>* z+8tA`7w*4_1Y6H4O&=Ti9;yvLE`on(W^Q(T8bG{w_v-D#oB4@rSMPzIqPVw4rZ~jT zK_@N}DLv2;u5Prb>@4#1&Lq*^vFExjor$4KBj}+AAOa-f8m00Qx#A%HTn*Jc#8Dcx zzBtWzlw@~^3J~obqgo|+PvC~bl+D$JXux){57bs^U>?a1$S|*9*4O}7EznmiSqX6k7L7#a7Fl~*hJBm@x zQ!1jIsR?zp?I3$1&UdOJ`ysJHBu>vwKAC(!4NUPLnwuRL a0KWk6OYuZdhej;`0000#>It74)E>!>k0}e?< zK~y-)Ws*xwTxA@^f8TfSyqLLnU?K?8$|G1EY%rF-;-axT+?a~Nx*!@hCPY`YH6|=g zV;Ucc#zal5HL;66@DWW+qb{%oO;sobI#?^(5$Q~)%nZZKy~7N5zR!(qD4yi(&N=@_ zj$jjx92gnWk{1QyVU!LCLwZ_@8&$P_=AF-8e`T{?Y%um{_;mNaM|-yS#tBEl2mx9{ zaka$ERDw&F=F@}2=Z^I}k_sYql2G!rxxsv4aCpEj8;Vt*gDAdsXNui%jCkNd8aq?X zjm?!eJ-u_)(7&t*w_Qm9jXpj&JYe5gE71N>h-mfgyVkVpEw*lJp?7bNXu~dpz`G5| zr=!3QdE~&z(C&RZc9yh9TUR43TjHC~L`sPe0y7XpvP7kH0;e<+1pR{q2DbOcSuSU3 zZEdEI|A+YFr$}dgcRx!ADqbI+=qHt|a`M9ms(A98snL7Fkua7QLMesMXHj;Ggz79t zUfPD=-pg}sIc(cP$QaUp5W~C4!qmsnp%?mt5~vpfnwlEO7xE~js40!(6gm3d??htV zOiWCmltOETVH%i*1f>PgWdbW&6Dzw_Iy%~^RMt>RQ7jhe?(XL0!>@Af+Er?`8d6HM zQfLiGG_W8A;-XV>So}MUQVP%W@H~%0hYpiSB*QJv%5E8_kF0oOuSo0O-88Yi?mS`RxAv zkNN-nW071T&;4y%2nK=#gCYFB05|{2kiWjd$q&xz*`?X{r{;f}1F{CdOmaH!H~m+Z zu4eW$HN>KAEv->#4UcH#K>>F>S)(m+mZ=t@1%`Q)zt z=kL2`>r-|9x)v#bCe_ X$s}Y37Q!~)00000NkvXXu0mjf?g64A literal 0 HcmV?d00001 diff --git a/libede/res/actions/bookmark-new.png b/libede/res/actions/bookmark-new.png new file mode 100644 index 0000000000000000000000000000000000000000..6cf6443a296cd908ac3e6dba8861b3955a919e20 GIT binary patch literal 686 zcmV;f0#W^mP)V2b4<9{` z4W?bEH4*2)p%WO^K~|PN4DJbz-B19Xot=HDREk}}AOqQlP{6GeSz2CZeqk8^Ti0+aMGC)N+?tE7I*2kT z7iaJ(DHxl9YPCwWvP!w+P;yo%J1bOH9o(|R*m#MVoKP(e;1%C7JDmov@~r^?5M`mY zg=zUvrVph}#4y<(OAy(27N^#Mm@!61O`tm30Eh_M^kdoqEIWwL--K!V(Wal=Y>rHJ z3QuBS9cON#3ElE?RsY?AVJHkkp|lBrQYMDd#N%<=+S)(_5sl{w01bd;S?l|~ks!6& z#+R`DimlQxLLd;R{~iy%ydP$GUFp4S*lrFdLVSEPgy(tW z^La9v%s)WG2)1nlaP9Ibu3S8cVHotk8s^!H&$PFJA!!NF>5eqt{x0-P6<4y_3RdG};I72S!%7 U#xj@WzW@LL07*qoM6N<$g6$wT&Hw-a literal 0 HcmV?d00001 diff --git a/libede/res/actions/contact-new.png b/libede/res/actions/contact-new.png new file mode 100644 index 0000000000000000000000000000000000000000..46573fff69011e6e19afcc5e8161da333af7b298 GIT binary patch literal 628 zcmV-)0*n2LP)Jed}|-^E>z4Yp9T&OuxanN3r9* zrs~v5#G6scEjUz8JyvYgga>b#sU`QrO0c#1IjBdV1*Y?%o|m1Xaa#U4T8o)0t7;6{=WyK2NB)L*Ce=qaEn8 z5r(ckWNB#$RRusq=s>kl&-TwhzOqN;ro6$MQv?uP|$bz0attPv$2^i3u?kqEXzh!i9{l( zYWW_FF+qWdVB0ozhmP%kM5;y z08cd6u?+wK010qNS#tmY3ljhU3ljkVnw%H_000McNliru)dCU@CLGhY87Tk&0cuG^ zK~y-)t&mSkTTu|je{=7RRwR8Tg3!ua7TnbCTxO{o^9{0bS-(ZzvfXzh1jK^hz)d&Z zDuq%?vQkP(T7(e)MPi%YcgKY$#u$@SdNwl*bLN~gQZARbYqeUD5tyC*%iLU>XVGu+ z%b(xnqHiDJ&%R{C8KqK5$Km{VQ!h{7Xy?43mnSQoi^k%vwzBKmGBd8L(rh*fApjsE zJ@t&)W7>Wp4I*kr6}$~JG#W`y z)G#6Xf76e95r#Q(v5I2X42Kx^LBZUY}D`;qn5FxciLM_ej_ug~QY53}!mSE3t?zxwHpXWK} z-YY{xLmWiP&4!4S?k*w%Kv5JTBDA%&eg3uGxLj4$`u_gV)z$UX-EZzMEG>UI@$AWS zilRV7*e4MYCSOdRpPrujfO8S}0T9e=aBy(2)6B>@GdBL1m6a8m%_acuPRe$zP^sC?ptQ@-QuCrdb+y-7#+PUpcUVtdz^5edX(lyb1*!_e$Blc8obQwH#$sup8JB=Bvc!Ow=G z*-6le zK~y-)rITAolK~XRf17iwmJMB6)2#@REHx{q1y-}n%r5jGmHAK+5m;dbT_|jl^wOI} z_0mJyU9Bk5E_NYliHMcDsbO{@b***L2|Nlh>VN^z-Tmv6qSz}r6)?#JFIQ&F51hh4e_p?1k#niTbrRT?F3QP%f4o%{2%V+lP-p84<<=AXC zWU`R8jf_xYK6W^1ZgRNA_6573X6K4oOi?RY6tAJVSBCZDH!{*Q@OX#D@4)49o=RJo z7T)~HPiEp&YG6miA>W%ho^dQ{nyo6Yazx!zj=w z1l~LS#7v9EG&8`9CJP4rOy2hPAP53LnF1gfME~-2E9+M0Q`zJ~XPClp0JLg3@5Dj! z=0{O+p_~=Vv&k|o$KzRoTrTI_`LkvPK)@fs;c(DnZ6P;l0S`MpxE*%1(__g`QPB9f zmT585X=r#ztS*lB_IBo_B!{xFYv(R3mPS6dJ)tN&j*R3P>{uGZ)r;pzh)=*D@S{{I zsk~f)-QJHN`a%yWIy#1&mAO1hIOFZR>W_>d7Om%jKZ}KA#W0UXM&B!(cFw zIC~CZVPOF1bg{&}iKFsT1pupZa*2qD_)X(+bIEm};2*yE#xL4m1oI!MF{}Up002ov JPDHLkV1kRAYSRD! literal 0 HcmV?d00001 diff --git a/libede/res/actions/document-print.png b/libede/res/actions/document-print.png new file mode 100644 index 0000000000000000000000000000000000000000..35c37bd73e16399b34048ea7bf8bda1659e218d3 GIT binary patch literal 544 zcmV+*0^j|KP)m+%5D|1leTGT$1j$B5 z!fdikRugwB1Ui2tf$2`Cs$6Iq+eAmSpceO1_tfEhRq&rnel8l#`XLbf#oW=|JNFK@ zx{YSt#c`b3&tE*t)KL_Mns&sgw?H zR_E*#-}iCOW%^qVthMxdJ!;i`RF#jN58SHVMnvfM`;^P&KMMeOo`Es;DWUdV+^XA;@yOt3anNuJkLw5{>pnpK~-_iVXe&w ioE*P-eg7YR^T{{CBiU#D3&X0WbcEP)r z=%QrMoYg6I5Q8zI2z{r+`*EJ{?;HUbkH_CZ5WMl6-uwOj7XYs79-o!#x<`QQC33&t z6GagKA`<)Ovxtz%WH3!LjwJw56yf`R;=-jwgnGT6@Uqv9)oL{Wdc9ukbvhkNrBVtA z@N%8O_kC8Y743E#tu`Ffm|-fd_JdAsoVyL2ui8cJ8&F_^?HqA807Q$$M4`YxFn>} zXs}!^?*lG}b}iF1DVNJBKMP>n_RnB2czxz8+P3}4f9Mb3j-%#nF`Fa+0000UFWod3@ax5SUXmoUNIxjD3X>Dy`V=irVb7^B}VQg$JV|oe-V{&C- zbY)~9cWHEJAarPDAV*0}P%H{)baZe!FE4j@cP?jXZE!Aca%X3X$43AF0#`{yK~y-) zosv&TlVKdkKkwW8GjsCJ;cHs9iJC|qA~d!H4G(FMMByQX#3HCzjd|)|VIB-21Mwh5 zhom5c6$M4zBB6t3c_^}jnrK;u`YN**_QtOTUJ`MufOw3D}O<$@%J>jc9glCx%%Yp!W_TTZru}!8;pKg ziIreduQu~|jz3q2r))jc$I(uWGxwCOmnKd+iq~);5l0swcK8o_Q>AwF0Fa+$sjC1L1r-H%nUmZ19?@7`$l=NgGB#(d76639 zVRT)`nOBmOcy<+0;@U>{org457jm@9jjroNqtWCOEdZuz5{X0r&~+VM*XccPrR92n z<(R?A+A^9C9Y9r8LZJ|mNCcbBmiPxgzgH^C_adwe_&*qa^)k`Gv&$^mj1Hi7? sSDjmaE$V6yvJn)Y-+LKoV`H@c1eLz@t3P|Tod5s;07*qoM6N<$f{Xxk=>Px# literal 0 HcmV?d00001 diff --git a/libede/res/actions/document-save.png b/libede/res/actions/document-save.png new file mode 100644 index 0000000000000000000000000000000000000000..22ff49571020a2b520d34f622673bea031cbbf2d GIT binary patch literal 911 zcmV;A191F_P)UFWod3@ax5SUXmoUNIxjD3X>Dy`V=irVb7^B}VQg$JV|oe-V{&C- zbY)~9cWHEJAarPDAV*0}P%H{)baZe!FE4j@cP?jXZE!Aca%X3X$43AF0)$CKK~y-) zosvyRRACf`pSj)f=Fj9z;I%Q$k+M;2QBgD|6u8J1MHDVVC@g}Csliq)D#}F>R1gMI zv?vN9uqY^MThJnjM2er z*tjzZQ~_IohM*?d(88ZT78%aXyXViH;2#P!cXaKIt*nn#mz#sDYsxyRBZX^i&nNvY z!|UGX>ciJj;*mGYx;yU-{}qrteZJeB8awQX#;6}=+9+dz9;B^hBg-ombNT)Y{GmQ# z1>=94?<9FFC0|AcL_}oZb6R@S1CqM-L=p!tNYAS;()IMMw4S;y?*@nEcUhJtsg9)R zhVHYpJjTSt1mTi$w7?{V;sDV1aTK#e=lghu_XD3;vZxRO075}Q0RXz^f+)dPitQ(E z%-gYda01u!x!CiPi#;y^czkvr$ZTH&P@+)2qU%s20PVYX(wJDs%#2Mmq|uaE&)(MU z0PJaAf$|k1G6xV5B9Sl^Wic)tSjWw~4~WOA&hFy#?;glwrvv%h2{W;VNh9FnHS!gh7CNsvH<|wws9PX>FMctA?pDB z{r$MEo7eC>4_()D?>`lZMDjE6Jdbob&B(|InM?)|K}0YNgQ1}zLZMKuT9$=nS@~B` zN>N-~L@*f4eG&lIbrCfS6E%B2<@@;-!r?HbrKLopQ2?^pEI=;pcwHQ&6!E$`lu|5- lMst<}sgC3s;57fI&R>%|GfdSYVr>8b002ovPDHLkV1jlggmVA@ literal 0 HcmV?d00001 diff --git a/libede/res/actions/edit-clear.png b/libede/res/actions/edit-clear.png new file mode 100644 index 0000000000000000000000000000000000000000..e6c8e8b9f341cbf3a1795631ccaafd14b0e0c911 GIT binary patch literal 773 zcmV+g1N!`lP)5 zl1pfmXB38?@0*$EOcI;hNJ5iHyw#`_D<+Ey(t?XhOLl^ng^SURf+GA21zi{y1{{!5 z5QL7#g;8=>?7hOBWP~@Qv%4i?;^z?o7$2sh!G| zts6JQ<4rGsx`hNvL;&d8r%uFIa{QCF&sB3vJ3Xhnz3G3(a_m%-#>gcR&Ll0E*wJ36qI~C2ft2!

!GOpKDtrJ2lSaNQ|Hgjn@93PsJ(gZ`2+IBy96 z0wag|dVeYUtj2Xcip4zE2Iz1NmGK?q-I(0Ec_nX5@MXf0%df=eg{JcD1;K)00000NkvXXu0mjf Dmc(vD literal 0 HcmV?d00001 diff --git a/libede/res/actions/edit-copy.png b/libede/res/actions/edit-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..8dd48c494924874a088590a749193994d075c22f GIT binary patch literal 498 zcmVl*+}S4tk-SEw(HMMH$UOFgT8OyWIuox(>z|!eNT?Q)#FJN+p=4fyzsz3(&M5 z1Oj8QEH>2c<<$iq9`D@|1fH*+ou9fEhcV03wkV2NSzd)@nNYt}lHgoRaN9}vHG1pg5Cj3DD1s1zdc6*S;N$b%7N-)ik literal 0 HcmV?d00001 diff --git a/libede/res/actions/edit-cut.png b/libede/res/actions/edit-cut.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9eb9a7ad3e9500991938d0da531c06f90fea85 GIT binary patch literal 807 zcmV+?1K9kDP) z1Hh-$q?nqWnZ{11 z1JXGjGT#nH5JGSEt3`W-F{81UPnb`417>0bwH3tCzhB0pcmY+{X4F+L%h_RSnk|a_^$fF6B>ZO8Zd4#b& zIcbiYQS<4l$&8G?%anG5EK?xFunXWgL9J9WU-R-}CY`QnUJ$&B%*-pvkEGQ$e0RAv z4j($yFl({I2&EV>4gdf!007lmt}-!W5XkX| l!x~>C;!~(p=dGgX{tck>ItSb|!8`x}002ovPDHLkV1ju0W~TrE literal 0 HcmV?d00001 diff --git a/libede/res/actions/edit-delete.png b/libede/res/actions/edit-delete.png new file mode 100644 index 0000000000000000000000000000000000000000..ea03150a1c15ec650240042fb695e7be84bc3e28 GIT binary patch literal 680 zcmV;Z0$2TsP)&~9SKOY%f0nX^lS0%q#YP1;Cv`C~wifvVWH7q5i>VkBIIeP6 z?s|6)au-91QGBQO`{sE*@B4fS?A7A^!aG@(#_<=$akkoxxl9xQXmcpb()eup8Wcsb zgoa^snGM6hljX9thz?EX=KSV+MNuFK0-`7)n@QnL;d#!A@UhW?AP8tQ8h?ynYKO=6BACOv97OzXrAtf@ z2O)x1X8|H-V>nD%fY=%S{{Wx9i2r094LW{B44uo@Kw#`p>kX`0Uo?09s&V;JTzyn7 zDU*{^%-Y&}CK{d4s?`b^i%n^@T9ulJ#`L$9H{{~N1F9)O#I0o&NqHSeDc6cDqz8 zK1}bwAaOHui(g)OtONMGwY4emZr<;5I_X`d&8)9~I0*nN&z?HdsoA#LQO@rNluJuR z`2EL^Bopb;WFpe`3}G0@e>1bQwMe(jEWv?R(23xniG!fHG;ttONr|sxONv@Sq(l&ciXw5X zL=(g|648T8eY8YKiI1J7MPgf()NXfYKe}DJJFf#fX)jLx$&)T4&ykbYdjUyqZayIe%^>;0FS}?m3e!eJnU;Km-E&p)Ev2?U6I=wMZS2a~h~; zm3BU#p8#mOWwUN+vnYy! zs;Ym>1z=AAD2j6XLd&`BLWl`d6ibqve}~88X$Nxr5B&yt%^M8Py{%aQ00004+SOttuFuo0rp8m zK~y-)osvy!6Hyq2pF7DUO`2wgN>U06wOwc$MHIn>xD*Oicj6|$z;CJaABeUjK|~aE zS$9RDeGK5zq#vnP18H_P9en3BbiKg914X(U4?fX zv=3%78D?M10+5(X0MN8+cL(3TuaZiqIeKc0ZN-aeE4XBZ)ck8EZr_Z=qW7OQ{wVDZ zG+iT=PIKtw7@rGX1_uI+90*bpKD5zs{F**C6zm9u?EJ zQ5_2JmL<2Flg761XDbP7v)0}Ku5Shi%_G^x}q%2kVgpPOH0wIvBfN{N(qOE7M? z3xuFtwW!u4n_D&9s)POg9;6U0U2p=nX__rgY-58pql(|7qW8J5Es5XbtmWcc6+03YVxryf3dbXat2*wyQorvicCWHaaM z^${Ko^E;cZ_ht1ff`3FT9+eG|{}KR{SUhS0lnsNw28{O8e>3MU00000NkvXXu0mjf D_c;L2 literal 0 HcmV?d00001 diff --git a/libede/res/actions/edit-paste.png b/libede/res/actions/edit-paste.png new file mode 100644 index 0000000000000000000000000000000000000000..24588a3a4d2356be517b0e066a489284f0326842 GIT binary patch literal 561 zcmV-10?z%3P)FTwJtjVg%6=aCXokI21)~9mK^!mx4G5j`|NYgS(rkOVuvAI4O}*sL@D5 zUT?|aXkli7aX_q`X+NwHimYrk&*ZqAx3 z1|BMmD;{?861m(FJkJ0iqO7cZU|;Pi1_5ZQ>aE8wSu*oyiTIugE}S_S`_jqqF38ff z9j2$JFlHMdtgWq+Ohh@F{LG}k&a>C6R#a0FAm({yEE@57U(d35{}DkDP^nZxtIf?F zB9%&U@9u3bX1*b+F(4Z0|J2@sL?VHzFf(&(FdpLZI9q?fsp)w=fNCfkmfyS$y$ksq zyD7pDoj#T4A6yV|!vVTWVS55qMMcP+JpO+Z6!JMl1Q9`1u+}m$ksb}u-zd^;ZvAMD zK7okqL8@P?G#d3CA%_72HRrm3R?E_;*C`gy58D)P*aX&YQ2Sm(M0)=9`Kw%>S{}Z_ z-Z7;aG)bp3q|+I)*~3`7fvRw0;aacRHyQ$Lis9!@1|a7y6KHYMyRt(@|#< z{cBq{wZeZJJbqvRywOcgMZ;bX8R({V0eC(qv{bfm zby!V}<`4o^j$zq9DScbv%ILiw6A^$HfESPQ`SbEnPO8~uyxOOpbRU~FfUe28J$qL8 z@C5Mk;kD~GW0^Bpm31snBktM&3_1-q+s@zOgv6zhyDTl6DE{o}owMVUv2>RDuXiL` z4H7gMZdG_i0!QlYIz4!@dkqC(K-FfCk4>lJ)_b!1Rd%EVnj)wji8Jm)7Zot;7MWwG z*gs|t5o;aT9wf2Ok6$@g1dX*be!bT##gp?c3Eq+E#Mh2RWxi- zG;9IzHaQf6fo=!vH>>VST}Z(FqG7KdPT<2cMZ+#dZlbEl2Y?p^`wGFq1RKr0vRaV6 z7^XIV*yPVOq9g;1-Im=i2krW;ncR=mZuykZ)veF3J9a;RB)EwqzyeSOHl8Hi?*hE} dMW^#GgWuOnx&>a(HQoRK002ovPDHLkV1oBE0Zsq_ literal 0 HcmV?d00001 diff --git a/libede/res/actions/edit-select-all.png b/libede/res/actions/edit-select-all.png new file mode 100644 index 0000000000000000000000000000000000000000..f4b0b19e0911c64b51a27f62439117b771c89a2d GIT binary patch literal 441 zcmV;q0Y?6bP)5 zlRZwuKoEuBShkdo6Ce-`g&oB%5D1AAAQ1N;1q8tjkfK1KNiIPN7oddNiR2Ov5h<~E z_fdp3{)rVb&8)pM-@G@{3Q0UZ4Mtk4OKcFX>yB@(@46s~{@~tdt!a#*F@{=eYOSf1 zqEd=kmNCmRrfJGFO}SVs_%Q4nl5l^40st@X2}ET1qmqkpcDR%GSO7!>B7!7IO2xkK zV>+FdzDri@f#k|*B7z_Yns?E7Q-Rnx+21PNIsZ`*$1&nK&TTd-5E1ykpBLKVPN(xX z(Q%pq7E)}k=0*TX0KjB2soAg*MG+jw$!k|yXt&!X1sBJAc>Vao`Oz-kKEKy1r~+;C zY&KiDbCm>MlzSK^K=cW00000NkvXXu0mjf50ACM literal 0 HcmV?d00001 diff --git a/libede/res/actions/edit-undo.png b/libede/res/actions/edit-undo.png new file mode 100644 index 0000000000000000000000000000000000000000..8b0fef9a8319452009247864c41e033694859278 GIT binary patch literal 650 zcmV;50(Jd~P)kSC&LBJ zfVRcM$?V1P3B6PcAX~#mZX7Dr0E-up6>u&Ai1M4+$6px*d6g)50zul{6fOZfD5 zx^(<(+NuITAZTdtF*`7sbB~Mx0Ae$D>fg&k;5u>{h0Ft(%sL2>YF!TkK|`BOGW-0q z$<55rD9F$#2!Mm7ygZedyZydz;2gN<0Fly!zty-=mBaVpcsEVu>hcW{d1#Z{npnGY zBY*fjmK0%?8^t(;YR@+XG=oH^Fxc%lEVS$r0NiT$nf{@pT|4*Ae2zV-96O_3`)`13 k>$j#pJbyuT?P=Bf1qBx3B`dxp6aWAK07*qoM6N<$g68)pi~s-t literal 0 HcmV?d00001 diff --git a/libede/res/actions/folder-new.png b/libede/res/actions/folder-new.png new file mode 100644 index 0000000000000000000000000000000000000000..628f4d50ffc3a350c8cdcbb089b25bcc7139001d GIT binary patch literal 635 zcmV->0)+jEP)K`lbtXsaQ;_vX7l#~~rDr9s7q55D1?^Pcy->cq+1jZ7wU zlQn3qYkyT=9D4NlK21=UuUwMzXD_T<^nH(qLk}pI%cq|`ef}hzKdJx=2+Z^gX$a(w z9jEZI&}<1~=5GIr#kTnFBp0JiPWk?d?LkQ*GNyW<-J8)xZA^$>*C zq1Y(iRq@)?S0J5PtwTX&lprAhpJoaZL@8vfr+s?gTEz;V*Ee=RvcJHi~u5nQVJ14 z1Y!}QNC=`B9SYSjB8Y@!qIE^U^ISG1t1MPDUl%wcY$LzW`je V_=-2-nyCN)002ovPDHLkV1icx6Sn{W literal 0 HcmV?d00001 diff --git a/libede/res/actions/format-indent-less.png b/libede/res/actions/format-indent-less.png new file mode 100644 index 0000000000000000000000000000000000000000..1787a7ff480ef4c79c433a779bddfb8c1b7fe6f5 GIT binary patch literal 436 zcmV;l0ZaagP) z1PDMPpWjX5xmCdD*GGz^a$N<*WJb%e6hXCe6K7WZax@wtM0|~vEZWYx21!B^;UJ{d zX(nIbfV%HZoe@Y#QKD>Z2}$PR0DlGsnyn^w$;Lh`QL=50Pfj-|kQl6h zNxHvq-c-WRFr3RyQ~Xa*cFP2Quy*riJAg8pC<)g+qTvN=8Kks3)kFZ-b@06g!BYc( z+WkYajYt&t53AqA=UJU>M0YFJa zK~y-)m6PF00znjozX|t;=>rJ5K7zeT)Q@_FAfk|ERCLGF#WBR9cWH1mSCfN??c}I{+uoj@ zcb!;t6<6qFaxeQaQCg?Pvi3wraGG+g#Ejn-{W}esR4!!~t$%&%Xh(s}@>_XjavqNg zZWZUKOlS5y^lp>ge17GxFH5f7d;2|Yo_O;EgP81}?2ZCI-1PPdMNIoD-`J(IJF`;8 zU4e5_8cU%}=1wMQ;V+D{7k{tj{IsWG%BRJ0EdTP^RUZCcEtl%#W%o&`e2i}kD@MLAs Y*M4#`ErB`v0??lfp00i_>zopr0KT_>NB{r; literal 0 HcmV?d00001 diff --git a/libede/res/actions/format-justify-fill.png b/libede/res/actions/format-justify-fill.png new file mode 100644 index 0000000000000000000000000000000000000000..663cbadddefa3c7f74f35faa702b752eb251f599 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfERCM0c#WBR9cj@HUTulxFt>;%oC#+8w zH~lQC^g^)d-50K`+ERCLYL#WBR9ck1N7TulZdN8eA=-theO zX_a`zCOO3o{#C5MofYE^0^h$}-+I>a>w$!v?|;hP9b;jrvRVIrla9EFlh?{W8|?Ks z8IDdDKK81rpRr+&+Exv_X21D<>HBx4=c%1seObbF_q8bQ1nnZvzE#^Y0=TV28JHfh zm26#bc5lP3b=JK>UPga%9cHB+Ide_Kal=c0fwtS%PF5Lgwq|5lwdz!dZRVGI#q4K% zGH3l2U2}ak+k`s|4Eyc2HcB4jwqV$2Z@&JBmf{h62hFMX<(>!LkK~vsELh8Uk?m4* Udf)$pKp!%Ay85}Sb4q9e0K*G_od5s; literal 0 HcmV?d00001 diff --git a/libede/res/actions/format-justify-right.png b/libede/res/actions/format-justify-right.png new file mode 100644 index 0000000000000000000000000000000000000000..c3013073cf9398c1c234a3f65014fbde1840840d GIT binary patch literal 342 zcmV-c0jd6pP)5 zlW&T`Fc8JxB&`eX>H1-9<0(Y&2!gx*!8<4}>IIe3d4A}&o0hb-4+2S;`OUn65t29@ zx3@gczc4~^9N(9V)eI!D`B`(Uw)+i9BJ!!v=i{yFlgUSYk3s>L%P)$e2qw?xuJH~6 z(sb5Y-C8>gXb1Hv2&fdYl4a@e3@Z6nNP;AcG4FR^t*sL)sj?9h1e{K1sA>@ET-FaD z3For9a{KglPz8yI_bUJhfDj=_?FOhSNc?#&Vb|-eVJAtF;ST;!nc)8!Bi(@M^s_yZ opnQuFP_E|g@I7jsMa&%lUhH_jTNov&y#N3J07*qoM6N<$g6Wixs{jB1 literal 0 HcmV?d00001 diff --git a/libede/res/actions/format-text-bold.png b/libede/res/actions/format-text-bold.png new file mode 100644 index 0000000000000000000000000000000000000000..c9cb630343784bbf9c994b3a3a53f8e7c621bbb1 GIT binary patch literal 705 zcmV;y0zUnTP)4(6%e5&dwuVo>p%iUaB}c$=S$8n-#Om_{;}Af z!s%OYf}FD~k#g1RoHK_=h0`yt73+1^9wI}c@7z(I=#7K1Exu9;&)?^u?7cXnjJifsLX8A~{JUC-qGO*+K=`GSCzXF{RY~U4YnNN|TPf-Fc{qWpXv-3MDwU zEl5g>q_iB{5kib?SKn;A(b5gSZt+c6T!foOXOy2((iD6~eJapUSGgbun9_G<_S zG%x@oZ@)ot58PS<%!)ApVBEE3pQYLlN5pDTqG|)hl8xn@3ENSy9fBwff;`?_*C{FH~w~6&`N`f-P+#zq*uU-F?Y5k}|UWnw&pcm>7Pr npM&n+00000NkvXXu0mjf*d;l2 literal 0 HcmV?d00001 diff --git a/libede/res/actions/format-text-italic.png b/libede/res/actions/format-text-italic.png new file mode 100644 index 0000000000000000000000000000000000000000..977ea821763ea983ac5b9ce3a71a57eecdbc63cf GIT binary patch literal 619 zcmV-x0+juUP)A_ax+;G6&e0r*Ko zK~y-)&5}<@lW`cwzrW}A?j6fwGBVSsRnwNXEoL!@f)0gJ6eJ-b8WBZC)FFxv>*yh* z2pUx6AuM+55FToyKQxITtOnV_4x58A5D}*0^xZpu&)dP03Uxx4p7Zm3`0#zcz(0;y z?qb8~2VP0?GqWWDKoXh#-EDSlImdys4_!L6fh)&%$?cxi7#%lo{zhB}04jA{b0MNT zSfoxI^xG<&4qUpO;ECxXEM@>eNduSR?A^P=T^Xvc7MCN>I5#;%-^OOZtWeS*c=CSO zv(D9cZ2va8*7JrZCXFa7MrI@rR=hO8-+r&Dyv*Ktt|df0Pd{1ducP0EZk}RRn3`5g z8~9r9cy&onF1GEVSIJ@Yz5SvJtQtOacg$K!A#W&HY7s!7`L0U<17})x%gjg~k7E67 zvI-4GJH`NjnK5N3@IoQh9Ej*_=T!5)pv}_kc>X$NnFW&oB)vy(%@v0v=M6>t)8G$) zz7oB``VEy;)oVmDJr1{fz3^?_j8zUBoGUbxm)RgmP&6?-pTRt!_Q=g}RfV%L=-)z* zUwpKN(%A)DDs4J@d^_pa7c>Cac(|*HNOacL)luSo7DJhAQ54O!=~y`TH(=ADE^97} z-wdP>*9(S0@z_fUK?-U%kd0r>E%IS=@LiuSh)nz!^8-%6&rs(VEJXkS002ovPDHLk FV1jmq3Q7O~ literal 0 HcmV?d00001 diff --git a/libede/res/actions/format-text-strikethrough.png b/libede/res/actions/format-text-strikethrough.png new file mode 100644 index 0000000000000000000000000000000000000000..ccee76e29e58347b30a48d7b4c3a03efc36ebde6 GIT binary patch literal 611 zcmV-p0-XJcP)h*V(GL>w5|PQEn4Xi1c7vM2@+}vyxXLr8euI;+u!45sghv)gg`#!)PB~>z8 zZ^b+eVwH0)0{~;J$RQm{JnmXA&&rhm47~fw1s}V4^(+A3$%`5G>it4DfcrbM<%&cY zF{wXv(a%QXb7C|;CoY{k!iY)zh(y?~fS~1T^LuNlX1|KDiIfwFGyqspJyQG@C>uhITyhXlOv}Wd-)nW^B3qnNb%?XTWbt*}RMS%o;B^PVdR< z!@U4da2%}Xe!F!IGO5)X^o?RCfLIAYX41&1<4r8RyouKH0jgFB`&1daN-#792Q--` zzx+hTQ&0JgUn3;|Uq`e>Q6$4<8eYbyU3=B0O84qUt=o9)Gy%f!bwpbhp7(u}0YH}c z;9;+qzAk2Auh@_ZRcd-X?EGDBZXd47=dzp5_7-Xmnq>d@J_w+l0RS)Z;HTtgOul&w xa6V9827vT<*n!LMeVduW%Hll0c@Y1F{s73lw+8d?uJHf>002ovPDHLkV1gC+4?O?? literal 0 HcmV?d00001 diff --git a/libede/res/actions/format-text-underline.png b/libede/res/actions/format-text-underline.png new file mode 100644 index 0000000000000000000000000000000000000000..0c487210023af031a2867c5418ac8f66a74dd964 GIT binary patch literal 673 zcmV;S0$%-zP)*hRD* zDilHN6y!03Aylvq8mY0^Xm*&-*;Q4?~%1?s{qC zoNW>*4FEW2MIu!b8t=@MX0>tvW9YtdseyO3_y7RofiQnRAL|D2s%9j$AAC2 zX*&E}0YIaxhCO~UT_{SjhQ>Q-Z=RO|B;_@ivs&m!O_&TWsL9}h0_QlPTLejYwKRVK z&;*{|x#AJCkqsy%SCo<~bCEdCyB$Ikc=k`g*D+Ra(wNs>cO0*S5t+{y`ttcg-%Kbb z^=ci4QS|yc#_InHaNyDH%jeja)imNiG9XD)Bxx#<%wjXO1E<5zpzyFP;B6ltv~%#PWKQjDpeY zx%<2q0E&iz%vM&~9d*KDu_E^?+Xmp(K0t6b>^W1%m*U%KzUUJcvp}U;!x6K9ZmmF- zRTHyc(^x-ND{|TF@IJuR>i3x{xK6@~cOO2>WFjfb9av?RO`dG<3I(ORTK&G*n+M_D zQ)L)(IGti~HHGA60z_n94)hoHHlJ=8H08F^+s5xaY<7o8ZmbOfxXE|-r>1Bmin*DO zP(%Zz%>b|*=r2I2!B}`6Ki9rN5jEj|6gzcmKph6)hn?ULm)G+yCUZW`00000NkvXX Hu0mjf71A&2 literal 0 HcmV?d00001 diff --git a/libede/res/actions/go-bottom.png b/libede/res/actions/go-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..2c5a80385cca2f80f829819f25e943bee4fbb759 GIT binary patch literal 663 zcmV;I0%-k-P)^@R5*>5 zQafl0i$fhnu!z>dT@ZRl2cb)*4pLDG zZG=odu7yxbG&DksLWh*3HCi!E@4f%ybBM&$q+$>J%i-gE|2f}bM1)ohPMBp7qUZ#M ziZjW3S}CJ#h!C}JK7mjILiv!2Lnsa|Jv>a^ZWC@70Kk}r+-e%0*oG^%;PEY-Ju=$y zQ(8wB42=DLU;tx~itk0BkqZ%lKmgIM0>;oi(;G18uk)G8m+}(D!pA`x$GW$IlKT-XC=du~Fhe@}W5cL!R;jp>uMpvSGepPcH4u{1 zFCV)GvtXJgHvG>pEgb<%Lm;Fh9zKRhs1Mm!vo0wl9h=v7T*0wCML#^(K9-8dDwfOPh0opXQOv3a5686BHXl{Qv0xety%&@%$fU@!t2&O}F$dq3~5 zSJ&non@{aHV_O3h#uf_mOTDqf@uT4c(+v&P(of1QI%OprzW-Sy$L2MXNX}+oxQB2O x2h<5XpL^yi`NwxFSmKUBf0KK`E>-@2`~s>b4Ju;H8xa5i002ovPDHLkV1l6R8=C+C literal 0 HcmV?d00001 diff --git a/libede/res/actions/go-down.png b/libede/res/actions/go-down.png new file mode 100644 index 0000000000000000000000000000000000000000..3dd7fccdf06321880f69d65631a363e4b813ba04 GIT binary patch literal 683 zcmV;c0#yBpP)i}4~9FCHr5K@{qtRq-ka(iJ?ZP=uTm zA)-=KTXM11RS2~$6nm&uv{cQSuKf$?CbP4jht?XK7~kVJ-#qia^UW|KLbc-EY953z z>WRV7dqi_}NvUZfgl}C)!*&F0M_|b+V97E80CykVr~%gk05Haon|Y41T|%KagO77# zXg_$ht|?xxSRKlv`0H+L2mld?91sx{?rsQB5|>q-9K_b`yI?say^?H5vawt?QN0%L zQr8VKjyDQ9NJT;|(TgXq`xKW7BF8I9f|vxjL{S!?dO5hlaQ@UaF9;B#f^;@jnqQnt zF(N{uTTQn`k0*~rlb-kaSCCvlqKp-L5!3TI5NItHN89$(7@Zg?Pfm^Zz3vh1d@XXv z%dw2{#h9WC`nbQFn~GCVFR$PcMeY21IKx0j@A8ZjM9Y6Ue=LTlryr z>(@2W+wdKbgN~t*f$yfVK)ah_*yWGG{JKoJQ9bX-)!YpMx+aPwk<4VDSzECWL8lc@ z`=3~j{FA#{Y~yeIt$3GuF4Da7HUP}#KVRBt{l5SJIDAFD4*hqp0JED290h! zVU0NBR?cr`p~-QQ_EsWfBH@EQ`Nc0GKMZR^J`BSAxf26@WBs>$$pHKvI7xf7HPn_K z?i~+>+atsnZ|Jg4VBK;@=p(qz`$(+u}xd3d6n3+*N?MDJ7VE8(JO(EzhB^&{0eRn zE*?mNaRLBn_0NHlrd}YI5_3+{j?R9X$}BA9ySqF4x2)2Bd@j8KF~Xg@H(lYH;N~^f z^&poLB>)3X(jI*{c`tpTvp3}I9wGn`t_kK+f;Jb)x5~Mcm=MA{nSJ@R@P7JTO$g5q z)>vRYlF^9H&d+2YJejC8!ZrPk8zPM`j$uE{Us}u$`^<2oGynhq07*qoM6N<$f}(68 A0{{R3 literal 0 HcmV?d00001 diff --git a/libede/res/actions/go-home.png b/libede/res/actions/go-home.png new file mode 100644 index 0000000000000000000000000000000000000000..a46fb2220648f4640d48fc34273682db5fc53415 GIT binary patch literal 606 zcmV-k0-^nhP)zpi=LK3kbe)ph6$1us|E@0bs(3;j70N?ldxwS=dZZ43B3h07Tynj^2Yc@GQ zog*HPBZLSEeBTewh7gSA^VD1y1GodMPMto({n9-)s&51E$;vZU9zR8k5p<`8FhN|A1evk_=AdpfbrNok-0q9`y@lykUZ{9CDA`)68V_>uX4$tQ( z0GBRKb2S=6>TxbhlkH7H6&U>${F{F7rSIMjqS-ib^#eg962Z1@5{U!?i4YKr#c&*F s0J1DA{1>jzIOV literal 0 HcmV?d00001 diff --git a/libede/res/actions/go-jump.png b/libede/res/actions/go-jump.png new file mode 100644 index 0000000000000000000000000000000000000000..1d218c388b35c8720f623c9a0ad89e4d26beeea3 GIT binary patch literal 723 zcmV;^0xbQBP)gNmRQ(IQ2% zNG7^}6DKT8pUmw{ZRXO%ahpj;$Zg04x;uK}h^cq_Vl}(QGz*qQ7rI z-o*xFW#J|OTs=XGZ&X%QfTClr0}EIUXk%oxW9vJPt*-)SKlJrWF{{X=b9io!;lwA_ zSB4crc^<&B_yOESh(~Z)2tY;J{jGQ0I0w z>{eB4!YB%OJa`RbK#Xu8d<=k*(eL!W?h+9>p9h$RTv5t8zBh6}4JBiwz2t1KC{Rjm zSu?#ayTwSZ!?AT+UY_avZ6c=gd8}9J%9{xILI4DOA?nJTh`xRxMsl5wt=s;JFwe=0 zU?9}k9NA}m75 zlTApJQ51%s``vp#$I+r-vIvbVCs0U1TC~hLW^i)Pz0@_MiE-%s!hV+qFhuE z1Zm_VBKtFl7NgQ1VznuPg3$S4O4HHl`{uj1g=uPI)C+fW&f$UkzUK&QElXA3suR|5 zJ<;J``J?$u(U`UXPO+vn)Kyk&?u@qR+tHXVUkqlzip{BLi%w!$yRaxEd1FmzWb`T3ks8r@G#>8hztmaZq7PV0 zbE3nanxCyZt880y97jl`qmV)&9f_2Z=U?uj9L4I=^=w>K!{FN|e&4{&F>6dCFan?e zj0t%B{u)}App{FB8^U#6l+*|z$>u-tJ)Ndz>rP!+QC-#j=G5`zmT}-uUontb9=r!a)e|uV|)6#W_-^(UF2DL6`zGMn!p-|9fRGGizh?e=&U5++$Mxhv T)(+xx00000NkvXXu0mjfgrPr^ literal 0 HcmV?d00001 diff --git a/libede/res/actions/go-next.png b/libede/res/actions/go-next.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef8de76e0f5bf01c09da24a07c61cfe558d7a4b GIT binary patch literal 676 zcmV;V0$crwP)5 zl1oTbVI0MO-{a21M#B_R#9l-oXcPp6(?)2~B7y{4Mu9@O$#RS~LMu0okc%jC6BNCq zMPfd15iMrWDWnuP(IPA}ow0!)<9P4f`?UyPGZWN-v-$pq!}*{8hcSkHhP!mEu~WAd zo8?nd1jeIrclCk3aF;a@j#!~$nl%(P0Jzf98$5aR>}dqE;fU4n-v&x*nhu}wwKrd{ z4f;b9;fU2%OeY#6`YVQ=TOJkJo9%;vsn26nmF>ePxAA!V*2;(ZnPFo%AB#FaHw-$p z>A83xDHKX5gpddX0EtgSc(|1Lcd)Cxp7`{*Gd4M}fH9|HQD+7~1Grv}*vDrmsZm0K z5C{Q60m5V1o+G_9&%wGQR!!BO+NWc8C&Ce{BNlb~H9*c=C7oHocC*-S7Ns<$C1sQZ zLijB|M!48sj(1C=)P(9pYjao0(5pv%$FEw)G{Dl2Io>Bnm(2P=eF~WywGEfv2*dEE+1BNH1p0gO_(!va6Ym6#!ZeU0XL$ zmOyFA$XqYlC#eqYr*8WRCf~&E#M}5+`DMhod1o}n6nu_w#4?v#yZPlMNv2Zf#pvLQ?bsc$8%}?|wxEMGI60fdRAO~{ zc52bv6uF?Yza^+BugrY=o*FhT7dA)!rvyS0Urwj)#iE6g^YI%&-U+mBcICDJ0000< KMNUMnLSTZVNH5j^ literal 0 HcmV?d00001 diff --git a/libede/res/actions/go-previous.png b/libede/res/actions/go-previous.png new file mode 100644 index 0000000000000000000000000000000000000000..659cd90d7f80488a8a6a2c12f6f9e5ad98720461 GIT binary patch literal 655 zcmV;A0&x9_P)_fWZPlDqB9?#%D^>oA$FjP8SXdVl!5?|TnYO4RbBH?=GA zTUy2|reO<?=@r%h} zW6#cJQfPC~s>mwxzQ}>D!BbZalds_8_h}r7_JCAa@f4F))r6lUrCf(hQ;9=;jU5L& z+1FnmP_XjQREAhnABYqX00}@!0U-tMq%XJx@e~^h8rvWApSa|&uWz9Di?6_?1E%N@ zl4EB68Hfl3f`qGnd$iXb;n;2VsHt)P`R?O`My|Agci-NCF&}hI2Ui3vQGjU{P_$N1 zwo6b*g`Wk{x;wF^0p~U>`wvX#H%c-OZ~=##s0b5Wa!4-09SO%4;Ep?Tu9$V#I5TQr z&Mtkq{`h6ugzb~9dlQg)8A30C1pt3Qg&t7B3bbY+H`>YWThbX9oF#2!=nK7F-=6arTX3U&+XWy2~<%(BYwFX|c pI#R>7P%^)q3wROKeC1m2{1L zlTS!gQ51)N=l*%UXM%2Q)F>(p+zgmdf)8?0hB*|-MC$(Y7uSP)<6hBvp%pb#VTA`mW=f8m3=A+VF$gz+5g|*fW9a=~fVCub#hVuLlKG!y<+UFWVr@ zx}I*`6F`LLL;b0)!-tO1O8E;`N}ti*)<%831DzmD?+S1|ojsB`IeM-?t-lsNLXv_Y zi4Wgq(ARs$>S*s8bv>PJ3UEE0w6rsoxp>?8Sy_bP08%N`;|ezT7d{op$Nz_$1Jr8{;^A=dpOl#Zx*NxBimVOIKWYqfyp}XTIm^nr{$U_L)(rG}9&-Pp{q+Q5 zlTT<9K@`TnH@h?0jfHw>O#jh>1nt2m6SAzrkW<%*%=Q}tRboP9pC%r$9&(LA+0sq)ybQD9srhR zz3Fxu)^6aqJl)?FN%nOeOgb)4?+M_zJQ@)DvRBSb2FFH|!GH*69hXP{3*flC1BAti zbJNzAm&ca3iTKDR3xq|-Y2`eKx?tij|4I5$vH1yqf%5H^Fb8J54jK)5$VM-C5%i8b<|k&Kxh=#FG>Ox&>r z4?sb}hlkg>1-vahgJcyDBP0eg&{{(&pkA-x@zeQAv9vj35<}`!ZpEItce&w-qk8xH z6RRw9@QrP7!N5#{!3lE@ZdYYZTfgiFi6Lb!&3aDLCbZTHrTP~zgJ5t59%w*hO7hmi)!cT|6FkAON{jSt(_u!Lq7!B=^4B;IBq%dL`6}O%gpGjO3}J1 z4Y?KfzQ;%l3Rp(0FF*F|EI&io>j^)N99Xu9ZE@HjcqrgTrepSr)S!;v7$d z7#j|r*sm7k|1`qSzwL6X$#3JGkN$s>{Cx9Ec6v|es;&OpMC)hUh7@^ocW)~11Nx1@ M)78&qol`;+0M{XYA^-pY literal 0 HcmV?d00001 diff --git a/libede/res/actions/list-remove.png b/libede/res/actions/list-remove.png new file mode 100644 index 0000000000000000000000000000000000000000..00b654e8ca567c380fa477d4b32f808c3b5500d3 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkEZLFV~EA+w-YyVHU|i_?Pt%tbHGab z1&5^a+FUmdNd@kXwZ%tROFFJ>Q*!zI&R_A==FP^f@-i~)|I20A*?&KNrgrv}l!w`~ zS-W;DV_2Rr!zN$cO_)z&Zy0B$7WFVdQ&MBb@09MjczW@LL literal 0 HcmV?d00001 diff --git a/libede/res/actions/mail-forward.png b/libede/res/actions/mail-forward.png new file mode 100644 index 0000000000000000000000000000000000000000..de0199b46a17ff815b511696afab8acd13ac921c GIT binary patch literal 681 zcmV;a0#^NrP)#MB8i9S z5)@_T!Gp3j4LY`s0_ix+K$;4fpa=cEe}5h3zd<3?1224e;QM)>hnE-rQ$B#hBw=<%?P;w&DWxZb@Qg8@5W*WC8u0vE zQ8MWi08&bX5V)?35CSPBN-305Xsxl<;`jTR&b$Y}51^Eyx%mW{bc#SAfVCED?XK7c zYb`#Xk6KXdJ``el;w=>w6=e`M=U_0%ZoT8E{@MT$R)+OE5=)TJW?8N8X}fao#mw%V zvI_I|{KHrS7`%hnWs_*E>y_SCig{DmyLx{)# P00000NkvXXu0mjfCEq#~ literal 0 HcmV?d00001 diff --git a/libede/res/actions/mail-mark-junk.png b/libede/res/actions/mail-mark-junk.png new file mode 100644 index 0000000000000000000000000000000000000000..f12d452538b708bce48ced9ca05fabf0de9c5c4d GIT binary patch literal 882 zcmV-&1C9KNP)Y=TxA@^fB)~h_s%1enT*LaPO#0(Oq&!(lTushW?HCLC3aJ~3@wATMF>*U zod%3h#6&kK7V5&HyW%D-_^28X4W?Lvixjk4V$#MoF_~nNah~_y&rRz>K{uZ5;he*P zbA%&9s(O7hk67xO~29|tZj-DAB{uaRcH}UA$NSjh-3QVlO|7bALv_%Di;mUjG z-+mW(@*f7HV{a-zf!Qg-5fO9x#EY+l%jGhbWnqj#DHX4;kJVrN@cfBm1E(&?{iKvA za{(hih?wK|{ZuwP7;xAVt1GL=l?W$+t$~0e zt=rnATCGwpmzkUUg}ZkbDV2&?md))u3v6txap1tS`r5T`{I%T53&25zm_ym@VAOFO zDwPV8lb>MQHXR*ZluCbKjA8M&1)3VSkm~B8TrP>WZRd%{cWb508%ki8faN$rGMPgJ zgJEW7rinzNq|>{I#p0wN>tn}`om8t;e!O`D+qT*JR0cp>b&-0C#exx0VvNBUL!q$2 z^z_$scc%%5BW!NwSzNr$-25$iy3@2IAHn#Z0qQIfwWPI9dY(aRO;=Yp`TQCyE6acN zpPHH^5{b~>+CeNDEn+U8e;KQQA!#gYC>yGC{%|r9-&Yj`}XapP$-bg zt)n$`Cb!brnLjsO4v literal 0 HcmV?d00001 diff --git a/libede/res/actions/mail-mark-not-junk.png b/libede/res/actions/mail-mark-not-junk.png new file mode 100644 index 0000000000000000000000000000000000000000..87c425f92b350d7cabaea3c81c97715ae4a3cda4 GIT binary patch literal 756 zcmVkxn_pL=OZxi9~&b z$85IdxNs=M!{IQ(;Sh{Q6I`ybP+D5X;J};y+`8JP!_;l>GBYM#ovpl7H1N6)jaOSq zRaJOAOORzPG#U+jzIFI~YXEV$r(9u+*5k$0+hW%(k2N(m&YY_{gaUtSLsMZwU}OH@=` zK!WoNCR^Gt8RO9kfN6jL$R+^4PnS6)0!j$rvaEx}QU#~;6UN3qVy>kP<<^WHH>4_? z7=AmPA|>q8!|(SAB1S?82qFIdH=;v>-=VlC;L0rm02EA(Lz`0w_wiH!fJDR=Ip^lh zO##k1va^q2b=8Y4gyNonHm49JLPVj8dm)cCfd z*c@#I_Iq7-h(vAi$x~Vjlni0r*Ko zK~y-)t&>e?6Hyd}zey&^WXPmVQ`0OWh3ZNaOEGCg5G|%+ih>mde-K@XNWqN=?gepU z5em|cx~cn8LG8-6__Ii2P>g6PSZu1`B4f&%Op?jC5Tip9Q1tHJdFLG7z4tu$$CCb( zXqVkl@b5#C`>|~SW=7H~&*XOG8#k{H0=b`Ox2w+lVxGOpY}V%sM4?;-F>jaoCU+8F zy>jgrXyu?*L>TcQTTTm!k5y`SQ&7#woy6}8c}luYrDB5hl7apLvCVNTX_xAU7sXzby1-Ub)&hq5(9Lvie7#$rW z)YF6CucE4Ps0S&2x`(^;imp(M*+(No$H(r!akLN)_acPJx$_rLRn;+@ucd8lR3|XS zI$eDUR#vBxG|P4vD2l@HaDs<(v+N%^0Duqz!!R%mgTmX_96oXs#jiCrEnCvXp#Z6asU|jc`xahV!Zb}30!`f28abPV zg{Pc2dAbQTtU4DjO|ZDMgkcB=y~QA#$#5v0rd~C%8x5>l6$y!k)nMn2?G)EPcWyz~ zbrQ)vKQ3gSgXjSiRin2rhOX;v4JPkQPhI|tk2uNysP7V2y6Y6gd4d1{002ovPDHLk FV1h5`60`sS literal 0 HcmV?d00001 diff --git a/libede/res/actions/mail-reply-all.png b/libede/res/actions/mail-reply-all.png new file mode 100644 index 0000000000000000000000000000000000000000..2017b0af0be0209dd2670890fde48808e1b33b93 GIT binary patch literal 868 zcmV-q1DpJbP)ZIce>dw2REFiBOtZzt(kPD_Yc|Uf3zS7&?*SK)o2~P3H$H zQpYY7FNQJ(UW!l&V|t;Mrr87;EwkH@vNc%uQ7P?AL#Lj zJUkDt0dV}-(NDDY4=bfmN+Oj)D}}0`l>d39G)l=euGC@b0sj9`Xsy@PR%op;3=D#EN z#;0I6(y*hCdwri%zZ_v};R4DEQEPsP)usfyUj6KjKu-uPtHCgjlOjzrOmJ|lhoQj(0AyyjGqo7uxt^UUUt@gvN}s>4KZX~! zSy*b~$8?@#Ymt5ZF|NuOZ~u_sy|)HfDAd+|Uf0E|SNQ#pD_A+vi8xo_fu$_zxxI7_ zen9T~G~!%=udgQ<8a%+M$r)~x%Y*_pcF;hn8j;Nrl;>gQ;(es{yhD0!FI|UT=j6l! zx7eZ`@uqj}&yi#RLQ;1L~NJB$}@rg-V;>lr4Ye|tH1j|g%mC#CnVNfK<$DhB( u(C{TD&Yq|D@ovT^CT~w@i6@7F_x}Y_oVZhjtC5ia0000UTuL>Xl;KT0w}3p7GEL7SF^n-FX(tptm{(Al(fBT}n& zG9j%pn`yE|F)mzXQH^HV$0Q5`ZGn)tP19t2{4qxx8(9-r0i=`wR903|RUIZC8^^LNEXyJg2yh?}z_Kjv-haUHrY1^*rL6xFq*pY10i@#q zpp>GbqJm&B$ivYnPCgEhUiC=M3eKO+`J*qFajeE1Kx0puXDKeWXlrc&;LFkm zcLv4)$Y!%l&#&<+^#QT5zI6l-kN5B1GMkzy6t83?mj}k^@9hSl^VSn?4^MEe?F7op zkFcrlU%ydTSI?pHasWOptkKyQsUH^qRlHy3)AgqT1ie$72;)~@Cb0t*v-Xlb^?%kbbU*WZ#RJCy-TmlLg5zR b#rE892t`wcq{hbX00000NkvXXu0mjfX%#W& literal 0 HcmV?d00001 diff --git a/libede/res/actions/mail-send-receive.png b/libede/res/actions/mail-send-receive.png new file mode 100644 index 0000000000000000000000000000000000000000..3eb6a9ce3f05fef318648a3e317ac3f438dd0f2e GIT binary patch literal 540 zcmV+%0^|LOP)*Y>8!Nbe_rV5w`+@g{%~_O!X=kJZzh!1^&`{Vi{T2qWCt>OBAT_pH!7 z{L)-W*T6!`=O{p+$L$Q?+-Ze1wt~c<##X@EzGU`WD?l(+105j4qVoA;18ch%XvC`fDYmjCIGA5tpmuA zSBTfBR=ZmtAMIgrYOMkA86Z~(!ffi8SYTSytjSzj)_6LVIeQHH$BDFJ3ke_sdx5 zQ%z_SVGw<@o0xWKEJ5g+-EI@Jr}+p~AqQ-L78e)Z-c5ha<~tOGN1%>zIHJSR>a ze=;`qV(H!cx66a!lj8t<<#B58jT~&)x4-vDAQkHXH!1f(GcW1J5(U;H1?*W)@ z>HvVG>w0f29?j6gz4-l}1q%(eL+fIz1Hrko=S^ z<_mdF%}nv{=}BH#%<{zdiPD)^_(w1p-0JmuZFM8~e7=p{9_7k`P-u&;>q2HO4I%;& zA(vl-swfm5h{(*3ZchH3x(eVIDocq(BAvxz@sRB9x_{^P-8NAW8=jV#abx&;;oFz5 z*Bp-ahlxZYV*>zHRXb+>qy}cw>2;SbU$m%dH(1r1re$wycf?es`x$^00guPCv)k#{vLS6$c^!j64`^iG224w5TYG zSnZ%B2*PqKK16F%{}s!!Tms5h0MH4b3o9{hNdQ0^z${gLXZlY827td5xAz{|3C=bE O00000WbcEP)fkXfR0bNN% zK~y-)&5}!Q6hRDzzbd<#?kMWj*ortnatw&zNJwy`D9RZCg*!wL5UgjGNHA&oVHW+! z028qUFG{7aT)%!l;9p1DyPy6&J1w6g;v*0`zpdA6&YwMbzc2ds_4Qc{Lq320^k$!5 zzj=4I*=`dMd4^_&s>bET6_*!RsOsQmtPgN=Ura3y+#M02?|VLd`GAOE?sQ$Z@Y~Nf zBRBg~z|0U4c6Z+?v_MoabGo)gM7V2qh$y0hKP1q!JDR3JR1gu|*FYL}%{SWi2j!|- zoXv6H10NkUZ9^gMh7Gi5vrqV;>BD-9GXJBeDwkV$vM~cQN1dU zzy8jT>#CjwmhIYXH>X4*rDN*a%Jzqz;k7x5ETI&B|H7dZO>0000H0h#)QuLQNI1SZtsXO8U^GGfgrxxh}+}VkxnAb?)YabMHAocX%9NxLrB| zzyY8MfO-Y6yO;d<*y~_0mS+_>8utCg%c)OS>fRtAV|%-`d2TEk2V8nL~zb!m)|pEA$SF2->jn-2hWj=^AH zPL5B%P2Stz^{Pr7#{fi4VAUxi)#JB!S3FMcd3k;2Es0696z@F%)>@ou3v24+*vND076Ixy33;9q2pAv`@ZPsg6f3A(Qi1k* zFkavM@*Aa-5I$9)h)6g*I{0=DB#I*EIzT(hNs`o~9IE3`*}+soD!;iA7_JPj`4{UQ XDQtDP+C_)X00000NkvXXu0mjf5}&Iv literal 0 HcmV?d00001 diff --git a/libede/res/actions/media-record.png b/libede/res/actions/media-record.png new file mode 100644 index 0000000000000000000000000000000000000000..2f66cdebbbfa20ba0407b3b76e7b684cd465132c GIT binary patch literal 653 zcmV;80&@L{P)L zlD|(=Q546&=ia{dwdoJ~#Pku{MHeYy0I>;}NE{r&iB$*x0u8%^ZY(Y`J1cV&;?#7g zO>7B6jVzV`ttCKhO5S_Cw)Y)})|z55CVZ2#+??~tJ>T;sX2x|St~Cw7H}0`O6x4vn z5?D|`5$VDo_YAze$83)U zl!zY1W@odh^>w}Hy682V@LU%%7=+(6;gm|My1DsfzS~{IU~mX15=8^C*!Q~|8#kPT z1E_WzVD6Xa0ZJj5PUAeE@7A}rUd%JU8!=G=Pj0QQM!Tn{=+*0hWdV)@*fwBUV9SDC zE+f9YtZC8ctG`SXzym#*)Gl^+p&AX4-w$aRAfn+9yj~BzRttJ6WfX{vMds$8D-hk0 zN}*FOgB=G#2(Xk8kq9Uf0RjQA>q6CP@W)~*(7#S|xPoFXbWToKo1BCof)E0N2xM76 zqXDm4g?DrWL4=E1P3pk65f2E+xA*os`pgW72sD65Df=)XpqVB}*I_prl{9l_1hByT z>8x1%%tRc@WFVvj1|SeY7zRR1OQ>hF9k}lEt8y@e zqrSb}Ij>Y+&nflh$|RPELL|gnJ&|}8N~JtsI808hCY-~=AFgdbz0aKcXOw^IBayrf nq!~zfz)ptwY+T=!fdADm63+C+aTjYY00000NkvXXu0mjfh3**Q literal 0 HcmV?d00001 diff --git a/libede/res/actions/media-seek-backward.png b/libede/res/actions/media-seek-backward.png new file mode 100644 index 0000000000000000000000000000000000000000..ffcac31132487e90bb4d74c858e0706099250e77 GIT binary patch literal 764 zcmVPA*Jh9cyFkzj@8Rl|wrzVTrBXP&dB3J>#|R-SugBk% zQvirYqqMm>>a}er>^IE=b=zwDw%6CU-;edVC0UXvrQV8)@*NEg^|8w8s-wMk@3{m) z5DdQwv9+buH##=DA+RwJitcPWQ{c-l?dm%3^LRXjXE~V4#HQxP8%)z`E?>IBeEIo= zXE{_=g(%1n4ZqohUDvZSiO<|ww2@9*NaZ+FRT!oTYMSOu zxT31XveKPBcW%Fb*#BVO?P4e~1E5rZtVq1Kx94ql_f1=tlvVC#ZWx9EAr_1ASS)6D zcAgzBG1uK1dpRn-8Xv0^C6N~w8`4nxd8Vd15?NZwyc>M>v}ta3mIi}m;?U6Ga#=8R z{iid=<8cCTmQLG+FGk`QHO5-99GR_^wLuP0Yk5IQC6dQespN^NsgHcm?!BdCtrwh} zoTT79@5A)OrpNvLR}UXLvX2Av1f20K)ag$XX8*vzwYIkQgXDK5a26M30`3KnQ507S u0BqY40B8VL|GG__b7c)iIOqC5SM@u(HR(kN;XjH10000tKSAuPT^ z91PmH7$pWpLv&PdkVkw#OnB5_ppT>Ude`f5Eq@mvQDHNFr(Ztb;M~g+f8*d7hIb$#Dq+*VcBb zw^%G@0cr|@P_pff(qDp5ZOE$zm4}Mr@Amum+q#}xWEiGgmSs|16C6|&e|JTt&utp{ z6;)M>RaI4vrfEAOwlN&`dOYrn&z}v8lQUDzWwLzM!_1}7M_~3zeEbF?!DXNOJmH;6@CaXadC4f>SlB?9~^==XZW-Y5h6a>&s zibOI&-IB2;7=}eqt$|@0h{cAiL^8GH68J;g+_Lf*d;3P8{W`m9 zn)$np4NWluvd*chibU!soT7u#(Gh!LX+H1sRbDyXTK{t9^VEV-tlmdp;PeDuql&y}fd_3LJak)NNw**46p-^b^ z&mj@ZvI1LY9)KZ9VhI3jyWj)BQ;>C05H|LF21==yQc8B=0{%yS0XCc#NPdKXNB{r; M07*qoM6N<$f~CAw@c;k- literal 0 HcmV?d00001 diff --git a/libede/res/actions/media-skip-backward.png b/libede/res/actions/media-skip-backward.png new file mode 100644 index 0000000000000000000000000000000000000000..94381f54fddd07a54b483ff931818cec51d969e7 GIT binary patch literal 770 zcmV+d1O5DoP)eL!nq}o8h%B@qaZ#2x}_K3;az zX7&jHfv)S{wj)2Ca9F$rB07@x#?P=&KDkv;#ZEY(Eg+fGTC2VFJ zob$^a7ca4b!a^dm5|mPCst!#!0)JA!mK1bf>8=TfBAPerBArTsQihh}Eu_A_!S-go zC5+h&MFkc#!8w9C9{^yQCZ?vRq^|48xG8wP55^c=&xPl^$haAJo(skp7^NsK;!vW3 z!!UFJfMMu(_~8DxmxBYpEt4T8)3`Pe2Xg@!r4T|ul=nS5;?K442X#fBr#9xMyg+gnzzxk5f!nB%9@&Et;07*qoM6N<$f`N5b A5&!@I literal 0 HcmV?d00001 diff --git a/libede/res/actions/media-skip-forward.png b/libede/res/actions/media-skip-forward.png new file mode 100644 index 0000000000000000000000000000000000000000..758ec6f1b14f2dbcc92cdb13de57c59ce92175e6 GIT binary patch literal 771 zcmV+e1N{7nP)=MI^)2*h*-#hC`$v=FNQAc%05uTADme$0$B-ud#L7LFp;GJ4>J!^3$Gzw`0}|9~0* z%06cRF#qEJfB>+nX9qwUKoLM~^$`gmUoB_P-CZ=d+e9Q1>0Ve^98RTDX+=?1TrO83 z9B%JkT>Lze&161-z;GOALrRHLr%x{JG$#_10Yz{NhRH4lL(Pe3G;+@C^>SU;1I(c3 zTY^U?LT$k=kH=eYS%F%?w*x$T`Wyhj{Q?TN1XNX3U%hL;!Lqr^zV&tSppjO`=L_}ilXAdK+Lngw&w1>eyu;B%Tp;O`uh57 zve~S+x3}lUp~LlO6%YV`X`0}E4$Tq*g|ZC*$mepP1|<(;k37@UQ@c)cspL-o-2<6y zx~8-9@@@iQ320mhtgI$M2(X@61!D#vCG3I?LV&f*Dj21Zjzlt*l#DR|0Amb-b10m1 z7;XcKq9Py;LU&Qb<4^3F*=f1s4Ccnj%n}GA1U* zieJBf+4TA9x=ho3zg#J^kMr;Cw{x?_>_+}^u%&fic5Z5Edj(Q&mQ(6CH^0tm@$Ia?e6Zr$$L-UA^(Y}>A`C)os$GYqy>EEaqK zC;&%-q#30p0I+S_+8N?5QcACslI(L-N=flQ_zm52>_i|8P1XPa002ovPDHLkV1goq BQIP-u literal 0 HcmV?d00001 diff --git a/libede/res/actions/process-stop.png b/libede/res/actions/process-stop.png new file mode 100644 index 0000000000000000000000000000000000000000..ab6808fba55428710250c72b2569ca5288cd6df2 GIT binary patch literal 820 zcmV-41Izr0P)Mc{ zK~y-)ZIioCQ(+i~pL6L2ZH>mr;3bB}Kr47@YPbohHi(*-khrlBSo{xMIye|<92`s> zj0 zfhzpM@ALIWhKAhp&ub29c4n916Y9^A&F#&y1u(Xj-$dR3#d>J@)tT!?^ zxB;)Of@N(J5UR>rI!z!F(O2i@jx3c*X9mOJ=UQhb^X7PCW6$}40e3bY$EvSKkHsLF zL}s%av!6J@-n)0HBoY{3zj8br){Ru^=#NAqsP(AolnVvazCP5J7L<+- z`2HPr|9>&Rx53dc9cF)8t|?gl%I3HXy4zQg`&b zxfypTgs$s291eB|gVcpW$SN$#WyIXvUjZpZ4OUxP@ZP$G)9YnD9%prQ6sO07@7_H; z?d_Pk9LBeA$dwfUbSdSAnqeR;i@LTpTvd2+co^F>(SQT}{nVX0#rlH>plR6EqS^&1 zyDP=w;XqrPR!Sr&y?#yQ=T8=H-lUw#P+nXl_v#gEv$G^`-$v0ie11Rar6v2v@^W5@ zfm4IGCmR~NTZ2JYDjsL8Sgb8;>r)&K8k(9&7YgEII=x^+r#1#60#9C-Mn2yDwjT2}2(B$L*s yY<9+mt|%;SyT+{|0(y3`SA}UC&P8E)GxrC_O;YyPhW8Wz0000Mh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00Kx!L_t(I%bk+TOO#<0#((ekjhC6mOGSbRMNpVSmu+6M!9`ghEm}pj zi;!rSM*lz%t-~&~s{9wy0>R1|n@9>;STN=!shDPsGtSKSy|)%RGflM!4?G+Woac8q z@Q7QtZ{7v^*;?HT0R6qEdbi{r9U1Kp6o;WZPl?B-|HEeK=!|gX>S+K10 zgS8f8EUxQNTMLal1mUp2aV+U{n&ssmOisQ=N?8T~XuZ*e5V)>jSCgQnCB**LeN@*} z<2ZtV8(@7s&&p^=Wxb}n2z z|2H6=_E}w39EgPJ?&=~rljQm6IA3O~QEE3Jn0h;fQa*={9IOPatSF>(2nK5j1`T!L zdd9}aS(p#vx(&FlKnTI=cS(E4Q4)zn8PL($Mm#oAf*puN5JE6FH_MyE3dWQVoj7@z z=H_P7KiA5Dfx)xbL5sB;dT{?C7E4uCfJejEa9tOR1xslMK>RC-dqdCI=}aKlIIA@H z3gn-XAT~Wgp#J)efywS;$G6p{&NM|Yea3Y(*eup$&^nLNIkd{5R1T%GNH1G@p$e#3 zTKX2tWY*3Fg~4@0;J*Mpi&gU&=^<4C-_IlcJicGR_i{MJ3<0W8D8wHRKN%`U7OTKY zz{jGnRsp6$;=|R{R1Kb}l%!WH|N!0000#yLz&Ndx##4AnMLxFXBZ(g%HuJ zXi&qdfM(p}?71_;z-a>z1OY)1kR%Cdn$l{uaL%E% z20$r|G3H}0Xl>|O*#nSQ0Qr2LFbv7%a)e>nxm#-iK?Fn;rO}H#*uEVR!P*eOn08KU zEzY@4ZV^E#g$TGTkl0Q5yTko z96r1hp-s`2)|%YZ6svCDq_A@*KN&-G|2`-NL;2>{ay<)mpM1>)Xl?vJ194<}C>UEMz1(#)? z2-^S9HcD2kVCu*bayPCMH=C^7umK&0EG{h2Qi}O%6`Yd}!S|+-h9S4NY{31bkNg24I=4Iksz%a>Tzznj;k653ieJ|1K8_%QpT zsQ-%yp65||Q^JNmza1DLpU)yz5Kkbm-p{$%*@Oz8Th_`>gu&CBehx;5n=4n*f;C^bvfq< dg5VDz{U1L){aup)rDXsB002ovPDHLkV1hluXGs76 literal 0 HcmV?d00001 diff --git a/libede/res/actions/system-search.png b/libede/res/actions/system-search.png new file mode 100644 index 0000000000000000000000000000000000000000..fd7f0b07a558cb6d59af96bebb672bf1abe96c88 GIT binary patch literal 935 zcmV;Y16cftP)&ujZZ2vcpl1 zMZ@GK2apA{PG?ddXEM`!?RHyZ=kcza{{|ocz_G78)~3_xTfzOGVc*@!;z&{~D4M34 z#HCy|oAJK^O5@u;x%xm;z_nWd04$M+pY+%HrNI}599Zr)1O{&1Fr9gQ zRx^nN(=^?Ylb_Xc3crTMTm|}8W6tGCdm-gHU zoivEbfP*V-h@Y#f29hN4c>od3S|m}D80SwWrl%O%n5zs-y=aEVV!4n`6c;!WFs{rR zhNug$8$G1gD4`4AaS<H7=eg9>uBL$90I_nW$UopHtf^aCQMJwQhI406Q(#?y zO-@ZpM5e?TYiVd$*M}u5U8hd09vd6~!{hc8oX&FDU*~sLS6AD5dV3x{dHP7z^Tsz$ zm;I-vElqH5_&#iSZzKKk>qUmIhNJ7$iG2Xj914Xt0)Xc8`7QxKZ+qL(^TA-S6B++< zPs?7gTFc=3v)=)}CSYu?u#}a#&H(^gTU%RH&GN(C?nC&$dI>wJW|L@7q6Gi|002ov JPDHLkV1n1##MS@+ literal 0 HcmV?d00001 diff --git a/libede/res/actions/system-shutdown.png b/libede/res/actions/system-shutdown.png new file mode 100644 index 0000000000000000000000000000000000000000..afe62deec0e8feed4e6be87caa51d7ddd25e6bf8 GIT binary patch literal 534 zcmV+x0_pvUP)EFRQ%yB(9sgfI-bk0}gtbpWk3{eHiAB@9Eh+ifY05+YPIlvzxaV>vx&79t@Xcaa1W?f ztE|^+y4@}SNs{pL@`AM%DJ5B!l>vF>uh%O8-`1;dD9?1OcPb2x~3I7=#dy zfV_pz=QD8}Gn>sg91eJ%ht?XcHBw5HQbjM6`T)QfgE6MKjH2kj1Eqnt??1jhJI){f Y0AmoeGz7(IqyPW_07*qoM6N<$f^rw)iU0rr literal 0 HcmV?d00001 diff --git a/libede/res/actions/tab-new.png b/libede/res/actions/tab-new.png new file mode 100644 index 0000000000000000000000000000000000000000..3e590f6fe771fb37aa18faabdbe37361cc573cbf GIT binary patch literal 514 zcmV+d0{#7oP)E!b}$f_M@kmqJhd41!3Z-u!p) zLs;i~cm?=K#e< zUnN!Eb2~RD$C2J8Bs~KOfwRxHNWty={NyOoGlTak1rHpm8xv5OYywtRm*1)CYk)Y8 zo8wt)0r>Foi;R!`kYvvQB5A6>`@_&bjNDuERyLc>&&|%a4`B9?+78Hjz@tz+b&{Uh zZzRai&CYXt{GD>S+(>XokLi2(2H_W(zFiJJd(#X^~`;~vZ|i{0jM>G49Q4TqW}N^07*qoM6N<$ Eg6%EkcK`qY literal 0 HcmV?d00001 diff --git a/libede/res/actions/view-fullscreen.png b/libede/res/actions/view-fullscreen.png new file mode 100644 index 0000000000000000000000000000000000000000..ffdabd4e97cf7b4d3286ea169c5a71b2f889b052 GIT binary patch literal 650 zcmV;50(Jd~P)Mh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00GuXL_t(I%bk-uXp>PC$AABu8#NVa(wI$T<{@WGkC&Rq}NCt4}x%j9e{w{GG08_2W z82w8IB#^|@_+o3% z62b*n^?G2CgpncfV1l`YKTLhjGCTK^?5{i{FQ&+~TjD@QIr1YpnEWG%pTp?h$I%#R%DFN>Tzx)VuA;$%;RRC=Co+23>x zBpc7cvJ1JtOWb!3dz~l(Brz86V`oWowDaEkzU!j%l38$)o7}}cCnx7z zVrKYAWwOsS=-Lqw-t?qu)r6QQ!notg696vQmg&~r9t3cLe1UW(yG7H)Ku^~yeO+g> z(bg0Jm{BNJFfw+(d}sQhCl&9uE%R)8S2n|p?*PPznUTt5*BiPR+1l3~ipPS`iO?Jk zARN#U4H*a;0yD)$9M29{3dM>Y4K?&WE>{g^G!Zl7)jelV^{i|AG#D_%trsJC8h7YDw+>Nu`!(E)&&KfE(t5U!_KF)uRXGsl%@ z#;0eK6ZhtiUhin`+P8I6C=m!d1ufk}o{_gOutKfI-_b^R{JP z`QzJ2^LHMWS&9G(o-t)@yh1Uq9cxfG6X$C)H~ghbOC7?WrZ-yyL0>0QOs`0x)U>uAAQg z>;&LGL0Gpf^PVr@oj>}%1`wDT7wv!4sq=s3q*Oh&WftpMhqGg=O68@F-$%x80Ep=T zKm-sG?*3PXAs8nI|0Dok)RR-0Y?z4d_HJBzCO6*s&6^5?o^0No>h2ra)My_p{u2^&LcltM%9%NL@3OcL;J5G-fbF(raxE|ezWFU8GbZ8({Xk{QrNlj4iWF>9@00FB>L_t(I%axHmYZOrw zhMzMtyOVX@O-K|ZVxt&TL<0VUfQ6!V7J?#(mH0<21raPIq_wcH5CoCLu*M?gHjxBG z1i#1{m38KvW3hL3XOju&feVMreV_B5_X_`5{-b^t((@2agMEX3M_PZn0`TJH^Bch8 ze&S|hiz71~W+pdCYd!i|8#R44-FkN~32zoJEL_}we6|Gn7m#^~PBCF!wzt=>Lb{X; zExL33^8HHv?MrXDbLBk;+Y7X&?&8@a(%Nevni>MkltV|4RRXm3fv-ECXdLLW(|bU( zzCk~0Gf}th2;k1j!)v3^@S;Kd9FaXG@-;-(aXZZC?`N27cHWEtYM2=ghyxPT0Dc1X z>%`1~_wZMh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00H_*L_t(I%bkU3zgc4(N=eS6`rHdkVHpB4Gd~^Q)%$TL+ z(nFxk*+$tcEtmAp-P>n6{p{&;+~39K*2_~jwpvG|(*f;v2Wy3)p>r%Q+ypoVG@A#f z0zSOo!&)IaY|(5Uas9?zq9uTtnYmK|Q&TyNF{moW7>qHAW|o#q8a3NIxPR}z{I5QG z!letDeg)lbkMinceswy1RTcdQKtzr$+*(=T)!GZZhl`VweBIy2`nm02#rPq#jrSEB$Z0h?RKfv zD@eQD#>XC2O+o^Q;}|e>Ivu?C0C-ibwdi0@EL@qI;r04D7{f$1%g#;%?_L zlh0~XK@`S+=gi!>>B3q_v_kxcZ_{oR>#m3veE>m9V;-PT3KGm-t;^!dx;45I#24`o z=^{-*xN~M)q&FHHO2H2foHNXP^PTU^NY0u6fd|;x-Cl9dy)m=ac@C-S2zavjwDZaX zcwanUU0H1{FJD1baq3W2R22~gAm>C%lQ=vaF7ChG?*S8noYSR?OG_LMf08qZ%Jeol zN$XBUgjVx1DcK@`)*Exmq?C|CP_MYc;e*E&1-)LMPUjgeI4nj|O0ymSq-1#Sk*Rb+ zL@|rpxqF*-yNy#%_6f82$B#NOGeRg&dUrTCiNS|Y9K3taqm9Qn=Ln%B#(xNM&P0oN zU!YS19Zns|5>-|4{o4XfsPEOG7X_4x#rjQH1x=0QYeYJajg9FLEhH*efJ^Kgx$(FhS4PYKMdGx#`onRC8y w9s&{hg|G!6^>^Oc-Buu+O9E6|n_UC=4Q^kesR)lgQUCw|07*qoM6N<$g4QMOZvX%Q literal 0 HcmV?d00001 diff --git a/libede/res/apps/accessories-text-editor.png b/libede/res/apps/accessories-text-editor.png new file mode 100644 index 0000000000000000000000000000000000000000..188e1c12bd2de0029c75eefc6c7c4753b86b7d9b GIT binary patch literal 574 zcmV-E0>S->P)2^qNERY3;<4ZcwkNNp7Zp5;AjKf{B7T6H z7K$;wTN)8fToCQSV$+QqO#Q&sZ0iseT9M6oFhjF#YAe3W{|(Ih&u?blgZ~U+lHy(Z zfEnP}R(g1dys47_mq#z10cH*!ci4`$5?D>W0r2hlIkux$PfFdaJ1vdV-c&$Y6qM6=z7>zUrb8|$BG>39|jmV1jOTU#EGRpi+xRHO?}@de@`-W?HM1Qj5D_ogg}SY zdLN|}^?H57O9w%Kn@Oz|d&_(+O?3c05d+({v28n2?E5}$CdJ@bk;TUuUX_^(h)oH!))dmc3|x7NH+_f7=kKWb2fXhZ zrnAjAMhLXlWV2a*$wSOL4(~qIS$aJMy=iu>tN_|Hp>9hMh9SE@rg`+GoBO#O-SQ{L5?nn?G7$uQNU|ANHWktGp13@enLu*Z~ zRzquzloG8qLI{Kqt=k(B1Emy><7_&0#$n<^0M7t*KyZHC1w??>xEt=fabLR*P`s^00F8@s%vX0ly3W2Q;1iYQ`2d{1 zn56SU!aH>A*UV&krU`gE?uNYufcfLL`>KjUEiXOnoQe)`qCG}W|1bb+O7eK1#?QvJ zs|dgU_0&(D106tZ+zosBJd?&v>qnWFmUKydqeslSKE)YIWlRZ)Gjda>n*%4R*)(?6s}$J0tF zrB0rXshXW1sfM?{P>GRo72Li*T~yy3kh%V?FTe2QhE1d6Y3FzU6LKF3;uj?|T^;O;NgH2_-9*%2UxlCj?MeRpHZ4w8sFjOr1-Y$4FjHVOs`O z6+Qs2{*%TqbaEVv&fkX!tu7E!h&mkz2FsQcy_m!>B&KO#Sq7GA5DFBqd&fqUQXD+m zfn!?;p^>;U$?D=fJf(uyMMMYXO4>Md`aVN{(Y9gut;(G&D3o z09{?N%Y*_27>1l9_a8%EHtR(M(E9O_Gnox*SF!%CmFQBU zOF`};huu%zOT%N;EOv}x2@;w%)hg>aX0MU5~e$Dv-j=Valc(v;nT_sm!fGJ@x&;<^^bV( zeDYmpd~&)e>v=ba>Hp#^rKnR%1p%a#U9+>9PK^lLGYXua=0dqb|0 z(0Aed#4mEkrXFFQVIkRU)!iwO@P)-K`H`TB-dCnMEei~^#gkV`ducIu)E`>3<^AjG zztK&BfkHBj6^DMzTFe^of29Ve$ooUjD*2X*ObOZ>y?Y%u!-GJf7{-VfofVRNRrl^& zA4u7ByT`KOXwIvCK3V<4ybKHqr#Hn33O05;u<$d!$H2qsdoZIxGtYU;WIu=L8{Rt1 zcMa9-|9(@J`Qv$g`5*Dqb~CuG?wq}|YY~H>BZuJ)ub;a966xg(BCQv{ZcM%SH|N!2 z9dFH+1n23Q)!EOlecrSASW_MIFQcQU1?I~ieR%rw>)mljBv$9#p2l!3b58*Q7;IDui+ui&r$;~AC~$Nu>2&ag&oQ0@?kEP)R4zO-SE_shK7L#K^bOYL`2|4i#%^^+d&Zo zk&sSy=pcw4>ZZxwY}*bA=G8Pha*v|J@tT}?%W zfngW`WV2bOr`~d}ruX2F47l3KjU|BXjcOQ7B-6|9cn5Kyc>qH_^Pxk?Y5HvP6 z@NQ%F=Lf9UupKV(UBp_bq(9L5mb75XrJ44nVXyC#?3BIa!Q*#eDs))^YbWW z`NsDFJ}oTJ+SbPAhK=hul>Tj?q2ZJq>dv3z`|8@kUyxGLkZ9U&=waVr86b=ZH79G4 oQU(Hs$Hqtd{^O2@kK`J+0Q~)|WKOu)r~m)}07*qoM6N<$g3M6(EC2ui literal 0 HcmV?d00001 diff --git a/libede/res/apps/internet-news-reader.png b/libede/res/apps/internet-news-reader.png new file mode 100644 index 0000000000000000000000000000000000000000..a9850ee2cd5772d77d85b1e0cafb778713b4aa26 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE({w$@cHh4-+>~W1s;*b z3=G^tAk28_ZrvZCAbW|YuPggiW^Qg~6A7WOaq$lGMz+)FO4`_Yn*X zjIy3Cjv*GOmrma6ci2Fr)!uoYVse?4dzY37;HcOU(q{XAXF$#5gbOns*B;*@cLiACah?`$rO zl8=|enc}X$K7ae-(T+tLeSbJ-U46y;z?b2S*yZvEpRSy@*jYcThS^`dQcLUYbTwd* OGkCiCxvXMh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00QhuL_t(I%dL}LXj^3*hoASH_nc#sG-;dWqm6CW(4s83b+X9Bt0|~3 z6mOI%-9=?M5O0K`ptn*G#rs`|6-PnD>5WW=H?uIcvzCo^E3WHYKeL=HA5C(SbCR6b z3)#f&*5~^FdoKR`eu4)${@&~<;4NLs{R%AQ`wgX7&~)wW+|1M$58jLW!S}zMGrL#P4P+<|J^kR=q!LjUR<=1mzj7BLp1miL0MTgZr{|x^iYGDyl!|!#OL6OV`f;PXlOge)!c#$#{SGXl@)s^XbSCXaYk@OhXc|B#CG* zL-81~z96~mqojuij=b@~*=YbR90{B}oE@c7E^@~W5Fg%$Qs65I} literal 0 HcmV?d00001 diff --git a/libede/res/apps/office-calendar.png b/libede/res/apps/office-calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..106a592e671bb99e8c2288231db2a23009b638be GIT binary patch literal 603 zcmV-h0;K(kP)WFU8GbZ8({Xk{QrNlj1+3MgYKATls8GayP~Yjt8ECu(VJ zZDC_4AX9W@X>Mh5Co}I@0004=Nkl*w2IG?`^Ze@_zY&HN0A^r(atJMII0GUjNQmJ&+EQEMA zC#B?kK3@Rkckd|{izJiD$OPf$ry$31NTpIN77OG{H$Ht1!Zb|`!vMhZP8i|l$z(#c zS|y*)~=fa?KX$Q0oQePp>5l`#xRVCBqQuWE|+7yUNaaB7>~#Jz8}#nr9>%(Wm(q~0Q7o2 zmdhoc=h5wUaU2KBvS_th)a!NT^Er)1gIFx~yoBj=sz(fVErejd-|G!XDI*dzAe~NY z(*l>3QYfVmLZFnw_kDeqNF*Ks$K#RVaCr3%y!Kuw6fS^=hd*q$TPl^xi^bsx3=Mpc p+wYqj;OqVU?>GOEKY#tW`3q=*efBLWYwrL6002ovPDHLkV1oAM`$+%* literal 0 HcmV?d00001 diff --git a/libede/res/apps/preferences-desktop-accessibility.png b/libede/res/apps/preferences-desktop-accessibility.png new file mode 100644 index 0000000000000000000000000000000000000000..b365c274db8ac6a0cac1fe8be3e717f8c2629754 GIT binary patch literal 652 zcmV;70(1R|P)d=5IA>ykOlw%0vSm} zK~y-)rISralu;ChpZj;dZ%j)j!J%JJQo_n8DF`B=Rt3>23WPSzqM%i)S_HbR2wDWS zix2|Kjo>Z>DX2x1QCQSyL?)6G;Sbu(eBXClI8Oep?5ytM-simUd+t$f+3rr@2J5RX z+Opk#z15cO_I43<_WBcM=ZYAk(OS{EtDfqVke`|(H})F$N4iIarBTjv0%0F+XQ zSd7usZ{EO#ldUvvOVjt_Gv6m?!9!98BuP^7p#K3toJE`^NfbLWwE!G!&Jc)0#1V)i zkcB&|002%bB9>z8xq5Ga`9g`Vhc7D+!(ag$AyY%s_B7-9Sqg>1$_xzFXuS7S1rDz?cY5EWwWd1d=s4a)&)^6r4s7Ma*Q(W1 zum-fz47~lp#ZxVaGdQsXq2+vgBd>FLX8uIfZA`JRp>FLE6)-fCN5pdF^d3B(Pz=w9 zC;2iygEgA_{lgTCC5|-LE(fHnCej*|;@#*kK8;Ny&Y+Y=0*6)_r4&k)JFQgEnLW1V mx-I>-Q503qiy^B2UFW~M8SnaCeZtHD00000x$iEP)fA{~ocht;`7@dh)ghXnM(qI(ySSv;gi55W{9~87|Rf|BECB2|U z5fmi_nGh}{CjQg zYnuG^R=-I<4NG{$Ib zqp{6W&tCulZ4|~R60Xm=o9!$tCTY0Wl^%5LC6F;Hts;$5%eNb?3D_Ff^U+Fj>GTn7 zEm=&u42*u^(TlgZ!b&eys}(3I$=w*>{K$+WU(amT04}ouwVISd7iVO;l8tQyPr`P#TS_ zHPHeFK1^eb;_T64e0&@udEkDcyQhna%5vfpary^`$jQ!PdS-S75Kw}Y5MWshj(y|Z zq?Y$*}m;1OPeNnH)M$N?~CU zGk1Hj{`byR1>_rC$*P6v^%Ne31H0000d;9t_LRol^h+0k%m* zK~y-)os%((B0&&^zv>?G7Bq0p{1K)GW@4n6nFvOLxA}p4k(+spp0M#HiXa09W~QEr znSnpR#9)4b80aw5bAjvZc-|!zG)>W6@6~%c*lV-WL6YQ?oKmrFz>TJQclK@ebRi%^BAFvJLeL}scu zfQUq9UGwAdNV!}llgW_HW_f-6&ePMENWv$;M{yhkV87o}DwQ}K4z$~CMxzm{)r#}^ z{FjMJqT=|TNF?ZXyCjoII-L#xo6Y9_6$H7_e>GL);;RJSXfvXQEY4!e}EP? z{s9qD2#DIJkbtNp#^`QB67Rm^A;j~3!#;1TUBkmmsraFODQ*F^*ifh@_$vJ?PUXs#Fg zePAz;rfEW4>cD%CsuF30YJ^5HaaiBz0J9`b>8^B<J{%jA`Y{FQ%7UI(E^kr_weS}(XOGL zHAKWMET)XzevX+D47OBjYg*WBHrlx+Y1npXS1+zG$$M!R-@KhzcLqcp{q^lF!0*FK zrJK3tEI#t2Y0kICGX3>|bpZfVUm8Rze*oojCvL$LsdC}e0WRHr!Te&fA)wk_0<&}_ zKm_L;XOHjW{E368D$e;<@AHf-YxTd{vzf+^?+jml8rlF=Wk-Dw5JUi^SOOTWi8l<0 zG;SN&2E3kliT8fPFRutQdTV_ch{loo_2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4f3BCD`GOAc$cV|}ZT%Z7_eq5pzATn(nSPTkrhCML*|TjN&a zSW>ungYpcWcTpUuy4>w%gvJ(zxr_lT#in*-H*A^}pO$3RJa-%C zm4;>iPu@LiyLGix-rmL%dx5qCMy&q*=QkSYDv4jscJX?!$I9Xzci-y|-|hir4vEzJ zE#@=&<-xQiZ{yt9_MAHpN>@qm46=L^U@x{nODo&EvSr?(Ys)?AQa2ppdHzmu`B&SN z2NOitJWn4mF!kfh6YZVP!7LYbd`9De$#OwnHZLEV+M3v2O#Z)L^_=cGKG6k?5B(~) zujO)P30dW;ETlapraRyIUKbLh*2~7YGKCgTL literal 0 HcmV?d00001 diff --git a/libede/res/apps/preferences-desktop-multimedia.png b/libede/res/apps/preferences-desktop-multimedia.png new file mode 100644 index 0000000000000000000000000000000000000000..2e5ba43c9b1dfbef0931dd86f87c4bb4680a1a5c GIT binary patch literal 650 zcmV;50(Jd~P)ihZQ74mMdlDFM6-x~K()|;QD;D(ip`VT!e@!8eYuMR=YGHU-19w0;2@JtKL^e; z0r6NuFb$b(T2?A$xxc?Bo6UyocDu6KY|2`_E;HG*9KLHr&B!2D9P()Z+qNl}%j{Nn zv27d6vJl8|?|mAGD4A?}4cJ&(Tw-R%MIfM~2j)-|1-ILcsvi1>UCc#Fz`7AN!!F=r zXgNe6Fb9D7?CI368d38hum%`F!Ub?_IYeb=2e;b|K=SI1cB|ET4U~bFrfC~P8kd20 z#azTRqULc0KmtO5s;UHoL2ll!S{&hAJ_XzbVl_0)!Bbs+{CR7`RZ(MM^G!cDs$P z>m2+#03i@gMVhA3Xf(!(I4*=0;KAmbO*)+pM|?iK9xsPyXHiuZkH^c8pWgvqjTt10 zxkyO?p44hpzI^?RMB?-L@MvDDwJL?JJcX@1Kzh<(31=6=z#ZVsNd6x1A|6Y;oGLJ~ kl~;f)a48;3Mh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00JsWL_t(I%bk%;NK|1IhM#-qj)OBcI;o>3XiBqbDkU_c7NM3Fw1~t} zBnTyJWe`z87Gzn_PN+o$k&*;0T-2r?!WyDQQXteug%(MpmN}!&opI)R?`bh<{sfut z?)}br9}e%Quu4rAdQJmvHci_u;1J8wMHp0VYTu)qCmyWcSC)bod&|>o>T_R7e%{_) z#gr6g<8(L(N8?OhyUN_B&lG+L0&uIbelgas00hq7uXMT7-yf?gQ_6f^!qGTCLSNA` zypZm}y(1UjzyQ%;3NYT;Nd+hkjrF1dWM^l*s@?Bbc9w2tdTN54B0rfq1;pkJCdR&C z96HQsbv1vJ+S>83E8pvJS5}wjKwv2}Q&3FvrM?yb z)t%`)RpBop5}sl*;l#UTDC2D&49{}>=sw)8be?qwRxEct8CzT8a?{?h z8;{G*>tUUQVXp5NmK)trATG?r7Kn%mWc?rD?eHw~hKXqjnNAyqDgOlg0vKJ+bqoY2 QT>t<807*qoM6N<$f;N>j(f|Me literal 0 HcmV?d00001 diff --git a/libede/res/apps/preferences-desktop-screensaver.png b/libede/res/apps/preferences-desktop-screensaver.png new file mode 100644 index 0000000000000000000000000000000000000000..dc297db176978eee43cff26b59a6b3f448f6d3e0 GIT binary patch literal 707 zcmV;!0zCbRP)d*CME);{`&v`05x<) zSad^gZEa<4bO0!0DIhX1Ff<@aVQY0_AX9W@X>Mh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00Iw5L_t(I%cYV_YZGA9+GM85%rxV;$c0w3ka*z0 zcMj)$c+cSz?%uoe1PIbzgsebt{K9x!>S!byv^I*zk6w{Xr2au>GCVTG^&1laGy%y( zia@~6)YK(Hp%+Yyrir}iZ^}BIDpxLkWI667y!5^a5cjhU0~QxwA_ziL?DL&KmQ}X4 z%4`)x#zsCI@FTV|IWsd!E>|Xn@U1W$?IiVAlGlxLDMgoed)h0$^iq z`ZL*0C(e#Nyn{QWzPbRtwS#=VO1UiJaM-ciB^(Zk@UoY~eHDDC@_hN;!_w;M)((b8 zJR}oqE$<$Q0XP5^c*odz@85v=h0B-=CZ<_SOwe=<6R=rrwLZ0ebEXamMI+I+f1*%- zIDoEOx98uUJ#)_aBmJ#c(=<`nYsWH8aJyX$c}{98t1Hjb&c+>ZhCtTq3rHTnM~#+IiSM-#&4!6+kB~kbY*F7WpWA%Lvm$dbY)~9cWHEJAXI2&AV*0}P>|V+ZvX%SQ%OWYR5;6R zkj+a}VHm}K@B7|QXB=lno$+JP6e9z5r)UPXXd$_3(LyqU{)&Q%D9BZ9+O_Bd`wJ?9 zc5Niu^+n>4W~OGM_?6B$_rCXS5tiva%frL(Ip+utXz;?FnT0jcM!cTRzPx&IzhND` zSXdKn!>2k;L#|fnFrX4f>{K+L=Qb%$PLBfdfPs;*_e&e5$6zS5w21q6?-6JN2*7Y| zWR&709638?x(j0B`GYGb0puQFy<~bu&YvNj@R(ZMq_4jZCs~hEoui|>mld6)wY`>EpQ;>sw_CT>}ga522)FVXe&T4@=m#VmC0vR>)LA%C~6Br%@8- zmpAw}@s^rko0Y;bT-QS=NqMLIAK-6=e9GXM3P(E%{QO#^usTC_c^3D_cN$jbn46lS zA(x?4D#a&gO2hF&HMR)IXL^}__5xd!5S~P?F4BMEG(n|IAS?vtFd*eaW5y+_xTHOp z@k6{?8xcu%1A{9yLPj`JV5yh{Qh==>A2LYuDRKf^@K?;GeB#vXDtq3PFG-f?Q z9Z{1>(_SC5!B!b|D;lj0LJ6dhShj`G8cS(>M`4VlKJ8JPh^bHtKqJZJ^Z2gw$J~1) zpsp^9j$GdzRlmsPh(luGaFktJ~GLN1-WZzz|_{WZwymj-oE`FKW naXr^=YiYKx-MDT6`rzSj;egEtd1;)W literal 0 HcmV?d00001 diff --git a/libede/res/apps/preferences-desktop-wallpaper.png b/libede/res/apps/preferences-desktop-wallpaper.png new file mode 100644 index 0000000000000000000000000000000000000000..e7cc834c5eecc8c20f9a25d73ceb030c2b4a8b65 GIT binary patch literal 793 zcmV+!1LpjRP)d-EeoIm2loH~05x<) zSad^gZEa<4bO0!0DIhX1Ff<@aVQY0_AX9W@X>Mh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00L!6L_t(I%bk-?NRwe4$3O4hZEn-~pHfPwH8Szf9EfG0uAs6`5p)nb z7U@AED^aLpR9*@?Kn!!U1oea7g;v)D;V8Va3D+L z?6E&Mola^_x&bikCL^0G)YZBvF0fHsUW6n8l9U!f#YDB+jo&|)geE(XC6EnpFxQNK znlARE6R^3udzcEv7Oy_!J2cVhYePXIKHybsZr@I>704GBZ65z;pmEUvS_m zFTs{uw*A@$2_bZJT}KT~@a0>8tyDmR=QQ=6I&^*e(%XS2Sgj_Um6y^+sSA~Fd7* zgaGp{AOUEqs*b#T)w@wvcH+w6LnZkR$5BguUV*d($VL;8KvC3pKzt`uDMgwM$N}s( zZeG8WNF*|Jp%=-rA;;y2opP00`8uP}*40}9M1WO5k^bk`J%4m<9ykJQwsrO9rRM$u Xb<*xP2{dij00000NkvXXu0mjf?zmVE literal 0 HcmV?d00001 diff --git a/libede/res/apps/preferences-system-network-proxy.png b/libede/res/apps/preferences-system-network-proxy.png new file mode 100644 index 0000000000000000000000000000000000000000..bdeb79d86a2df9480b0cb5b78ec47bf983afaf92 GIT binary patch literal 829 zcmV-D1H$}?P)Mh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00N0gL_t(I%dL}LNRv?*$A9PS-QG2I^V{XOq7WJqq$G4>fh84U7loBU zmL)|IK@=3-iBLg7g&m;&HzkOkQ3va3b8b8VkJEt= zJHrqOkdzerrn;g;^o%;_x?e}2_YUVPLhMN&Vqew>HM!$ltB&E@PZztk7bO9$VW>QQ z^+}U8HNm{2tRU()hhu@s2^-TkJND@r{Jtds%8E0|Nlz?4e5Jh}K$)`BqtS@bXhc<204%CTQ9(Mu0RZLqVlXAgnn35sY?N6_$%&Ko*r)9b4~?Se6#)D` z9~)CF0HpxZ9|%cRH6UYCqsJozO94Lv{X$0D_?)nOPb1c7H)pln9`=e~hVF z7eE()qAf2!?;W(AEzVzUAAT2A_v#0G*ymgfkI!J6o*xi8rS_j) z2rE7@&#?RG#WtO4szRs4gAkgw64FA!ADWQ2p5Cl)<$voB724rR9;^?M00000NkvXX Hu0mjfRO?)| literal 0 HcmV?d00001 diff --git a/libede/res/apps/preferences-system-session.png b/libede/res/apps/preferences-system-session.png new file mode 100644 index 0000000000000000000000000000000000000000..35f8b5711a606eb08efd62b33bca3f95e672ea2e GIT binary patch literal 690 zcmV;j0!{siP)y@0~^luN3Z|@0zXMa zK~y-)osvCF6JZ#~e|PVDy(_fRz#VqLlw#_F#z7f$@B^qAM`sfU2BQup#-Mx{V(=?Y zZtm)WGNB341zq`^3||4FZ4(oRa_J>^<&LXENfXlQz?(eN`+tA$@5%EhsjE+4E2_B1 zA&*p4aqs(^8?3DS03e-Clh5bzeVSQj=^Ji|8V3 z7z#p#P!azI2&vK>)o|RPVJH%j5QeC#T6d=cNFi|Cfc`Vb8Ul8A1B6hKQq&iK5LLa2 z!ShTE)&tJnnM9MKmaA()%Bor}_lt$ad1k-O9tibB0KZy62tmt9ib^|fXzT-oN~qvJRPL4a-Blu9LXxt~nWe8q0hqTIfFs{+v7-A!w28&|ReBw7*x zlu9KEg#xQjGdH1|1z8n5K!Y z>x_&&!iY98H$O-31V0iQ)&9OM9X<}Ix3ybr7_&AC0?~*xw0;|m;9*-XYNB~s`f@qRRs*jDwC;$Ke07*qoM6N<$f`FziG5`Po literal 0 HcmV?d00001 diff --git a/libede/res/apps/preferences-system-windows.png b/libede/res/apps/preferences-system-windows.png new file mode 100644 index 0000000000000000000000000000000000000000..596caf9486998d4a7c2e772de05375bd1afea9ef GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP$C!dgrjN8+5RX`!x64!_l=ltB<)VvY~=c3falGGH1 z^30M9g^-L?1$R&1fcGh?c?=AUMxHK?Ar_~nPTK3m>?qQ@-!qMM<5pp5dB+VK1wQhN zL|Y%-{z3NAZziGp4iSl|Yo~}Xo)%!bwy1x?+@05x%FJiqRn5sWjX5```ki_5B$Iut zZ6&LBcVAxpe5v20W4E?WGP$;EF>65Rw{`5=?)Cd^wtUlV=t!?lFJIc&vE`fZq+?Yz zC2d|F-+zBUTw=CRd-8+>+)7PMmv6Rwo_yMG`~7?I?W)Wl=QUlh^3idamTK|b;MfK| zVeSWeAI#Mj?$DawZ@x4laE0vx@%T!&mda-uA)#t+jLa*7WEg$cZ#U@pCAN91AjQodNDi79I5|3(RJen zPo0{EhVu`FIhs1;8#^*ol`_^Ua5ZgRTEO;6WS?JG1xHlIrtQ_)g8XMypD%bh92XZL%@y~j=r?zX#<>_Ay zj?MhVvcApGd@i4rvfN_pU)QGW`q#B_OPRhKo8-;yZEvqm4`R9-*L?7~b=36Kx*Zc}(y&$D=J@HUQ8!MxuejCZ|M!i% z&Q&&tS9kw!Gf+%;qdi-?J-PWx^^%|^_nzBbuuzY(&i>xb{m~nYnByPzKOXhF`vT=DyyW^gMk=E|;TRE@Rs^p6B6t9#YEYBm7uc;9@L_*4@S6^GQ}$S1}BO zYIT=tZ5JWHFbvN7(dK}=0|Vrj3XI$zVS9TUP1DdcK_JkMuImH>0a{yIu`H`O;OF8Z z{)J91-HNkQt6`cZ2i^eztDR!8NMR`tz{BK3^BvrY$8m!}&IN;*rb$~{8$v)h9Hvmn zbNS>sXdWON++!sVRKNIrKAg*`8+K zI1-Mqx3|{-baaGpU6--3aXw|fAf;qHk@Wup$blHOaG(Zh00000NkvXXu0mjf9iJ#k literal 0 HcmV?d00001 diff --git a/libede/res/apps/system-software-update.png b/libede/res/apps/system-software-update.png new file mode 100644 index 0000000000000000000000000000000000000000..58f19c68b047fb2fddff951c60bb56bf03bd7191 GIT binary patch literal 964 zcmV;#13UbQP)Mh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00R(7L_t(I%XO38Yg=^~$3MSwPLsAtn`TYYCTZF(TW5)|MYO{g6tSR_ zx`G!QDjh=@h|`;a7ybcK5CtzqLF`2th|CKu2!p|-IB;cXI%}s(yER#tmt$T|UQUv8 za?bI>RotMT+vnlK!}B~}as0%GuK_=>4~LS8hU0KulBMN~iwj>rS{DG1N@kvXj0^A1 z)9-duX|zaZRc>r#xt%Gl2_ep1TwGXxNO1bXS2MO{{^GJs@z(3l5{(5>?`KfFA?Wji zt`Z#?=K97iKdx?+5aOjhi2@+gy{cHIIDdAQez(PNXbfKFV zFP~b5HKkInd!BmXD5*??_*4|zd9WCuQ7v;k`8Yxd9LHfdSD@W$5f1to%-?+)I3Vfu zCeue^NZt_DMjN$mpm!|lx`EM95#nE+5Q355FzdIraQ7(m*2+F0qD123j@D?2aNj+= ziko6Hz~4PCx|U75+$Cw6bUFqDUJtsiGZ_t1Y#BI`R0obI-T_asWmqFq6QjgqVRo{+ ztfp%ixM&$3KE0H}EiBH@AEjQe^Xng5Ffc)ID^&z$B}JAl?UtJuwgSLJEXv#yL2|`1 zC9R3p5$sfKR8>XOG_2OFj>mBNP2T9mW zhPg$pWnWmxVos4jgp7a^{02+1-BvSs4N$9LMfDU32@n<&O&f{GI3j m*M9P$3HD?8!Bg(T$$tO~BVE)oqR18i0000Mh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00P@dL_t(I%YBneXk2v^#(($TnR}B-G7U*PrUTYAO-$_~)`SY0g;DBQ zQSd=%U5p#0rCSRvf-7|?=t|wWF(@ulNPHHB5F!+#1Fo1C&nVpwJw|91JDi>Ji-p;#bS}#``x~kI z0s;lstrNJr$VQoFb(`U*UZQL8VVrsiYbTG9I;!@JK0XF~w9jh^tV?~3ribfmSd|S@ zO_SvPLkQO<-ZKQ6fxU4Py?-DMJbITvW^y8%sEzc`E!r50LR{};2bE@{iYVQ}EG*$w zmXWBqZes(pJ{Y;Tw|dLX z?scdEpq)6?|Lf^thfpc=!0`u(^(oXto%ZEX3jb6XN~;9PV|d0fYE`NHIA7G)c8{jh zhcnTwt=xRe1Cf?h+U7~?Gb*x+d~*;%Qp-Pm4X#hWojr5O zP%@Jf(dl6a(_IC?UU->DuDr$<3!A7~oHw6MGxPD6oI5{G*xtbhKWq{Pf{_z_1lOnU zxKMYy5W)f7;sqQGbN<|;A_P_@?OsKBdB%N^wYXy?z{hX9B|AAm%qhztbZF0Qk@v5O2m zI%*||rg7igS9h|o2VVr@J>%<{ ls{n0#&7ONiSw`}me*w>=TB^eO7GMAX002ovPDHLkV1j#Olc4|r literal 0 HcmV?d00001 diff --git a/libede/res/apps/utilities-system-monitor.png b/libede/res/apps/utilities-system-monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..8734e777a1799c9a9d0293d692b3549f2506f418 GIT binary patch literal 611 zcmV-p0-XJcP){lZ-v(r|Lj~5OgyaOZ2LJfeicB?^@C`JZr?Az7B z%cTZg`BR8Uk|Z%vq7ZR}iq)SDP7c%v1Bu8L;M*)gFoKYRtH+LS+(amWlo3J-J~!s*-9O61 z*EP)dJ6L0}#{PPO-3oZ}uA3-Ts8|uj3L!smu=5$dStASro-Xy${E-2R?G0dc-WEsb z9nLu}J?g;u9cXRPR%3Ci1{(odXN(OGaBuF_CfwpYz>BthSnKb xD?=NN)@$d68cm~7Ux!IxdUEo{_J8C5<|lAN08`nh^nm~X002ovPDHLkV1lX$`TPI? literal 0 HcmV?d00001 diff --git a/libede/res/apps/utilities-terminal.png b/libede/res/apps/utilities-terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..c5b797a7dfe82a52fee3df9c7e19d49a4461ac02 GIT binary patch literal 668 zcmV;N0%QG&P)LL=FWNdBW7kS-|1Flt9VjZIBnic?*Db$yx>QG&VIP!QSJs zc<=BfKy0=M*Ov)53jjFhb^=6%sSh*s_1@*#$P<vkh+39&!fBd1N{T!K~miLpN5%0^7 zP?hbT6c8YA-0Z%^@Yn!vCnpHf3aBY5S34BA-9-fWI{S@FS1*DHD0nwMQ@+zW=FIu_ z^4U4Rs|JAcE~$}90nl-_txCE=rBeGS5Gby0{l5*X^50PdrIZG#Z$944!ootiUH7xb zBZrCN2&L5T0Mu|cH-BwxY&6)|C=!MtVYo&VMHp+a)?&9O(ORrEXrozKDQMtnAmZ=j zm%fwD&0jXgWVF_mQ8uOw*&b!BHAb7*SUV&l_x=LcqJkHgP4yiB0000~s5J7JDPHfNEe|jA6@tsBpG4bKa)0S=9 zi&w|44DR@szZ%UP>gnwRaObh`%K*OK1t_J=d-JpW#PPl!rPO`^7{2tyE79g?q*&Tu zTI=qra698-k}=`g1#r$w3k(0iGz?ZQm*ZE*t_(^kuf<|9tUOrJTI>1ku*HSA-qHPO zPgozywY?U5?v&{kC!yU90FMFAo=N=1IsbNcE~P`E5Hb%k zL`37y*C(Fxcx%shb`SX7(ljbti_ppjh`_1=6XEcvOLWrB=S{dSo(?x5O?oqU(DuG? zX+TQ8hGOmp4AX=+^agJKlu!ZyCL)o+BbCbaPRr^J2_cnosq8wa3)HYi)9@I}CjWJK z3ZBLsvRii%YHR}cwqy1F&%}R>M&EUExuMQ*SkEjiT`O#DI{Cr|_Z`+PLNfeomr#hA zXm6-TGBJnzltjgGpxrVE1nxS{@V?eoN-Zy6IHpu@t?5(3=TnWZ^Y8!8tRNT+ApT_o z@-MBqd!rF5-taX=fWPX+>)JyM#&Lcwpf9|%3W2Y!;cH}n_G zSGOb>FyrPtSATz4FqXT-w&T0C?39fNZZjD{y+MC*`V$Re99;E`7$ zK5`JgNDM>_j~@O>tm;Ab0l3AOG==m#00BhXQ`$W>?bJk2%J%&S5vFrO$L{Z{00000 LNkvXXu0mjfs=~K$ literal 0 HcmV?d00001 diff --git a/libede/res/categories/applications-development.png b/libede/res/categories/applications-development.png new file mode 100644 index 0000000000000000000000000000000000000000..437522777b1c198d5b7880e7dace037b83f918fa GIT binary patch literal 765 zcmVe`7IhHDfAjzEZmCdSq}AHi5Xwgk5lQfacxa47gV9Tk2?^m~O5%Zo#-j(r z1rid@52}-Q_ubu@@$j~_;MF9Z|d?d z1KypQ;nQ_Y*aSWeT$+6TY>bIO`ztixLvxKR{=&$fBk9D`ZwKH~ztJXwxmhMaE>6C1 zhR622A$Wu9T_D3f!3;u77~A)H`s6dG6!^H0S)V}U?7+6MFudzEwD%isCFUurJ+!T; zyUR!nNIFjE@$E4k9CqOS4T2Do>D|wMAoc1`Xj`DoBHHA%O+ni%qium{O;g>X?cHT` z-_aE01V92{raQAohH2`X#MnifZ$ZGl!L7oyV5qZ;GQUP${!UC%fxd)f?HJ-#(RA<7 zO2n+dbp=6i4AlawmvFBzYjA4-5C0Ol(ybO)S-gr_!O+Mw?mbkOu{Nh|mbicaZ#vr} zZi>5YoIY7kVzQHJbpZ*Ha_I)$avoW;iR08grS3Uy%E4ERdkgZQ54P@ji6{17z^$ci zb4!{{b`E{z|23sFJ%IN-Swsj7H zKyURA+(p6rGtSNOHSp?lZ{4EIuOMLnkqikL64JFk0Wh*Hhxp<0UVtyBW;nj_3v-`m zKVtRak;#*cA9#q@-;aKxZYpY$;s=! z;fnJO={=l#kDASjaNywV{n~a;xq_3=(b3gAvqzGfDKH}N$6dd)dw*`u4Gol;(_nnL zM74|gRO~>CzP_?d0X_80tXxZk2b$K7!oDEMcd5Z5aTrM;A6(mJMS_!y#FoM zZ@lCF>qiR(_q{4=yt?Y$o;c^{OY4}fq%j{)=DoPfuD|F5+e@+kycvp<-#xhRn^Sgs m+xzBoi!639{$6?iC##BJ1%q@p%VnUK89ZJ6T-G@yGywooI*8c- literal 0 HcmV?d00001 diff --git a/libede/res/categories/applications-graphics.png b/libede/res/categories/applications-graphics.png new file mode 100644 index 0000000000000000000000000000000000000000..4bb955f0e6dd5dc129b68edf77419cf4cecbe18e GIT binary patch literal 635 zcmV->0)+jEP)L zlFe%qQ540`OES|jlQhO@(sZ0oagkcEwJNqs(JBU0+M>JAMgIYjf(s!Mf>;qkH-f9^ z&frRI!KIr9p;{%PD=pO^kq&-zGLs02>C`4O&rKDZ+O*<@ySR`0JDhuXgi?zCDcip+ zUmD~*^>1XS4kk`;M|x$?>A_BBmNShv9XASe#||zGa3QJ1oeZBm-0k8VN9{J!zjRgD z4FHbq;K|s;c-z3(y?rfgm8>mLN7XRk^fYVQx4`sy{@u0$ZeM#$l4KhJZF;!War_MP zc#qUf#QE2H?+4wy)=*&T=2RbRx64D}VVI_gr_bgv`yQQv#Yeu6`L*Po=c`J?3><`9 zIoNZEcez~1<#Jdxejv~$(J#KR+aUZcph1XV6GpsFfBDDs-RVmg{a z$tSwrP{7WRi`@r$h|}prHk*ZB(D3QAQmIa>rB82P`1Ysr;iHwM%h;%v)MNu$%Zg{1AuXrjNjlbHI zQ{8-*VVIF%FbG+ek;!DhvMi<_%-mmIRyV;L1PCEf0ArO(1*udDf*_z=E~8W`K~?iF zw#o|YCkz3o0iXaV&-2vp_fxOeO9AKr{FGAstpQ*hfbk1n@2>#n0o(@Ax)n?*#ZQ(_ V;wB#)y$t{W002ovPDHLkV1lFvB3b|d literal 0 HcmV?d00001 diff --git a/libede/res/categories/applications-internet.png b/libede/res/categories/applications-internet.png new file mode 100644 index 0000000000000000000000000000000000000000..a5889683a66b6bbac124673ecfbd21dec331a046 GIT binary patch literal 864 zcmV-m1E2hfP)#50_{me zK~y-)rIR~sTXhu1fB*mW+t;r+HFoo`>m&oEB9c{t2 zB_15)Ubr;l7w$(W%DQPg34y@p5gjp^Tp2rJkkE-TL0j6A!Tu4Dd(A)%Mgi# z5rD4i+^OHCT&hm6%uA(j-+k{tfZY0ruf<~FPuI>Bl+(Er%%4n=3cF+yLAoQ8oolzb z@n?hU*KQJ$&c{E0b@43#3Gm66KdyKbS$y`HCzN+yDe&BKipR4N3JX)rCWAx+3c@mI zH(H!oew4f2@tgVQ-=9AQZ0+v9kzdRP;z5OWZ;Tp^;rDrHji9GHlxuC8V?lN%Nh<1N zVJRoP!u>bcGPEL+nml$F&z!ybqp&J zoNV9N`h2HSskD^)pV<5Bhq5P{wd;q2)mS_#Q>i4W=>&P=d)7!gJlHNNxtsVP?LWIr9x?6w7vAB@=h=0RrJHa=rxwL(NVM|!=UY`0q(4u?`Im9A{pb^nOBS}n0`N3d*14u^xRRx3%T)8e}B zU)jxOQ!LvNmH!m&MLP2~`8M`&L`C$(9o>Bu$WDM1+_S zugfk(Fzu!y0=uz@f(R?p3Ncb^3+CLJi@A?8x1F7TH!gH3_TK#eyf4p>=Xn4Co!-%h zo!(K>=^Z8bkGXf=mB|0;mG{UFrwIW3n?WAk?MNB6)Ch$D{0JpUxtX;!)s~S%-A@+^ zg=bo{bt8QT#r^FU6tPH9bHbx$0YJKPf6RsBZH$GLrP2cB*;!#=u09Fwt>7j=QBpw= z>V(A!)h;(fy&Y)B%xq%l!K*}cwS%xsLS|#pI0-~}$Q4rBX*ZfaM9NxDojkp-Qt3A~ z*P2v3_XQI^VNu_3v13hy!S2?xIT2fy(}FJ+OJU0Q8#Z$>rBbVe%e^<@pMFE6DL=S{ z06fQUD_2MR+re;8o5orc)5Q4<0WHD!^a5%s^%6^Rj8xccR90Dq`J5|mt!j|13jhEe z@#(L3)sw_xfGFh>OwNU=5)FflgvH0XWhkq=R4mJ`(MSv1-db*^FCE=2z8HH>Nf`=B zeJd3gL@2Zjs;g@#8MDT~zW@MmZL=k|JI-kf_Z-Is08+LYfB<;?Y`DL)$#d8~IX-5V z%Nc53-iT(Wc8U-v0hFxUL4H2Jf9Vp%T=v`7cP6b?L&C?tf~olOYy3UGW8;dogiEuk|2f*VEn6bgl`@*=fcsVP0cmKteBp~9Ye z7T5+q8 zV9!bq2F92J!tX8}4cKkbMM_^Wh0ln$4JCqzMk$TezN-$02gZ2)%PZ6+Qx}f3uIn3K zuzW#8fr$Q@ZM~&*@<1J)Yc|UI>LI%Kck(`Z=FT@M%!G8P2e*B2`E6pi{X6`}Q7(OW vTBu~6m7O@IHYb1enfigrdXv{w`CsA(kYu;2BW(0u00000NkvXXu0mjfshAM) literal 0 HcmV?d00001 diff --git a/libede/res/categories/applications-system.png b/libede/res/categories/applications-system.png new file mode 100644 index 0000000000000000000000000000000000000000..d90ab661cbb29366ea77d3e8fb95841f1ee876c8 GIT binary patch literal 588 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 literal 0 HcmV?d00001 diff --git a/libede/res/devices/battery.png b/libede/res/devices/battery.png new file mode 100644 index 0000000000000000000000000000000000000000..8684e2a1bba516a5e9c876e29f9173718d12ed63 GIT binary patch literal 873 zcmV-v1D5=WP)Mh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00Om1L_t(I%WacOY)o+!#()2Nr)H}2?2Jbdt)^Z@1VOwOgawh%)LXC; zf<)K|3kivBEr^u`D-y&bBHm)5A&OS|9*@+}shVl0Gjs2qxp(gU+faQttCMri_vQOe z&Jp}4&hJ#_1C2vUQDEz_YfjV1Sup~*5!eG_+rC4m2?Qem45SiVy>zAk)E&F#oEVBx z|0Z=i#AYGH-Q6c|PWO+o)ba(J5XIxb6Tvk$Otj^Vvf=QRC9{>6XV+9^n;tdOKB%B> zhgc_sczpE22k2|&OUot?efoI=(&y3^78Xf5pmW zwPByw;`Wzq7~0U1-|qFKtQYSa8t(vcAP?{x#ik}LxN#_900000NkvXXu0mjf?9Y4= literal 0 HcmV?d00001 diff --git a/libede/res/devices/camera-photo.png b/libede/res/devices/camera-photo.png new file mode 100644 index 0000000000000000000000000000000000000000..1e8e88636cae3eaa00ef7a064c0c8755162892b1 GIT binary patch literal 864 zcmV-m1E2hfP)Mh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00OK@L_t(I%Z-vtZxd$}hM#XdnVTCEU&1(18>Ug9t`t~g(IrAvH(dc$ z+g-M#S@kclg@3>wKr~V-)JR>mfgRnTSS?X0BvmFM$<)D~IAhNwp84iu;YQ+C!Mi(0 zub%TBog;XQT=(=Bw(b04+jilk*X?%uS(aXGwf395ORnpt4}O23Ue@yR&ynl8gV(+K z|1iY8dn;^jZw)I2zpeaQ1hV%6NGS_TOFu9@J&k3VIF7@^hpR#eG4ck$^So=CrrnZK zG8haHnm{iUsMja>>Bqa`#Q4p(U#rbcpL)Hngboi?+d zUBt01(j*}W0{-1^^Stwzq~Bw8b(Kq(J|C`-W-0xC52fI*$7`JNKE^vYOFwM0v9`nU zU;w!y%_X&3jqR;%+U<~|BpCv7nIokHK+`m=;wk=q^arLf!k>@UXa#$m8Y|Oie8Q6_ zPxn7IfN9zM zv+2_c0*n!zZnw+A!U9uMQ{+;D%*Zl{Gg|sDfqE5STNYWCahxQWhQZ?EB6D+d%+Jp= zK0Z#dSVRaxnhrpzR}*NOAdZKzEX%_8eVWZChlhuhN+l*ICn=AO4c}B~Bu5ES=7mDJ zT)sX!I*RMom1&q%D;3d;V~&#qr4-F(lQ0Z9f8jh)FQQhhg38md-O=JWekMH6yQb^< ztt`tjfFKCsbF&vpx`57p3(K;oR4Rnw0a9k9X^K)x3L#RZ)c4}`-=3M7`4l({e5q;L qWd#!g_VPSm25tlE>+9<~C;k_v??1QHVkU6_0000xD#>*gl8_xl`*u>~tR<2k$!?|C^#&|}47F~3jOc3ig; zJlYokGqLD1;AyY0U|*2_{)>EBUqhdXMb+e;dyI^XDAP2B=Xv=3eq7f@(=>z-0BD+q zl#)`Z#H+=ZR4SFjKEUwsFiT5IA{-7gG&DpyoyIgx4h{~mEDOuBD3{AvmW7m(2eS{U zH|hZB0J&U_csx!bksz5&GCe)b%E}6<^k<62BARyS0tE_%5aN%c=lapza=9E+Q&X(2 zuHtzfmSytfahyV-@Xst3UoSlE0_NuCh{xjqWHK4D*(^Sv&eqlzkCuNN<}E-V5CRrw zNB^#{vAMzc_&BLl3d1lc6bfwbY*Q|mkW!K_w>fi4M=Fp?p_J;n&;TZGPta&Ix?we& zP4@PF5xIE_0O@(SZX37L#B1BM?CNoVX_^>@!TkISqS5=*>vg1*G@DHnpgL8&Ru#{w zU|0949TblP63JzJJ|Ce_n6a_zv|25cQsnb_P(ZtiQ!7)m_GvdPv`(!H&;bUogs?1& zNF;*eIPC83a{gQ&8=F~1N3Zc|;qHl7sRNWsC2ZR!5D4Hn4vyns7-!Km!H19UPZSRh zhNKSg?fX}PeHZLNAaL66_iMIo12Ayu@`>Wy_D^CnF`u4UTOSBt4Mknooz!*R==GuA jzIk`!e{&7+^#b}0^XnN^)dfO800000NkvXXu0mjf01-Or literal 0 HcmV?d00001 diff --git a/libede/res/devices/computer.png b/libede/res/devices/computer.png new file mode 100644 index 0000000000000000000000000000000000000000..d0b397bef91b4f6af85bd78a203b2373a36a3b36 GIT binary patch literal 725 zcmV;`0xJE9P)mcr2m5t5TEsdy-8b=+}wNaxQGeX2Z+DTz`*%t zelv4qe0&^$iHV70*4kSlV)%*)R}t}Dz02ZtFPguLxhRpL0NSSqpH{~nZ5 zY4CETTz=<*!X@Bw{|60itY5oM1`5Fm;HvZ9zkM)!--rnRDpdvL6a4fW|5x7u22S_HWPL-A00000NkvXX Hu0mjfV>nSr literal 0 HcmV?d00001 diff --git a/libede/res/devices/drive-harddisk.png b/libede/res/devices/drive-harddisk.png new file mode 100644 index 0000000000000000000000000000000000000000..5c3b8587f46fa03111cef37143e4c3386923b195 GIT binary patch literal 603 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP$3oE}V$LsSoA@P?#{r#7~tvR7-DgH>15x$Lk0q^`xiJYQ8;~4ElcHFfw{^N-dp!3h^jm2+;Geh z_&M{X(gTgRi$Z6%zLh**U1z-Qp=-CMr~fm{!;^oC=m$ zWxMghYF@68lb?Gozx=ZNTxz7-^->0(d5+IzTm%1b>2)>jTGuQ;>&0GvPKN8Rr>|vUM5mRlnNxtZet+01@UlW!AHnN#<_J z^_DrF`1kH78~N`Ga-+ZfwmtrM;;K~vp&?UMJS}ASB$5xknRD3ETwsNk(xIApMsxiR zD>G)yVw*b8$Mx5p-aBP9<&+m^GH8yM#dp00i_>zopr0C4;6C;$Ke literal 0 HcmV?d00001 diff --git a/libede/res/devices/drive-optical.png b/libede/res/devices/drive-optical.png new file mode 100644 index 0000000000000000000000000000000000000000..4ced6fe4f0fbb955e4ce820cc9cf732a7a8e0a32 GIT binary patch literal 720 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE@bl z6ot&>{5&pOIN;*aNY+#^GB7Y!@Jh@sO;S+L%FNA8OjcJ2E=kSIOD)n-;L0c|DX`Ml zhe+t_fg)}5jc2Bb9e$9KAQn7V=g$vj*DJjmd0a}bqGESU z^*CXFp(((nB_hMsQBct3f1}s6n;D*4)K;8MlT^IW!ZK;+@uN%5vbH2cl{+T1Xsr%@;2ek+3;0g9YkE$ z*w?uTumm@7?0YZVrg-~yd}O3$_j~aVf0>s1&t+T?xBl@iy+nymKToU696wkZ%TV-O zf6nCl^>wlLZol6A`7`^z_rX2g3?){wyYA}EdoJiIC~voK`PF-ho_A751b)z47+VEOGtqIty6W;1wf&m64!_l=ltB<)VvY~-_*QP-Qvuu z)D(rxA@P?hbU-Eyu<0W&;gh;E(`|^Fo7VIXeXP)`%H1>Oy*W)Xf+@WbiU`>h4=A- zZHde)%&n^DF(*V`^K5u*u}A;j4(Yq*47axhdQE(8$xtZ693XO3zhTOx+p`q|MgE>Q demRfPJ>1>z%bbAfK%n;-JYD@<);T3K0RXy1y$t{W literal 0 HcmV?d00001 diff --git a/libede/res/devices/input-gaming.png b/libede/res/devices/input-gaming.png new file mode 100644 index 0000000000000000000000000000000000000000..9d040ee84356e8c9412d290dd72537c93d012189 GIT binary patch literal 812 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~iJd>I%_u3fJNif|Tq zL>4nJa0`PlBg3pY5H=O_Ny%H{9NjrPA;Aa6zVB)jVN)>&&^HED`D_W%`4R{ z&a6sJQOHcr&*QR%11>I&WK9Jl0|R3Puf*)qBn9=X%-r0>WOaq$lGMz+)FK@Pu8fkB z0xNxeh=g8lX>n$9Mq*BmUUC%|S8`EmVhPaL^30M9g_4X^1$R&103Dc?^73-M^vv7> zz5Jr|^seLX3=B+)o-U3d7N@69I-MQtC~~ZR@|`DY*DfvDX!iAD`+^;w8$|v$HB}3C zbu_I|h~PNbx|V;--3~n$F0LjIvDmA-gk3JQ?p6xfEbJnpC2DHAJ@d=6()?#Tc4W?S z+VrB4`S6Fc=KFs>)3Ca7d~?hHRdYP;%mal}rgpIe0%CEWiYw`il@t9Jc@ z4_9(?Za+J=R+EQet!b-MBKPYbmPPq;m+h|{Kas)TCb{6pXa1d`?aa^hlOn|&jdx6K z%=j3!C#+F``TF#TE6acG`qFy-z1_!ECg=XmejnHwlSeO?x>s<5?Ule%B@c*;dJSOJmD|yjJQqd#GG;VOkNkn&C>; n);_kr#}#gG-748lf6K2pz%W1Y*_t!JM9kpn>gTe~DWM4fe9c@A literal 0 HcmV?d00001 diff --git a/libede/res/devices/input-keyboard.png b/libede/res/devices/input-keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..fab414b888c3b35bd85eeca49e39993b7e1268eb GIT binary patch literal 587 zcmV-R0<`^!P)4Cb1OgF$i6E#rRpXMPRdA8izLzw8xejeL9i+kH2bXg$ z=X~G2=kTdgsl;)h50ZMlu8t)zzc8O3hESN^@*a0FbXkR(`dY$tyFHFUtN9N6cO)s zkUrssVTaAHpGYOspa2v~DcbEe`CN`Tj`_0rnQS&sYBZ4b49z@*Xsd_smXJ6x?M73<7ULOcY#HT<9OrgvnN`q;hpT91IITQaN@sWXdnDH ZfnWS_iR7f0nwJ0o002ovPDHLkV1iuP0Vn_f literal 0 HcmV?d00001 diff --git a/libede/res/devices/input-mouse.png b/libede/res/devices/input-mouse.png new file mode 100644 index 0000000000000000000000000000000000000000..eeda4db8643728cfe36c328768cd2c38f2f72984 GIT binary patch literal 720 zcmV;>0x$iEP)Mh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00JCIL_t(I%Z-rDOH@%9#(($R$*Xhkb)u47DA^y-rd81V1re0C339Sc zLc7pv76l_r5bj&FYcp+PP$Sy42}D;SQTY*pOb#=qIgR7jeBAS%7JfA9NWPoH`<&Ok9&y#xJ*t^l|Tbo<`ilcLBySyFqeD`}S7V|yd z?JNFSyOv6&mQrt0+0n6)8@s+2VK+Q&9e$lmCSSI;`n|>C+9vQZkx2B_rMpn8Ro@%f zYHoJsdb)4jvz{l15=yBdYzw6nmF<9NG)gX?Wnm#hlVhWU012e1l=|@WS)#Z8!%!#` z8oJ;Az}U8Jg~MTnhlkNx<21EkVKMOVF{M(8!s_qH$VmDQZ~&kHD%Gm>b8&HB%;j=a zDwThGK9AQLu^RNnkrLzaIQe{@Y&J_g9_N1(s$W)CR%mN$V{mZrfOcZQYN5btp@8rE zbar$wGdp{-1RJGw&Yd~CFV=z@%fFTnXd9*V;{l%M?nJe~!onCqiy%f2tnAKWiE1Mt?wAScg7bb#;&~(b#^G`Pde43x1 z!}B~^TAHzxLW`jFPJGvOiJXowGxH7LN23nje*N;f&vBe+SJy>6&%*#1!_HyIWENOj z$^pD?1gKT3)w`1uGuIyyx^)1uEF(>uq-m38vxzu_ zN{@N7>bu}Bz+^ZaVLVD&{Xp7iP_I|1ZT?{6&o{EH#`v*Y1VK3PwB8K_I7hXz$gkyB z)M|AajSLqIvv+u$gN2BF`$yXku^fO2NmMGEWSk=!+GgYcB#{xvB8edh){s2j=K&-Z zz8nQT0=F}}PQ6`*QO9GG@uGB!m#?RAPN+W#b$kMEj$$##15*oPz9VpLtp*?< z)YopkJ}@B@rkyAEgB)Pii!tcwjn(xHk~p9chpmzH#-1dikc6!L-o)F#CJN+@&~0=3 z^5H!1x^?ea6)7hLGh@p_&fd7cE5JX!iRHwoEpMEdnBZgieePdqUDQ!57V#!%|6C`D t)90rjAnpi;*tHAV9B2Y}7fSO_{sK<1@6Q&T)r9~6002ovPDHLkV1o3V0ZIS> literal 0 HcmV?d00001 diff --git a/libede/res/devices/media-floppy.png b/libede/res/devices/media-floppy.png new file mode 100644 index 0000000000000000000000000000000000000000..f1d7a1985923fbe1f4717bd66985cceddd7f36e4 GIT binary patch literal 561 zcmV-10?z%3P)5 zlfR1-K@`V7GrPHjTF9HM`NVrQkDDElJ zh*(^!7J*!0<8G7eGMko`R|gs-Q{;YB;P_L1kWtz|QptJbUx`b_^gI`2FHBL4;MM*X{!l14cwR z_2@Z-zp4MN%F8SOFM*S{?yhVGkayn~0~8TqI2^8IPLgDaz=$YO6pI7cr1adIE z!Cnt0mkIxCb2uup1VxKFQ zFHx`8snu$;Ypta$OY%HtclSN{+6LaY0I-KRs*1G{?RJ}fzfZ5%quFdCB8Z476IU8FiYblx2x?4(A+YSrS4Zs8Cf4L!4Be*iJVj%d%NOmSsz3 z=Nti0RVweN0oIr=dq01j-|Vb6##tauQ#zdv-h0wCT{1i8Ai#-ZYcm3K@y^S2WB63J ze)C-Xt!_+AATT`#yRon%hQOY`kc+7sk?`XW{qqkxXGvR800000NkvXXu0mjf#Dw-o literal 0 HcmV?d00001 diff --git a/libede/res/devices/media-optical.png b/libede/res/devices/media-optical.png new file mode 100644 index 0000000000000000000000000000000000000000..760de9386f7ccfd2ecaa2680aaa70cd3988e16af GIT binary patch literal 931 zcmV;U16=%xP)f8Te``8a3JK<82zC}l1Ui;A@iO=+SV+Qe-&n%0z3b<-GxwJZMs zjaw+V(}>ulx@_2}MWNWaKqR&-Uc%M{weXh6gVL z9|C4u)YEKu$l7Qz=Cd1n9bsZQDpGfhiuaqv73Aq2kf3qVLY1+Vt8ZO*9GHhlhtgu%-jk+uPg8bUNJ%(4J~%cW;NDo*wb}XJ43rxv{aq&kuhjmpzB; zxYr%ELTU5m3q9v!u~jWHP3d631}}f`Bj#0kABKOeVwJ+#~0gU#Dm8 zj*j01H0`+4#X{-ZXmcbxJ3Et0rP`HgnzE&(1xR-nzAf8NXM4}^ZA_FYzBa}*4JyT#aioou(MkLV+__>f*`;-N7FQj2+ld2JL|o3 zKIV!ZBpg3J=6hMv?{|sR9Zo)+oDDT#yEPQcg1xwdQmPFY4O8~JU4GRSgI+=y3US=w zJVV7`FyvsIvR<#-fFD0kdH4S9wJR4zio5p?X__s=QPKwN>byxdo4UPR7Xc6QhnMtC z@5&6m%>RyYr~gG1z(Oy`v;4o#aG@6-ptaVS*7`Q*{P7Q)+QY9RiQH%a000084?_em^&oiMaespc zZyr4C*wT$sHo6Mx82)Ix>Xxo_uBo9*Lo-s7W$~g==M;DIb9)c(hv(&efG!9jA|YfD zr-12Np1CsFk5s9tHk9j`(xv>+8eR)D%kyxvVJ4BcA8IABmjb1hOnM7ca%0veGpS z$q{&-hfb#h$8jJC0^;#_Pb3nVE*6UkQ4}|7wc6)y0S&<3+S-C?n#g1_a9tOk=fQCt zh@yytg9C&@AuKE`2n@r_A5TE%^Laa$%iUdGUWOnDNT<`FX&Sw~e(dgkf#2_kBuUUT z4GhEBCw;-I*Xtj2UEgfC+qa_8C{-vF5DcC{AP_({n+3;laNQ%UufJ7`#p1JW0o6T> zj*ia8VzHNVb91a=7%&V2^?Ds^YkBZI4^7kHx^9x9sM*!k75kSS0D!LRoBR9w?{{`~ zZca{4`YM$QR8>W#QUS+t2#3SqI4*1$#+8wg&|soiduo6Y9CQmJ%96h(e% zX({74hnpI0)+jEP)znOD#V{Q_S5yefRq!0^R1wq6{-@pg3*%cS7eFSk~*&>C75X2R+ z7ds6;frX`5hyl?i1QaxD@aE*+EuweLDqDEq6o;Al{(pu!^5f_CFF=_O998{hf%5X_ zuU!Gp^RU*^zP*KJ6S7$%-zNxyuDtTrX34%h8jS`bf&>Arqa*a>1dM@Hik@N-ayfKr zip1C$Q53~6`^pab@PIu&CK?>1y|xBDJplX$eOsa9cn8b(J^ z=g?{uYBi#f5u##|Xk~?`N`>U`FztLkt^>e4J|g)%QY>OxEzIE|dU}e~>zLhL{EG`x zzK_h!A&tgc2VyN!C?F!}^))OkAicc^z~UmUy**On;{=%uLA@R;#||WuL4Ch7i)0d$ z%i-47aZ5{R7@{*X5QeBKGB5!D0@N79m=0iQ2o-^BmYcgfOd^41GMIFlWHO1S({BMH z(kWI&`udP4LRMGl-Pu7C2@?JNJcVH=*Yn;7yj)eqcpe)Y8~obdrWFK8E{CWRKDY5- zfQZm;w{gz#sZijt*~C1zCnDYJ{N9d>2$f2Ov$HeK&(GQ4-zNxySot-?z6Ws5VXdW9 zDsg#vNv&4HIfv(YIOn=@V?Y>&gwI0)n4O&kU~+OYhTh-bzY(**a(Qd>L*E%#{sSP* VsM+qr!I1y}002ovPDHLkV1hGf4oLt2 literal 0 HcmV?d00001 diff --git a/libede/res/devices/printer.png b/libede/res/devices/printer.png new file mode 100644 index 0000000000000000000000000000000000000000..12a4e39dd30977340c76ac642229a71354c0b310 GIT binary patch literal 481 zcmV<70UrK|P)cEmt5t{7v*Gm7BUrojO(LT=?cOt4Y04y8`_GsJlM-{pVuswce;{k|aALj$^Gi zYPzV&Z-Q^P+gn>#DwRyW5ujKse$Hr2=2q3+0M0o&oelsZvIbNxm-jR9JP#4U7_%08 z8K^3)R%_W&M5tD)yJbB0&#nN!P$=-@;3v+x4E@#dj4^bdpNQia;CjKpzwj@y){>^_ zUK30v$A}2`4}X1GT~fE(B}o#3AV5_K!;sNv#9%OBI2_XN_v!U|G@DJ{USG01h@y!2 z{hjf6OsP~N3_}3YG+j~$u+}o@hs4P&3m_s)qKF`9GM!EVn9t{kF*s+LTZ>4Jd@je) zadoo_)>;lLzy2|d;+$fwMMReJE|$Cmn9XK*p10L;3l&5JRmC}%0eHNIuR2CK|Gr(s_OsGcg~@t z-EQ+g;X0kp9T9n`s?$0gNNb%WR4uK%AuP^b%AZmHJ+_iDi1`G!>2x}`YPH$}5sg3$FjJ{GSE*LT8UsKP0$G-6KFo)}SJ0r!uJ_4(m*@FH zp63eysv5OUjJ=(2x6fU=c$x8&9smFU07*qoM6N<$f*XM(!~g&Q literal 0 HcmV?d00001 diff --git a/libede/res/emblem-not.png b/libede/res/emblem-not.png new file mode 100644 index 0000000000000000000000000000000000000000..052e07ec6af46aa81f6e7cc0eed4d1b9a527d9d7 GIT binary patch literal 623 zcmV-#0+9WQP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iyh{ z5CtfRoa2uG00HkwL_t(I%cYY&ZxcZfhM(QLIF<$Z0D|R$2qd}y5(x1ZpiKo0H9sI- zx>RYPK`0eM)F}`xRG}iGNdgLpCIug7uyNwRVf$`(XDBYQlVA`MBdu1m+Ii-k8I4g@ z{>RMx{5*exs49z#i+=^gBEszKEFyx4^kMCGo0XLn=H}-5pPh49Ye|xX<>lo9;GDyI zPqW!1gwTgrYpK<0eI@&rrYRwWfr0{1Kt$vaq*|>~E|;lPDnwC)wU&ClPNUHn0KE5j zA2|E`4z{~9tP_X4ld4<*)^0Ch}_h}Q| zZIP`$BAPfuT)l|2K2sW^AZsOs0%Hs!0vJN((UDUCgr8mVtycgX8v^j13^2s1N~N)Z ziDPv4?a+n!_TaKP`j&3J1Z#*Vq8>BvmjL*WP)AJcf;|HO-w?mVV+ z2b~6XI*xs%ZQs^}Z3}Sd0}P0SgR#*J?1YW^6%MqU1%!ljO5tmXTbFwLLf$_jTO^%Y zxuK@6s=5?9Hw_MaaNt9`U*NV>xKohxQ_ne21#~W*C0D%wlFqM!@7Q96(C zvkNvqx5Zk6VkKa(uq;V$Gvm{%D-s0l&2#_&tPFxN7rGG5T3u{G1=16fkc1CH8NU4d z$vaP$SHc7#j29wG7vR0m&IywhL%ePsh6aX;k-<@+HJ{66z1J@uz1L(fgg@#cOnYEu zX2Y=v(sQ968-{g5V4d9iG&ql zB_XjB39*n!l!ZhkMCnD-nwd_`OsDhR&TB!d)krKnt9SFeSKHT?_Q?{SkqPz%HJWA2Gu!d&yZ+uU4F9=A1xavUU#@oV#xN2bEr z(Wyyg?V-NAyj^DSY|t5OGx~O6_hyyOWs#W>LirtI6spysTCLgf7jNg4(7#}!uO1-L zo^o#$c5hN?w*{FFAQa5r^CVBb#0;E)NRUcIHj&ZYyS5k$cNV<$&h@EBx$X`(?PZZ_ z#7gwyB=eSB)^oFk)xB?ya2!A7(iP; zXmwjs5XrJsseXlE4qN#GehuuefEbeLR8oZP07l~2QChPoml&x{5Py3Q#)a?W*y1oK zh05enEnR5sI!e(7V9+YE&AL%R6PYU^jWUQuh93|OKUmUTkoq)IpC(9dssq8#u8va- z$|Y>&BQjS6u|GGr?;`2Tf*Cls{7sD^4C4?O0?A~Igu0`he<8>h{OWkA0^DEx zNJE2abi=j{>obkAl4|Ym>b4HbtGtQQ>ye4RyX;zAvKBcw_UcQcn(7Snnl3PAW$m@S zVbORK#i0=wIJx2$uJ2)>FVFS%p4B~>F3-uNOu}f?TtG97tUohWDm5l6^`znGid$I9 zjlEpz_1N#ZY&4pd$Woj2`S59$C#RosmjBHUh1~=Bl!W4-00000NkvXXu0mjf8+l9k literal 0 HcmV?d00001 diff --git a/libede/res/emblems/emblem-photos.png b/libede/res/emblems/emblem-photos.png new file mode 100644 index 0000000000000000000000000000000000000000..ab4046363f96d56937db0b86c002c10923fd6039 GIT binary patch literal 644 zcmV-~0( zK~y-)os&CgR6!JmzjMwkxtp6^18RJrXd*$e2&7R2QLq&&i9r-ZB}mX15fqbR1q)m8 zfe%CwE48uE&MJ*!W3!coML-dg-E}uhbl1H*V{wz%M2MMYnBt%LKF&YFD%QR|yQY8x zkRYoFf8T%ba8EwpO?|F}{_h2%+7rh)ip3(o8h&L2dj~fM(Fh2*OvJa@pEvsYb`%B% z29crRqd`P*&M;>l593xs8lM5NUHGS$~9D#XJeNU zQy!l?kErtU>IABabAd;9h9@81J~mmHI8wMcdWfxCHnDNTdSv+cP%tx`Im|hn8Ri^j zM!8(3R;}Ud@45Tn9v|MlW@mo~{k;ulzr5n@RD!Ass*0MRrid!4im9S1hzfC(&}y}q zt4)(}P1?yk)%k4zIPU`@9^Y0(Jc{7Gr!9i_f#3sO*@R3+QCmkV=^%;%-SITQ$_M~j ziO07~WL%R*<1c}V7^;S-p`w_jK~+UXQG~VmCWPfj>=pxyFRG*jswoYUcI}@EDY7ku zY)L_EfxuW)2+Jy%C{IQ&prYJAGlHpd>%=Kkl&53k2#OEZj-puNxQlwd$*0dowyQU- z_SuosOFeK4^Ea2CXJ%)pl&fry-}v$C&-F*?tM820NYt5^q@AZ!Dy{4Qps literal 0 HcmV?d00001 diff --git a/libede/res/emblems/emblem-readonly.png b/libede/res/emblems/emblem-readonly.png new file mode 100644 index 0000000000000000000000000000000000000000..04666196e552e14afa664f56bd2312c66bbb199c GIT binary patch literal 430 zcmV;f0a5;mP)z4jvs+H&M;MdVlo~3xi*=OJ?_woqWD+!X0r)Eth>zf6~#I~h_x=;wA-Dd z+**KQozrf0=yrP`uv~tU=PNp$9=PN9&m5``MT8K_&{aPpgh0?h*3ZgnLD8Uy3TAf5 zKt#}>1StVDDuN)wzMjU2m?2ivf~uktc>kCKFrUwkT3ak;+}}L_LQ1IyAm|C&2XH%X zK}ArJQpKIZ YZ=>v}zGvq^U;qFB07*qoM6N<$f<&0NlmGw# literal 0 HcmV?d00001 diff --git a/libede/res/emblems/emblem-symbolic-link.png b/libede/res/emblems/emblem-symbolic-link.png new file mode 100644 index 0000000000000000000000000000000000000000..800b9e8486da21e1da6824603bf4d4461cda7280 GIT binary patch literal 459 zcmV;+0W|)JP)K5)zeW@d+Ud!1a=y1hC+UsosxV-w!=TBdV3?gC{Koa-; zJKF1QWX7M1a{wM62S{QtcmTlNQA{y0MG0%GA2D~_osF-Xlce$E0$`X`)O9@%U~c6! z!`#{4+G*h4akI$??*LM9Gu#a~=k)AXlX#Gc(P;G75=}^@y5yXk{%lsCM9St_5TdXq z%wTW#8}5#o$Vlo4>X({2YRF*BUIDuuwVZt+KiU8Q002ovPDHLkV1lR( B!X5ws literal 0 HcmV?d00001 diff --git a/libede/res/emblems/emblem-system.png b/libede/res/emblems/emblem-system.png new file mode 100644 index 0000000000000000000000000000000000000000..259ed26dd000fcfb81b2c312980765a181a65486 GIT binary patch literal 629 zcmV-*0*d{KP)i103CEi zSad^gZEa<4bO1wgWnpw>WFU8GbZ8({Xk{QrNlj4iWF>9@00G%aL_t(I%f*vTYZGA< zg`a6_gEXBqBcUckH-X08gk(ZUidc0eHCc%W6$Bw<{y`C3bs>l=5jQRU1EnnpL$Xl} zSV57z`Iw@D+a#2UG$mQIh#zrbXGq(0)rEI;dC%o=?>Xm%bCz@#@buY}zSBQidVJ>G znA6<7cPFFkaT7p@N){lWGgw_)Ifk7ia|v`kZsv0amSq8$p`c33ZV(Eppkt)Fl@Owm{qp(iw__VPf`x)A0JU1JXWQRj2~pit6y>TUjXqq++zL47=z84M zV#Hy}=L}+rf2;a@KDpU!Zf>k^nVnAOy)1hJ&N=yE|O=HjAr(hPT zmg@ji%XJE7kv)6g$-!_9j#TZtNz^ej(-{i8MJJi&$4?(lCGp&U;s4iPvstez0t~w? P00000NkvXXu0mjf3(pax literal 0 HcmV?d00001 diff --git a/libede/res/emblems/emblem-unreadable.png b/libede/res/emblems/emblem-unreadable.png new file mode 100644 index 0000000000000000000000000000000000000000..5c08b05c1633412afc03186ca694b6d69dcb7775 GIT binary patch literal 669 zcmV;O0%HA%P)U%q$mJqaU$}#xw-jCXJ=YtC9b z($mwEy}Y=HTUY?qGn=R?p-|w`;9%4I{CvNQF}CJ%IWEl3B3oPM(r=fS@k2u-Nm4Ta z#u&u=qm14>w6&qCDRMcquMaYrln()83;+f|L{L>?jKuD4n3;z6@6f9SwB;g9zd|OT zq4$P~ArND1G;nnVF-9~5*xANZDv-@$CZ3`{w~_Ytbnxmb8UiA6Qh_ms5JHL{WvUM! z!TvrpWg5kP<~9D)=SJQs3o%CGA?d%bp*uTAI|%{5v_uFYwQ#6HM2F)!CEq}rjUI8-wITf5F^r?$8>c8P??zI_uXN1Zx1pV?Dc`h66?3(PFeW!74ve6 zxUoUy!$$yq-MUR?@FoXybE*7e$L8ubV~i=hXYct7G{(jXs-+UuQYrOq3`VuV84)?C zR;wff1E_Ook~H4v9MM{$b0@f@zaLe_d+(fxye*YV_Y0$=u4Q~2Yc0l@22LE=A-wmj ztgHa6Iq&`0=H}*=_4V}|B66hdj8Ii;t^HQ3)gJr>V|Xjma{x>=00000NkvXXu0mjf D01PV_ literal 0 HcmV?d00001 diff --git a/libede/res/emotes/face-angel.png b/libede/res/emotes/face-angel.png new file mode 100644 index 0000000000000000000000000000000000000000..d2c5e940df52406a6fdb2289da426cbbf6052404 GIT binary patch literal 992 zcmV<610Vc}P)Mh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00S&ZL_t(I%WaZdY?E~u#()3s(Dv(Cx3Ud4%Gg+pjLkTa+36f)5_C)^ z*&+$aoFp0#i5D33!gy;U(ZrZ&6hmTS6e9*vF6M5$AkhI66kSGE)R9T6O(|Wwp84AE z@b_YDiHG0Sd-3LZ-n`EvxJ~?{9Yd;L-EZjeJ+7lPNLLGhP^DCDp~_s@3eAG@OTfEu zwzl@KIWbHEKmg32dGk<{JNb#&wH=T9JKow1|3{(p0OI?L6g@relTR#Ek%e29WZOo^G6)dRp%_Ft+A_ z=s%pDlAxMaa2E2|OBu@gy)$qF0PVN89&K?`8Lxl$QMAgBFt-5J1Zrs(0I974i5E+U^E?r&OOb3V9Z5NXaMj3$KczkR+0#|7I)R!YcX9Q>Uu&&`ld zXZLS=?&C>Cn3)5C?m=Y!630IOnX8K#gy!Mkv+oeO7U#92CqY$-ET;J2%Q<9fhCpW@ zIJZUsG^LPvT&v%Vo4iO*R~sizO|uyNibLbO>FV6fLw%hbeBoU>HZ}0%&|Tn`QR~}K z3fbY6CtB4uq4+@B4D`0MbKpMEJS+LQE+dchvTv{lDg|UAj?Cr|ngNd8ypogdiAuW& zRvBp(kyaTj6D$jC3+xJ5C8U`JGmEq;NUH=w$pUC@P2jAx9J@2V6yx+4$MJcF+11}o zsHG9JVxdZlWMYZqCug{$wVPL8d++rL%m*UpVD9PD#=Q@u}?p$l4RE?Jt)8F-M92n{F`@4~Uo<}-YupJ*#N(4Gp z|2yTiryUF)W<1PgyZ93EFb`%%!9)+cOb__7muL+`*ur8NleZFHTgIRR z+VXGzZ_o31SWKqB^EbcShs5J?Ji6Cf@)}Xun=UG1Qc>FgfN=A!EoefT&Ntspl+Qle zlYbAs{iMe?a^>QCQpoos`=V-9-7Z>ISp^V^(&i>M(iw4UaM0Y|+B~xoxY;{A92Wqf zXqtx3&MQLz5Bou55m>di!Z z0Dzuo$!m(I;#_mv0aYLR9P4XKICXvm+i-)ZWuR&q=ngM_{pB_;FSLUji|C9U_qg4@ zbDh=e8Z|859ggf*`OHt?dK#y{UO_Hzz(ob5D!3hE z94zdu48h!3fQwb)^`jbYST7+v|1)Zw0*H$tH50(gCr_a z^Qq*)r&t9(n~x(`cMSKJZz1u=5~lAv@Oc>`dpvl1uf*w(O7JriPqcGnCPrY|_BgWz zNld3w2MqS4a@&gH%<&FWl~6bbu`QrvK^868+XgQDrRbX`Ia~1T9bf>k z>$z0#@}CW_v^tmCW7TWEX2pV&BOpuxC;@~7cR1z?3cjBU>06ePY`d}8I~;F*Xd#`} zWb47v{>*I9oXGhPrHcw#GYGY8jt50xEbGSa_x#R4I%w!zIU62YerGuT5EJ=7XEpz~ x#wh8gM8<@qVE|Bw80V5C93lJ6^49-w{s$-Bogi;?nm_;m002ovPDHLkV1hFU+2H^H literal 0 HcmV?d00001 diff --git a/libede/res/emotes/face-devilish.png b/libede/res/emotes/face-devilish.png new file mode 100644 index 0000000000000000000000000000000000000000..6edf68359e0a690fb669427b955db1627ea0f23e GIT binary patch literal 1020 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 literal 0 HcmV?d00001 diff --git a/libede/res/emotes/face-monkey.png b/libede/res/emotes/face-monkey.png new file mode 100644 index 0000000000000000000000000000000000000000..69db8fa5b5e06ac699018e5c702ca91c8c532018 GIT binary patch literal 784 zcmV+r1MmEaP)L zli!O}br{A!@AsUUvvcN*PRoj2bd{Sd&NeBNKgtoI$b@CrRd8V!1(&)>D!MAN#r}YZ z2&9X;sBZE?K^>w+DXC>41BYZ+*I7!CwJsuQnVoZX&+MG@eZ5h!jDmVDUmiX@ygZMn zD*s3BUk^i-;9$n^l0tuKS?>t9jWC~B&ROKcTD@f-^vk^jLzRN-h<@T4M#?>_e$lh! zGsJok4)?gtUXM#yru#4H0qn5AH1$ z*5pqBn07m^RLi{p_{B#7%kcOF!{ZZZXNBP-$Jlq|7-<~hukAq_4_|4`p$PxJ>I?cnLVR2H#f_{ z!51m`KAI+In$T=EIX!ui{!*E#3#WAMmu9mW+1*o(aKL7t^BLREQobBQf|8?Z||@EY}#5i93I-kp@HX! zqKL2+;(IQ+j0-j;o9W`#!cB}YfA(@q@AtqepMEv{V|1f&1;_6})!>QJ-R06HASO$8 zT`xcXG{-lWuSKeS_D~b|Rf3};^4{L+HgCuFs?+_*IpR+b|c|M;Eh@2BjA=}RjL zZ`SJJM-Kt+*0~RK)WCLyeueb{zX@Em@B_%nTD{fy+b#T8nSZzZv+e+GZy^;e&C$XD O0000`x zJ12+6u1#KfHJLUxg)}xnY@)*r%;*W3q#*{zUTbk3_tMet`bzt$#hZnKr47rnxR~vF zzyH+ewb65<3GdVDlpPB}=+~G&6GM zTs+EuL*x`_G(*-N+U)F9&^iJ%TloW4HmZaQv{OXwe#ga$$#|r~8R_}KR9jb{^b2owO!TKvN!I z0+Hta`bO0BSTKE8&u?y*-t9S|Qo}-^Z5tJ?5tbieWRD{ZiSis&^AP1YC{IxKBEDUI z;vGfI8`=IBE3LZh?^gYZj#xF8mSFpuV%2ARx5RFtMBR2!u8;OYl;iU0uZC0g#EnMc zg>ozHtLq1+P=Il3(<>5Pz=l-=& zC|G*v!o8cttqyP9Zk;SN4YBVE=?4)9O}Jl<@%qN$lkso%iFHQfAN&KI4 zy#By4rI?XIPbn=&01Tm4BP|v}rRTlO(0@4p1+2fg2-5Q2n*aa+07*qoM6N<$g3iOt Ap#T5? literal 0 HcmV?d00001 diff --git a/libede/res/emotes/face-sad.png b/libede/res/emotes/face-sad.png new file mode 100644 index 0000000000000000000000000000000000000000..159c04b0c64e57abd9a7429e67454b66155caff9 GIT binary patch literal 992 zcmV<610Vc}P)`Sv8ACgeKwlRq}Wtz znzoEkoVuwXbSFr<5EpKY3tfnob|DBxP!}SoRSIqu;-YRE3~6F0m^keuF;P3oOrps+ z-}651d-q-!qEyfN&)NM*E|6g z4!(GID!O>{lh>3~Z;YN8Gm`xWX}Bv15DKSOL$y?vOLKExyIy;1r~8NLg@v310L`*2 zjE~=>vgpiP$Dg`%^6Ystf&$UBHGr%^1*>3U3sHlTp(mdYxgGbM^Q*ehJv4W{RI(HW zfPv=tRNvvj%;3=@I$!@7Gjq$(x((32K9E!jB&p+rFK2-ASD45>V;&uTd@NEPn*soO zX}D==X5#9j=~G5${(bE4ZQ+$`i)cd!F~Xom7>Gvk(T)39-Sr^6BF3}Nnz|mnI(}f^ zqAnMcnbDJm`1xCiP6@Anx`Rg3MTkl$B>)gm!Vn2-c=_#H;H4$Vt?zJl;*23=Fv&db zXOpRZ%2&PyjYZ(H9$dUI2*YoII1Gg8AfCYabH`BpJqEXU8;qoo8hDXP;b)lu%S5_T z@T&I_VqJLiITP_-4Qg)}ig!Rl4AK+0b~%Q%pZ39208uX@K6VIRKr)Q`5}oP}s2@PI zTdMdFD$pyS}k;syCL<5_T2&ii@_HK<`8S zcx=o*1Rrq#|PxP>=o`gV%D40|sOcgXCKzt53 z9LnbK+b%x*QR~z^a;0S+o1p-3@QID-HfPJ<>>Tdgsp+UUeFO~$LEQmb4$yER8V-J` zNW7Czb@ps+IsJWc`d;nBQh@(nGK}++>4L=hx1=w?3}uCTHgr( O0000+k~X#73UR$7+BQP5vu15w zpUnEO$wW|?A{{v2RZw4~ih^I$!9YP!2X21hgAXDMM1w_JYjLgJ+RVmw%Wk^0O>&d0 z_vYT*`@er5RG6OU!+APClF4LndmitvE5yf7c&IxenQssPh_Ei%F3n2I`RLqAIDdPe z{5z0NU!Z;Z=rjIs^p&BJ`+bq#Zt8E30ED8UX{e}0cYbEZ+O29YZAO22XLdH@0svDK z1?lt!s_dqJ>>D_6eC+T;{vgW{%5nh7K{~78qJXfUk^Kjbc}(4Wps_9wN0T#WRaKEp zQ51}~#h*o54Bi-yblDb;N2adu?`>@1Yr(DJrB1ykHp|4uiY}^TArF4wZPBp z#iMb><8S-&(1Q>A&4qW7FKKw=s}h3o2<}YwfN+jnzJk|I{RW?`qetYB7=D8Pe(~aX zC#!xz&8C=2-81YHYu`fXD$ajjL8WTp&9~+tr2ruD>G{j3R4u&z$tI*;gnRuvjE|1_ zgzHRkt7%U};=Q!F^ff?Sy!==UJkbrlw-=;Q2jLX2zL0`*GX_z-346N+XKNAh#FNw& z_5>H;sX%)iR^=)L;Sj_?AXo+Sa>%9*!YSNF1I|trjZFjYt_>!xA$)HSEQh3c({`a( zHX#iMb7ypjt^l~Hf;4iVT)-6)u1!FKt#G^?Emj$$&qpDQ8f?b}H%)VSV{P%^et#SM z(H)c?c@%v|j-bE4AMIW*ASHMxgoT9#EPehNIel42~2TzksCW8cDf3AgC)06Q+Fxg7c z(z6ddx(7`=2| z8jNh4gf?w~vH>iWy!hcp$oWQ%nYv)psh_T&oXz}=iTt0luYOtKluS_~CtOKW0Kka5 kEF{S~uKd^v5B!JoUk@vwRe4P)+7g)*?1z9#Ng;{oCc6MGL z4@Oh{oxl0rK4M~Gf@k-}$*L&~{mqz+#*}6Z0Ep0i=tpu!xxtrTuQabe+lzk=Mn-PQ z9y|A5vbl9?=UJKK?M?T|_#v;c3v0Hp=G2QKNAgL<~SF6)0(8t%x~PgYGW z(K2=FftUY{9h;mjMeW{{^}6ONn?qH8pbNsVVDTI63&@ z86zxwOK2B4s0BP+tFWS2=@l0M zMT0KUC8YH_!l@#>L(&OF!jQz24?yr_iEL+=j6#1*577r3(pg+<13i;OD8VOhALpp3 zpq?s3EKc8Zl8@f$CUQMg5E524X+GVF8;C*O^CN7lgnbwg(>*dx2jsdNh<5i7^%_x3 zM+I=9R}k)d>{=dP)#q5Pf*(X^=U!;NoN0=6b=Eg2?AR=9_}ET>8T zExwzt(kKFYjTTNq6-w2ofL4&ccox{)9*0{qe-ue})Pmnba-*))) zH_a});`%}2`I{1;W4JJV=;=$}l#bbpR*Zv+i*{fm_p8Y2K8Eces}37`As^q*+B-FE zY2fze^uHF0MN{>kyL)4Mz0F;zG>#T+DRv!X7z9-6isijHKa^6z&8@b&9ctGHf8M$_ zH}N+n@qf-nb=lOVn3O_|MM@3=Xd-$LDlrp8>MOUo|394n0%O;r7_9A!9smFU07*qo IM6N<$g5yxd?f?J) literal 0 HcmV?d00001 diff --git a/libede/res/emotes/face-surprise.png b/libede/res/emotes/face-surprise.png new file mode 100644 index 0000000000000000000000000000000000000000..4b4d423a555be4dec700187848006923fdd01a18 GIT binary patch literal 984 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 WF%C7a=_bMe0000D zlg&$%Q5431Gj|$ibZCUI4}yxUiCnc1+G+-^+iB&#UEqHZZ3c#EArT?8(xOd7R1l~w za#2AgQ;{D@I%7CaNV2IHwbJze{Vh7{VkEa(3LsC%xf zXV%KpjLXrEFdch?XycO3IXeUHP0lxluJw5SKF5VK9f$}A+k3HwI4QL-0IdDOcqB zSPE?{nePsVKHqOC;{4k}t(6bITvXyc-d%VPHD_8EAd@c7LN z0VN#U-}*W8+D$+wD1(hb7ZnxQ)>0#;WVhSMx1M~WOW`<`(y-`~O?lW3>LcLKl zTI-Q&y-_m`fH8&#kDju%^KPiHOVtHdSC#>A0E7_i?tf4s(+R0|vB7qwa4%ryoayflfE%+4_t0F6nNx)`Z6qVHi=FPKTS#CU}=K zz{+W!#C9YIhrSlXiNSHls7#+^Yo;a`d;);QTNPSAe+|gJYq?(Q!^i)DrRoA3o7+RD wat;teu)4CGrROk3N|^!cjmHn~jryI>0JT`*mWx6Xs{jB107*qoM6N<$f&tz34gdfE literal 0 HcmV?d00001 diff --git a/libede/res/mimetypes/package-x-generic.png b/libede/res/mimetypes/package-x-generic.png new file mode 100644 index 0000000000000000000000000000000000000000..9015426153054c0b529b4d9ebdfa06a221d568ac GIT binary patch literal 540 zcmV+%0^|LOP)Vhlm95D^5CAW0*NO~l4h2`Gn+SSXee3p=k!DITN| zloYWEXca63MGv(U^qPobY>b#9Dp8{0UEbTVcsUg#cu}XB*@6F?*_nZVGy!PT%rNk5 zliHE-nb49(%`}10vsV}N{rqDUTQ;Bo7$dnCNIoxON&^{bA}^laGjk880qPdu^yOBT zEWa_clc&Tx2f*4|8y`gof^!a2aQL`dICk+4OK+dE`@k5lTlYsTutSWPkfmY@o;2kB zMZE(6RQjtR27v0WeY98J5hzgEvJDN{um$>(l@Gjpa+{MEra-d|pH&4=2yN1juSixu z;fgT;7AQWtIU$FSo`duYWUHV7)eJ(4YRG+92Ww!@-u*n7y$)#60)BA&kYbGBD?sJP zdQc>%Uxr2wvM|?-q){`MfcjsaLA`SadgR1;mgk#Ysp6f7xO?jg<1;~QC+VXy zJ@MAA0M19>fq#HTtFrvrY!+YtrY0(hb{NEx9zYRiRMGt~$xpLen%X%K|_MvGY{57DC{1x$t_u4wM}O%d&_> zB905S5<)OAFtBSDx%SZC-~V5Ne@U)wtR<-G^IC?buUWE&McJ}(%Mwzloy&KgU43zH z>WPD(udi>%;QQuJ9==*2(55nZ<`@S%n`uxK(s_fG*cOY+vB#HgKfUfSh(@CTBvJ;i z7dALQKFn~hpLE_}HTnhF9L^m6C;rbpTZhG-+so&ddOuo%CZL}L7gPyuCr-SWPA+@0e>rs z;@+LY+r^KZ80{jHPLebm@pp7!+h79-31OM6rz{p%mhjcv&J@DoFbPekyWPipbdzAO zAIpYnF8NG~<0FFzA+T+m`1%IY-vkA-jH0-aJbp6y0$Vu~y;vcqo0$16$6mCxHvb_| zRrU8`$P(G@0*!?qcw~jm?G}=CZpsylLaNM2sYJ18(&TAG*LB3q%*>l)GI_3Q6t@m> z_T(@}dsKo40(^_b`LJSO;>IYJ$!1b0qQZ^IAv8^6*M45R`}}@;K)pFNG0NfYRshnO rEDzqTQNhJ_!Nf33ZcTKO%jNh5gZdd1q4stt00000NkvXXu0mjfZID5< literal 0 HcmV?d00001 diff --git a/libede/res/mimetypes/text-x-generic-template.png b/libede/res/mimetypes/text-x-generic-template.png new file mode 100644 index 0000000000000000000000000000000000000000..a0cc462f41ad569aad7775d3fd3ca093d0b001c6 GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_Gz7y~NYkmHjF+qaZtPtiI$H1_nlNPZ!4!i_>c-J7zIC3b@9HZg+8P zX;i#-u(zqnTaax}go_^Q|xtXeppbU^h;WuX;s&%q@IOw>zM=erk{LTl-@qEK;XT} z{PTt9Hb$+@D+VfF8Pat#r)`yyT>trF9u@`X1X&pOy${w9`C!wZw9!Lt@=m=bL$zIu zf{B}NCiEn3za3k~U@+51X?Nkh_utod3$QTGd!D#%~7Fee_xTc-+2*wv2(<2J_t+h+ zs5rlI{^p#SO2-|aiODDi-jZP}W|aE1)~BmOR3$EA(Vi@w>U%ZDa$9qM8}c0HKK>=@ z`d4d)YqwsmShMx=n<-}wTJ%-CXPi)?Z+d)E$Kx3$zTq0>%B>G-<`ESK<06 zKLv;!Rde(>`RU=L2g~Ovo%n1M@bQ?*+>S*Vvl$k=|9v$za@qmb9gNTaiaD`NnxMxo zp5*#q&TW}{<`>WDw{ULpSLj^#x@qe3m+d`GEQ*uw+Md|dvtPsTSdE!)vF)Ukp32Aj azp#b`#_#;I)BX+6mkge+elF{r5}E*#afeO- literal 0 HcmV?d00001 diff --git a/libede/res/mimetypes/text-x-script.png b/libede/res/mimetypes/text-x-script.png new file mode 100644 index 0000000000000000000000000000000000000000..c923098eacfdfac51bbc6162656a5b098335f367 GIT binary patch literal 516 zcmV+f0{i`mP)#@I|S_<`|JP!0g*{W zK~y-)m6N}Y+CUJ-e}h({49)`}3JNz!$6G{-s8a9X3|k zq-mPN3xWzrF{aq#tLNQNG56d=B)csTfT{!2H@TQ%1m}PVq6NET3{>6+kRk)k41xs` z2mBEO#OCh)i{;~dmHVPtDHT&t(d>`pw~EyyiFy3_$ZofL2S6Q%0^>~oCNaHUk01!> zbUIwG*S7#tY($@O$P z;rl*O6ah4I0MGOAJdaAHV)aXfYPHH>Fkm{JVvON(xd5?u$zR0000@3d05x<) zSad^gZEa<4bO0!0DIhX1Ff<@aVQY0_AX9W@X>Mh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00M(aL_t(I%bk6~ZAHpH6^&0@M^T54(;DntqWpa|CV z+N&<=S_G*(LHq|o2#oG*2BP>Y%|N{nl9JG!v#1O8!f7$3o#S@qrd_y6+D-M`yzdLo z^Wk~F-{%oH6}^2u9Y6r616)89SOS7wo!tYc^M&6EF9Q8F)wNd@MM2J&kCTi&165V| zwES@qc+}O|{rLnSQ#>8;w-wn7?C3@eGnpWLkVXE*V9o`UHiDWq?oVYzOcW) zPbj1k*1~wpyi86^5smKPayg0VG2Cts0)nTqs$zX+dUja^0*a!b8!-ShEzJDf0)}oJ z{a-hjpIboF!T{(-3`J4M2#p1(lk;V^e*DDYbP$inQ4}BdAKU{tKI8E?4yOY%nZR+z zNya5C8LLPiq_J2m+_`)EgiThfl|cK$<9GTXoxQrUB1QouQ6iN}F+MgyaBv9I%!p{3 z1P6y0ADbYRN+F3-77)z>mW(|EYi=I9JGOEPRl{bpvAeU2H8&4q z&mc2gh(J(PRqS#B06t$i%`HvH_M<_P?J~_RP56A}0NCXMR8<8C0!TB{v&)rL6}PJdee(sQLmHY2RBZP3_wjbtLpyZ1ATU7g)e03?8$tv5b|)K!0l z?}F@hdnha{1mN)SkQ_@6W!`e?>l#QVlDvF15RF8(o}Dc%v4&RF&41d3skf6~x3|Af znWlLim;+u2|FeyOcK>DIIWYPM;BO<)?tcng`UNhA2~kNh@*w~K002ovPDHLkV1h3I BUq=7{ literal 0 HcmV?d00001 diff --git a/libede/res/mimetypes/x-office-address-book.png b/libede/res/mimetypes/x-office-address-book.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b5d9d98cb0ba5a7dfdcc80a0762896f8426b88 GIT binary patch literal 753 zcmVMh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00KQpL_t(I%axN&Pg6k@hM$?w0X#5SDVBDAx z;=+Z0!K4caEKK|#ggud;VB*4r4GIP@RT1# zz*KQz4w&KJV}9|~^eljwDlW{8NImo7`9nNk zsqExS3z&KQ=s_5UMs|Y^*;I^;@;;5q0Yl|IRI5#>B6y=2TA392kvMfAm7S!vxAfWq za2!V(;NZ|B8grrEBweadyE00Uh++9{Ql$!A6@igBF(>GIu>f3G0fv^}JCI*0)W@g|hZ5PJ#MD5NXz;b-6&lG{J2 zU(WaVBnB;7%3n>6hHch>)Nq*l& zHCl9SMfK*yxf9h>U_dF0bUK0G(d38YB%=;oAM5K%4QTue;5AyjS$>Np4Wa2Rtqnp7 zY!yKWfdIPQkgw%xm~S4*&+F>|Pc48Ct6SW^5$})fc_F2wDbj502XcG-7I%-uSOAA! zgNfV_g~FvXiQ-fN*EV;~t-<{J&FYM9HN%~1AYE6XJ9@zIAB66POy0?urIo5U-8VT^ jT$ugO@66(>X#wyXbGzHwYQAj$00000NkvXXu0mjf74}1O literal 0 HcmV?d00001 diff --git a/libede/res/mimetypes/x-office-calendar.png b/libede/res/mimetypes/x-office-calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..f6978d7d3b58ff87a72ddd993eacb7f1a3c874c2 GIT binary patch literal 604 zcmV-i0;BzjP)U}^a|TU+0#)oKwB;}Av|oIf{$5Q1I~plNy^uh;8jGMT7P zZ!{VJn5IcGnPg-0E05+2q*5vJ*KcrXe1etLGL~gwSr(>g0ubsV3-NdyUDvT^U7o%u zA*JN(nbSBoXLvYYKq-Y%ifXOeXF>mSyZ7(x9b|a;I9I1<7#kglazUrlzXRXj0ie}t z?K{Wu&0`fxnXI_ZOqNZ3Zh7bZ>*AYU{Y&NOZssus6?(PoRY?hbHCAPPH zLS1B`_qHL@>GZyQyWQsFr}aGxN~w+UiOWX^{R={fH2@9JPMkc|y*PG(a(V4Q;?G|; qSzlc_1au7`22flq4LZaT;QLSFb>&0h zLW5|eAB$*|2dzZQMc}?>dJKew|A0FQ7cFF#64a_@6|}R3o8U2t%fKKbS`$+&I z0T7X3f)Wu8cz&k#%)zk2xslrd#BJLKKx<8zLx`#nu}PUSnsa$bQp}5(KK( zHrS}usjt=9a({X2+YPn4S_^Ej@uI}{&F0?(frZ3{E8%`BaqtEjpm#XO&T{pjL3j&O zxwD8!coRDK10tf{+=H#xb9AJD_AT`E^l*q&TX1UNDm(A)!Ku0o}%zB>JJ3T#( zQi^bn$K!hw6BEj^tfXaG$8TPeyw}`?m`mcwX?EAE2>+plLbquvJ^l^6dniq+Rqq7= O0000OL$D9)yc9|lc|nKf<9@eUiWd>3GuTC!a5vdfWYEazjncPj5ZQX%+1 zt8B*4=d)!cdDz4wr^#OMYfqGz$1LDFF>|#>*O?AGil(WEs?wLLy{Gj2J_@opDm%`dlax3yA*@*N$G&*ukFv>P8+2CBWO(qz zD0k1@kN>hhb1_6`&wrCswzINE(evt-5C1B^STi2@PmdKI;Vst0PQB6!2kdN literal 0 HcmV?d00001 diff --git a/libede/res/mimetypes/x-office-drawing-template.png b/libede/res/mimetypes/x-office-drawing-template.png new file mode 100644 index 0000000000000000000000000000000000000000..dc384dba13f771477d4ac9980b843d8dc3f67626 GIT binary patch literal 782 zcmV+p1M&QcP)tHz6yuK5(osOx3@Q4U0od=7#J8S zFE4*GJUo2g>-FADxPE^Gz3Rl=NWoW_pdM zAYJS%Oxqli8jTN5)>hT08M$+EZe|i|!B;HS^-PSuK>L*eD2C!axZJClo=uUO`NGt< zlybRO$&elfz`45~F>@O%X`qy%tLqlYjE+UKAYuXvLC`d-N`8we0R3qB?bb) zg9nwv=E5}R(Ug`gP)ba5UhFoP062HmBlCc{i~*YBe0PL5AGY%FS(Nc)z9iBGj3@I| zEc%)4t^feB!MoY%3p?Z(D1q?xa}w_xWP|09B;TRN-^LhwH79$Dj;gL}kFy$7>_bfW zo-vj&P>LV38B$+TsQ1&VBv!#>uZLnwo7!AbEr0?TALwQ#miY?HdsuA1!WD8( zv=DV@YGsWVsUr@5Mj?b?zGdG*cI#Jj4!%nBOxVgER($Z3CYHG52z1|hUV9;J! zS-HmN^SK)u8p=E#&!!{0sG7@6fo70bu$HOl*q;;rhyGJ`S@zWV6Yruv=AqyjLjV8( M07*qoM6N<$f*vPka{vGU literal 0 HcmV?d00001 diff --git a/libede/res/mimetypes/x-office-drawing.png b/libede/res/mimetypes/x-office-drawing.png new file mode 100644 index 0000000000000000000000000000000000000000..ffbb9e40714f8c5cbe3b15cfcda5ddbd1555f45c GIT binary patch literal 541 zcmV+&0^Z8% zTYE}9Ld|1puDsnNj6=p4lU* zy@%Es*LBI~^JuNnT2rZ1XzMn*ttk`=zCt5dCbC;RdH;?JC$9DV z>FIPpu~=kneT91T4131nxH?Ia^r(M-%JtjxoSnLQ0HFSEg+{Q9?O1GVcj#<}{NCzd zI~I-B5;7#s0YF5k)v83@78#Ynm;?|E2Boq@TTK?L)szVgxN~zH9kWT29!mO_5+O-? zOpMv&a%mwd;r`2SY$oUEMX#_O3#Bq7Nsq(vPcGT>h>?^P3@knN3EtK@mB|r(h94iB zeEqP)<;k1W9QuN2|LJ_4W^nG`Ss>B$1-<0vzvYxhW}ncFwEY0K>TTy zmX6tpyBwLccRgXDw15n`!vJ8UZyuVt(y#lED}Br`4FD74<2<}|o>7&xEbF!J`?I5b fvMlR4|4V-WnZ3`04P~jX00000NkvXXu0mjfqj2%{ literal 0 HcmV?d00001 diff --git a/libede/res/mimetypes/x-office-presentation-template.png b/libede/res/mimetypes/x-office-presentation-template.png new file mode 100644 index 0000000000000000000000000000000000000000..d90d034a5d5ce7e8a925739dd444ab8c5ea2be46 GIT binary patch literal 710 zcmV;%0y+JOP)C!>KM}JZFJzRUD~c{6 zcaXw%{5u0}O0XTa-tT-}Y?HGoy*Ka2$MZhV`|}8A8_wJ$q7H119{~ISW)j)oQtbVj zhM6=IQO7{v6DUd`oqz$LL}mck`iK_?FWv!o9Ps_=?Gt8;#nOMdxv?p&m>UZ9Bw0%_ zFzHN71h(sa~O(qBci)k8hB0VE3iy#QhB#P|Uz#$Y? zoyOXn8=S}6FefD?NrIv%SQr|@Zl90sv)ObIu|OceREL8K8ya)~Sf2L4n#U3Q6HFxl zfK^#WxvC<=ZfAePVTy*sw9CAWWlc@%9~FhN^8x8tEkZxt$u*=Bgk%}IC_)PcSrnvC zoT_HSOZyq8D3!kNV<+9nJvDH-~8FH?Lk= zc|ZpM$x#cQTx~kR_S{@Zy}iQ7;v)4AKW1aMI$7}LeZ3@aohmOi5&$fJ8jGv*Ek>|f ztthLgK-u^>Gn~=r1xV#JSebPrrv2VbAj^KEiPC+*0AOj#1Bz+L%-Ny?r}KF7sV9`l z*umsGV2`s7EArf?5&AnHb{O4A2K9{&oB-6%uOVgvNL)d{f8y%3D-K(sy?A~>8Si=I zUj5LX!%OPhu`<(xjBE$g>50@U7{lf2K4P~O)wQ)HQGPCA=`Hv zfJ`PEO>iKYBt1LJv#BX+3$OUGyv=v}0=Zm{zFU(7p2zB{MJkorT_7Hh)7{%k_tMg? zYfB^&v?r6%1eW#j--{P;_RP6xfqedQ>v3+})#;gXt7)wM_s7`y=!juF+8!GpZ9VFy zY4n?>5jN`3G>!fUTmBvdo&%Ih6QZdfHp;7|(!`6M{!fopnEWf3lwSY<002ovPDHLk FV1m=+27CYj literal 0 HcmV?d00001 diff --git a/libede/res/mimetypes/x-office-spreadsheet-template.png b/libede/res/mimetypes/x-office-spreadsheet-template.png new file mode 100644 index 0000000000000000000000000000000000000000..e8bf570cc0872aa8600137efc497dd3feb656dd9 GIT binary patch literal 780 zcmV+n1M~ceP)2}Y#+3^WI8%J(hpAMZ?If1MSp+4Oe7NgL!(P;taN^PscxeA^c9dx0e3FrQ51zl zB0(~lTzV%^Rh4Ko0)VQjL?TfDDuMJf1<5BG4_pAi6OYHsfkHS5gmCU9scKdNYy#FF zi1TyuI#N0qWr9dFLNE{nAeBnd-rnwDj*iOaZOsTNDLN zvT-+6$<3Sd&J^AcIVP4qQi-6owbhx%nKOL2bDxb}9n^2wiu8D>*@;e(>XOWm8+fqcFtT} z0M`r^RShg;CK3EccUxLojq&jo-`w1+yP$uRlCj2%H4`hs9{vGv2~OnIlX9W}0000< KMNUMnLSTYFyIA=E literal 0 HcmV?d00001 diff --git a/libede/res/mimetypes/x-office-spreadsheet.png b/libede/res/mimetypes/x-office-spreadsheet.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b1268d3544aa1591a8f2239b395f69507d6452 GIT binary patch literal 704 zcmV;x0zdtUP)#0!>Lo zK~y-)m6G2}Q(+j#KWCe6de;0^;8}{5aR^c&kt~V|lo1qoA(<3`-AI2$V_kI{G|-z; zg9@z+LvqlC6clK8In8X84D?7%TU$%dIXmy^Vn6KHE_|-OFYojHyx;eIUTJuE_{sYE zdM~@H%fVo99Dqp(y^mUSnWj;EyOpfTn3k zQVt+Vx%JN8TFJW<0g7M2D|-Qm#bWgI^Z*czMrmnnL9!+0qw}Q!hHj7{gMczY4i8Pwrg(I`<7NNs+x{Xz*L46k z9*j}5vP{E`KCau3u5q$)FJDqAd@JwCcs$$11c5*xH;utT z-rXPL;PqbW4jjRDxu`x}hp2E6?2vf;IZb1Hk@m?6Dphq{3Wvi}iA3VU@3XC)nL&Q@ z8uQ!<${MQioVC#nL1x2bdP>kU`-%!xeQ|AJAyDdnFw)(9NncvJ=}sn9=g&;JZG(_y m!=)(82fMm%of;aN0Qd#;^&{yp>n-^J0000`( z(kX%tL7hdsb&wD`Ro5;BCFCCa8I zb1tr|tjteNPDX$%gkY*lwOS>{*oHXg=?;+##w7GZ4hG5JCzefEiANj{g8O8hJ>>WcX%^O@L}MgGLdNR>>NT zXhup#G9zeH17u!k6xs%uYD6TX`YWgMqd~6eza?Z|sIKKrfU2gVD8M|QD(if&=j{n- zV}08=vd(Tm@J{%))+#|nQj8J7Xyk#;j%E**Up`>Hve)%=D zwaXV77#KiW3t?s~E-rC%;toB%`|)11r?cag3=R$+PAOdi4sHdQ*%>oCxz*;J`zRvQ f*8E-Sy?^uvyGK{t-)XRw00000NkvXXu0mjfoG~vv literal 0 HcmV?d00001 diff --git a/libede/res/places/folder-saved-search.png b/libede/res/places/folder-saved-search.png new file mode 100644 index 0000000000000000000000000000000000000000..ca24a3676b9f18d5f6272de2f4203ff2cb4c681c GIT binary patch literal 711 zcmV;&0yzDNP)|6*x4SbI4-gE}ILTy-ng5%a zon51<{EwO8;o%3WdU=;vO;xXqj*d?42^bn0O8Wcz+e8ErVY8zoNhlVJQzCM6Gub(Z zwKkMWrB~zQ;{hOc&Z+mFrKKf82wMN3;BGWD2lMwvaql~xm-TJ35>n>;(efJVh~&ZxyzJ0FZqBfCt+av`q+Stqc5>@ zPSZ3csxNbT0N2;+)$M zE9CZJ4xL3mKY`kJs4b%N&oQmXKm(*n<|qaaVuJ# zLsl0vNR-1gs$epJdLICTOBRsQ2c-28QRg`{Sje?OYcEnuFee6apPnMgEH<|YipJi1 zNz)Vs*5}`$D-{}(_leq%5_g?KD&O!k<3t@jG!@Qc4`0Bo)o_(k)`2lbLM7c204Bt$O1}IW6UXSv`+xnJttaJ^ET>wofHhNb td$eBc`#5$3U~Y1HPr!Dwku9srt=}^@UuC|qY3Bd{002ovPDHLkV1i_aGVTBX literal 0 HcmV?d00001 diff --git a/libede/res/places/folder.png b/libede/res/places/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..65bd0bbdcb9005cb8929f06e25d9cb15a926366a GIT binary patch literal 581 zcmV-L0=oT)P)2|yPkE-3> z-8b(3_?ov1cYiV%432IDm|3sa>)kUm%nWx2;PmwLe!t&8>~uQMm(4k6LI`Cz9Dc0p zx&Tx;XIE7wlL@7i6(oef_V#uMc)NrGOsCVTl=7;s>w_zRjH+U0Ymj!k-P+vTq}6H> zV^0g%)=c>R8-N-3GD0!|F@>GqJ z%4)bdf_Rm4wwyD#6GYg!0ieZcvQf+lK>!v2)x`$$R0x3iqPe(Z=9oKK7jS;E^w*b55oWe`mg~7=)i^mlj0C%nT8s$wuo= zb!&(s!bMVmQn@?FCx!@o{yMsKc&XWJj=)i68(aN%$9JEC^W*#Yp8+C_MZ$~UM;0NT T9Al?300000NkvXXu0mjfM@0T3 literal 0 HcmV?d00001 diff --git a/libede/res/places/network-server.png b/libede/res/places/network-server.png new file mode 100644 index 0000000000000000000000000000000000000000..068ffebee274d5b48b36a68670e191a7ed4cbf06 GIT binary patch literal 642 zcmV-|0)737P)WFU8GbZ8({Xk{QrNlj1+3MgYKATls8GayP~Yjt8ECu(VJ zZDC_4AX9W@X>Mh5Co}I@0005SNkl)(8U!C>$i_{ANvESF31eP4Xv7tiy=bzN~?SBx=YjFItpELv*;zFx7l)^a|d zugLcVPN$RX_xn%;>rzB1#b`A8$N{ZZD~hf6kEhd#a=HAFJe^K4#{3h|T7Ln)hZo6Y z5@QS^f`||V0V0C$`+o_RMGyp`?Vnb++XbN4>j7{)9+}VQ0EkGGDU3rQfKI0~vqEBs zMxzmZ3M)`bAtD%Kh{xk7r2y#n`%l(jFn9%Cwbo);7Q^9?)oMjPpQltRvE6R*eLt!| zM95~d;XZtey>F7^I24OTX0sVeDdO=sg+d`ZmlkfOAR-hB1tyaT?RFd6wsBpT#bOav zVB0o_!{PB5>-9R-YBlP7E|~=c< zHk%EJM1u8tO)M6RHa6V5D+`CiflMX?K&4V4l}gcUHc6#Y)M_=->GVyaOM&N?mzN*> cKb`^p0DMpp{`zwTlK=n!07*qoM6N<$f&;Gw9smFU literal 0 HcmV?d00001 diff --git a/libede/res/places/network-workgroup.png b/libede/res/places/network-workgroup.png new file mode 100644 index 0000000000000000000000000000000000000000..5c140d838d18bbddd135d5e7ac28ad2de3320674 GIT binary patch literal 517 zcmV+g0{Z=lP)B2g5DKj9&4ziGxQYh@Ldz<{JPSh!3**yOS0wxei~V2Vi*{{dOM4Kovv zRNE}5wbi6ZySwNHF_?j=wRkX2iu@qzOg6WChjZTj?!6fRDP;?=Nv~7Kan6ziA*E~; zi$&Ws%~bbbFt7oVLIhx&rb!rvxURcpE))usN+tUJz6~S>kj-XsU6F|KJuzcTlfn5QxTCLW^`TZ@rZV?1Q zDwbgwc%EkqfH;m5e|e2{eSHJK{{9~A_Bn=Otk0lYtg zPbu|D(==+e8UU7MZ3QhBi^MJkaA8^2TSo*y``2A+fZgeIh@yz;bc&{F)a!MCRIGBj zynYAs`J5mKST2`@VTe)+-}ljVokpXPwnhLlJ3AkLR4QM-Zs=X$8~?9vCh1j58E;|% zOeT|;qs!;>G@H#wgrwTU0#Hhk%jFP4FdmN|5mGw%{$7L!q*k&!+xe}P00000NkvXX Hu0mjfZMxp| literal 0 HcmV?d00001 diff --git a/libede/res/places/start-here.png b/libede/res/places/start-here.png new file mode 100644 index 0000000000000000000000000000000000000000..bd516a54c55f1c9ec485096cb1dced235b70c9c9 GIT binary patch literal 658 zcmV;D0&V??P)1{*)Mn8?_jq?x)AhZ=qoOnNJT-LtJuokJo3()efaQ(G zW+r32dAan=oGTSqgb<&~>kTJvPqdStE;^cSz|I$hrt4DxRsleabJ|&4c}(87PUdW)F#w>f8^$QP58X61A`wqe z&NP{>)DrfI8@z%Vnp{{&!GFJi$&!ASx6oP{tP0{}b#Dw(rlfXIsk9y6zaFjOFd zcX#XrQVx@O;7bsw9SJ(OgFh+29e5Bzv|~ZwYbk-0l35)CfDWKD9F9_e>v}Q>!sEN+ zDJx~)TwWv*6TsIgzDhp^2T#-J)B)!OJ+Vox;_NH|L*to&s$%P-h;WG+Ch1}ktL#S s0B?!tqf%p&n`r_Sxfzyzwbxn$7J ~qF07*qoM6N<$g0-X?_y7O^ literal 0 HcmV?d00001 diff --git a/libede/res/places/user-desktop.png b/libede/res/places/user-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9787cc480eff555bcece6acfd9d97893670521 GIT binary patch literal 722 zcmV;@0xkWCP)-{{H`QVRLTI_C4R{IiK_0bIhV;#Z*_7Gw^)~ zfcExwUO%hjZ)?Zyv%GoN13>qOPMYsOz%0yLSMSAQMajm8ck5%%I~oN*RIy>m_OjYT z#+a&PpQ_$7i%|;rE<6ek@V=i$H<0%A;&6 zDW&0ND+6D90Y)1Dqe2*`a$hlD`npnX_x%y9jo7($F*WDUF+F>J;>`PnLl~!G@0yfC z6~WpFV?1K9G{&W;vupbj`aV2Ocw#fN=gj@w)0uOid=timztKfd6;wf0u+AdRAx_Ag zFwDzWy@;zD>+ef3n!ySaSjo|+0k9Z;ly$6#(Q>@meKt9W9l4qb;p^vpnx;AcUZk* z7JfJkD3P^{#Y0QmAe*<8aN*MJLNQX=FBuF+_0RIAnJqhRkn z#+dxz;NWwbra3_3z1I)|olb{5&&LpB43$cy3cMRZ0eZb&lIQuWG)>np0X!iDVvG}z za=BbA6bclJMXa?LV`#NnwA<~)@dzP=7(&j*N5^S)Q3(V9r4RJSUR49Etg*1NX07>| zc<NoK67f`+S&qLCK?1nobZA&RhV<6IEsRC?Wz| zKU(A9?Y+ZE35V^BzV+#8AA!vzPL&$(cW0l1vj3}nh3Z$E2yGGb;xF#2Hvb@(uulL0 N002ovPDHLkV1g4YGGqV% literal 0 HcmV?d00001 diff --git a/libede/res/places/user-trash.png b/libede/res/places/user-trash.png new file mode 100644 index 0000000000000000000000000000000000000000..0e0953c73c60adbbc762d0553f95a586f3054aa6 GIT binary patch literal 655 zcmV;A0&x9_P)Cml&2>S!-Vj|(%DY|xv2rmiUs+--iLl+4{ z?G|A~=Ohg>vv9>N%M}DMW!>HPeV%zbm|I~4O9R8eF!SL%Uk3g&6hQCgwr&w;ys}lf zIX1F%*Xv2Q_jYug8SU>IsAzqBV(1P`&UnCRf8PMZ!;e^5{(|GUxUTch+I8+M7rU?V zW_t34vrC+PH%AZz1VKm`?q)<3MMP26&l(YiA-R=YS&0X*u<(|l`}Zn3VP^W}j)^_# z_6NY#uC7z$Rx^mTh**raXl*fCh+`p13_7uhfHnqW4A$CV1<;djx7Tl^S>Kr5@mDOH z8zq#g#&c^~-&kgAv%q#=W$W-maC!CHfe5XaxietSj|8I1&`<#3&|j$e*lNa`-i+0@!$Xe002ovPDHLkV1g_FA-@0s literal 0 HcmV?d00001 diff --git a/libede/res/status/audio-volume-high.png b/libede/res/status/audio-volume-high.png new file mode 100644 index 0000000000000000000000000000000000000000..ec8f00b4ad0c6138d17957a9ba6d8616bb39a6a7 GIT binary patch literal 685 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 literal 0 HcmV?d00001 diff --git a/libede/res/status/dialog-information.png b/libede/res/status/dialog-information.png new file mode 100644 index 0000000000000000000000000000000000000000..8851b99ba1060109ab8387fd9254870480e9284c GIT binary patch literal 863 zcmV-l1EBngP)Mh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00OH?L_t(I%axK#NK|nY#=rmEJLA1N*GDEB)OrZasDZh+oSvYeh-b)!X&wkCqi5%=xUSx|_F{6#zu1AgWFc?@DNvi{=o` zb31h=C3AB8Z6^Sj!X$=0S8gvrAf%45EJH13#vp`HP#BtSD3rqJ8l3DdD$D`Ha;MgE zVZf?F;{_`ZSZ+ivaM`C+Z(3 zy#C(dnS~`$HdpLVs~B>P!OCIcuN!O=LdQG1`sJDF`RueL>!EAy12@kc&bs9OG9O}C zlIXN&Rr?p0a@>O>s=)e6!>h0VgJY)~t7IxXFDosw6duS%G|xfRb@-M=47tYf&NZUN zanj`{?Kd7o1OPy7T|;7sZgB-3|fr;X0czA^&R5dAdz!r1Ht08mwZ p@_LOR#2;B$Sa_Y67yBrZ={HtPHeP&+9RvUX002ovPDHLkV1i2wZan}1 literal 0 HcmV?d00001 diff --git a/libede/res/status/dialog-warning.png b/libede/res/status/dialog-warning.png new file mode 100644 index 0000000000000000000000000000000000000000..a9e4ff3991cb0ad2a99cc25e2d13c35e52c680c8 GIT binary patch literal 603 zcmV-h0;K(kP)J2V5SdEtMnl9PhCxc2Fa&}~V}o=Tx)35=bmuS|@d;cT zbY;Loz(q+`1+A}82tI&NTm%Y*7F^UoNilyn))L6H_Q1W1%i%j`bA(=?F!-5EVN!MFB_9*XAp~_l%n771CUH65fQk#;c9J-59jBDOQ<*CorDm33|CLV znm<0~VYP}<3Z)daS`C19yN!q-BK$Z#V4_~XOaDE<2tY)*Zne1F+TuNYlS3Fj19`yz=_l|J pl>P}02k>Sh;xD3f4Z|KZe*u@?eFz-1;S&G=002ovPDHLkV1mMw_G175 literal 0 HcmV?d00001 diff --git a/libede/res/status/folder-drag-accept.png b/libede/res/status/folder-drag-accept.png new file mode 100644 index 0000000000000000000000000000000000000000..44055dc80805a921600662d51a5692a456b5db58 GIT binary patch literal 615 zcmV-t0+{`YP)+9>o)z#GnGsDc7C>jg~Y;SLG)ph-NQrzu!0odH! zJoj;7DI%__^m;vV&NGmzsvh?H{S$Y`-KpyucV}&FZ5OzI2_UE{W;O#^Sy`E1TwJ8C zYl@;E#z@mNbUK}T6IG?EnrbHJi!%X;2u;%vLLh`dj1hp8($x7(OOK#Xw;5RnUjsv;ufoO$sUX>Dl9KbRp~YBP41xWlQ(}nUOLy2gfStoRmX}+6*gZhh zt{udne@u3JU*^`$kDm|fC2)54y4N;dihayp{{nyiVux}IM7sb0002ovPDHLkV1oA8 B3k3iG literal 0 HcmV?d00001 diff --git a/libede/res/status/folder-open.png b/libede/res/status/folder-open.png new file mode 100644 index 0000000000000000000000000000000000000000..b67403d9fe8cc15d91acf2eaa7dba47e815dd5ae GIT binary patch literal 625 zcmV-%0*?KOP)i{e+ zE)M)Cu@n(kRkpXc$vKZfYPH%-yWKu;cif$-s&IE^XJV$6vP>MgS3^+wBrUAcR1S5rCA^@#aer@s!dSAm_}e zZFfHdP}SolmMJAuRdUWOe~j$)B2YWmI;-y2W}YnfLX2NaRYgR|IkVe~JbiqRB8DT6 zfPcJ`q;~1qi?_E+5it?L%m_FWje@oBzi=Pw38#DqVhr54JV6LpDI%si1Qan)#6S$; zjPOKd`u$A23VWOEut9F1wEs#;2kg8?)r>ul{0=%kmf=A()x*Wv9;dYfW|!g}xZQq{pJuBgGKd*f}JIxK+Bt>L#rI ztaGbb=gsO5vR(W`JMDe4+v_qnuDtuOS=|I@?en(_g(qSIv**77-=a~Y&?|SC00000 LNkvXXu0mjfka`Wo literal 0 HcmV?d00001 diff --git a/libede/res/status/folder-visiting.png b/libede/res/status/folder-visiting.png new file mode 100644 index 0000000000000000000000000000000000000000..90024447a1600a0464737b16ec6d8ca1e27b102e GIT binary patch literal 429 zcmV;e0aE^nP)jZcMCr0PM7(_YI)X2H(PW@dZps zD0l%2{;Z|3uqUyxlaNS3Oz!NQvAfD8kX$^;sb=TfIoVlfX84cdd_H>w?6z7Uu~pT6 zuh)A$25{5q4od^KX@84yr38T^IGO7xl1FFw>Od$l25k(>NMUhC>-$pZoh?o}< zBUu|j5-BBmRplxFp#%Up39w$T(P%V2Jpia`ZNPH5G*x|$&bg<-U~pd-kY(A2h&=oN X+K#=2j3kSh00000NkvXXu0mjffvB*& literal 0 HcmV?d00001 diff --git a/libede/res/status/image-loading.png b/libede/res/status/image-loading.png new file mode 100644 index 0000000000000000000000000000000000000000..174994ecf986e18d6de4b2ff6877e8ed9a4f56b9 GIT binary patch literal 481 zcmV<70UrK|P)3 zS}g!9(*gn4bpbF3wG8@_$>f+7W!#w%PSheH!jM3wvcyMv5un|^rPF;N_y_>FyEiBl zHqbO}#`q{fD13c?a@D+~R;{CJIsks(r)-xv*ejxG+7v+)K?FM84z+5Xl%7IS6hwrS zo}%JZxo%$0jG&Ap;O+f2QXYk_>GWQDQ!g||U|JTjSS-45T^ErFMVaFO0V8AJ_k95J z`F!-1e&5G1R%ULL@~ikrI-Q|xm+*X#Fbv7%a(KQ+*)FkO*g)ofBe0~Z9PSl4IX&k2 z`3Zn*c9r7(5zD$h(?LXFndWeH*xBA4+YKV^ISvwu1b;zXRn?nHrLwljkgBR@{1<)z XxFD7Jl9&fr00000NkvXXu0mjf6eG#r literal 0 HcmV?d00001 diff --git a/libede/res/status/image-missing.png b/libede/res/status/image-missing.png new file mode 100644 index 0000000000000000000000000000000000000000..a644f242df5e719fde28a0d1b0ddba04cd40e340 GIT binary patch literal 427 zcmV;c0aX5pP)HOP!?RCysN1bl_1UO_moYLvGvnni}~vvZgkX2KBWKPVVimBjALGcw0a?2ks237G|1Br@SL3W_>`WZXa8 z5gx?&>D=*{%-w^=%nbVJ4mQ>{e|Js7=&fM%R(vPu_xt~As%e4^YA&(d3cVhTCLK&Bw17g6TmTG z1V{n*fT@5#xT4HeH3O0?b^tS7rmoSw{r%V-b~ZOQiN#_pEk6BTsZ=}xe=t$cSGQab zmz{mi(ebe{R#sQJ6}U|#@&J>`gv;$R0T-3Ye*j4q&q%WP893+j`Iw##vHWIvYHO=7 zl>V7MAB{f7>-7Sh`X>Nf@%e^rz^+b1Cz(tJ;8MUJTm){cudQL&u@hi-JD_9GGYEiI z(AHxWNfwU+*8l`T2hh+oL9th9b-HH241~;Pvnr8Dpb>-?Kv{uGC;SGqx_WF6pgJv| z1wdDW+XMBRg})V4l@)2!{{iYJm2wreS`E+xP%4!GD3*%b1NmGYfLE_yGT`11Fln=P z^YPOM0P?w93((NSLZJrC%||(L{3KS3&1kV$2}foCC=?3Y0_)jq)}YtxNhW_}CU0Ih z_SzjhiasQ}k;T#LB>pW95Nr2@*@dMACdQA@(``3uG#cK$e@nSi#bYy1oMBO%h6bQrj!1R8#$B#Q=Wvpxb0Q=5Y{ jFbmuT!U2DDE_ literal 0 HcmV?d00001 diff --git a/libede/res/status/network-error.png b/libede/res/status/network-error.png new file mode 100644 index 0000000000000000000000000000000000000000..3f18ed0f7b27753d31e8b32d3260ff67ca19dec7 GIT binary patch literal 646 zcmV;10(t$3P)Ly9fpuT|}UfbYTqdx+)`t zE>;&s!jQTOByyl@bR(+_4Ei&TsUP|cX>HEUozul&wbGB?yTkMHyyy3v_Xzf=@YrY+ z=*PMyGz+o6C(w)E-@2=47zWX)$w4av{Qg$X2Jh^uO+UK{fTe*D0)VcrqksY`=efD} zNGU4@R;>3Q+~s`NK8nI%$*d>8wM{lxsOi!Ela-Cl%5=M?1E7@pjbO$4^y&%R4%2blGpthvFStSU0jhfsv>Kme!P4Z!B|GKXenNREtvr@1ynyWPgx`VaD3+wA}H zk#puJy02VDnI`4MMWj+V8ye^g2AO^Q2uJ7fNR7e5=T%UZ>8IXJbF8-qwZ6{I>MBx7 zl$4axX>7$Jhfkj&`!;b&`!f(TZB)&i8{ctyE}-8SM%Q(OfJ&P}2!RZbp}%-uK`;!1 zmrsUk!h7WzN9j5Ufe;|2tiHVvf>I_^4RInmH97cq`Ue|bn8_rLfs5o431q2+ESHf| zqPgAVT`ug!(i;sJynbznLZNm+GDq532!&|x=s+|zQBJ3kfW5gHTT2Vy;_;k>TN=R1 z%F4eB(AGvnUmx?)C|;kBdaoA+{4`Bc@px`0pT9Q%F%cdcRaXC@?rVz1*D>l+OIZLL g%$MQz0K@=(0j=iR01IMI3;+NC07*qoM6N<$g6_H%y{W;-5;PJdx@v7EBiGj0WlV)4U4tf85kJFJY5_^EKbjzw9)H`gNUpDBth=| z%F(}AHC;vCZ2Q98qtLM+K~XT=T3h`3UHJf>wp`ZNf0;IJ*=X=?0q3F>7nL@0EHX4s z{!n(f_We2Q{9{gw&)q9y*`*8md1BISJPKh^`gNSU&bAI-9L}kE-f$I#o1tZ zV3Q7mO}>;y!zUZ5*h$YTB@>ctZLAUw&VF)u(jArHJ^S{4{xc~w%f&fNPVV$=SwlvL zK#}_#z7dlv)_iddzV`WX@2!-rs#bkxfBf@2dFyp~C^O5{hSjgFHLk2V?X5l4@AkHr zUw6xX+^n&4>MeEO%OU%jHB);(nrBy(E#j4MIeg*&T_}J k1-uG<$^WzyA7wA{f0tJw7x1}k4=6-EUHx3vIVCg!01URBUjP6A literal 0 HcmV?d00001 diff --git a/libede/res/status/network-offline.png b/libede/res/status/network-offline.png new file mode 100644 index 0000000000000000000000000000000000000000..1f210fc3e99c84148bef3e4f10d7fc779ae27c7c GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE%y{W;-5;PJdx@v7EBiGj0Wl`lin$Vt7#J9nJzX3_EKc`M+UU(xD019>dAMSu z_l+x)3X}u|w^+HhIL=P~$7tmma6!Q1QNaxn7tXa@oR3zSn(X8f6l!u5si>SH=vHZZ z$8^TCrR6`DeSiG>ckTV(d%g>A=%`Sd#_V*%-D``W^J;BJm6PTnA)!-a?4&muJ4~us zlPkk>RqtFG;|5a!7RCmL1V)2~b2~$Jxn2L-*C_k?;zz~Tjhy>frv84WBLCL^-aXUH zvV|^T^Wv?q&V3}o(3bc|sprtG5Gm)N{3~+`8(`+tXjmq}xxY{>%C3a^}XZJ8qY^EM$8w$6uGQ@#-T* zDb@tDxyy7oLUwa>E&322v-9rWKdO@r%M-pA>{(|}T$H7Hd>^B8SMNu^-KW|>(c|gr K=d#Wzp$Pzzw7-x5 literal 0 HcmV?d00001 diff --git a/libede/res/status/network-receive.png b/libede/res/status/network-receive.png new file mode 100644 index 0000000000000000000000000000000000000000..b57c65c86a666d62dc2120e6410ddd6cfc142857 GIT binary patch literal 456 zcmV;(0XP1MP))` zICpaqaV&^KTSINZ*0wQ7;?Ncwnndx&yZ7Gjp1V)r6Pdkj9Y_!yXG%aZF*7|&I2!XT zR!h(5c`X@aKsXv>A$3hC@00Iq!5QIVsvB@#O0R#XK_eE^Gt5JejPqX_> zje=FH@FFH?cPyG8rc0yrSyeUSIfY>u=y{FGTdS9m0dO4W2SHUM%q<;y8r)rO0$?}Z zT{{?@03o_;@%XrlwNQA(?!jtD^Fvn{TB0mVyjB~uJD)ULZr0rKf!Ba(m%&r90#5gJ zSs8J$t}LfqosuMRlFMe4K~b$__@1<0uY2Z|{-$rwH+-)Epj}<~8l35QE&0ozPp7wb ycKr;JYpd&+rs>()X9au>D3{CpH%y{W;-5;PJdx@v7EBiGj0WoF~ZZl3n1_nk|PZ!4!i_>!_*?J!i5NVq~JLZ%9 z61}@jkKQRfQVaUuEXbu~;dMmo#ghR0OYsUU$*lj|n)CFUEM|zUYP`1UVUQ3zuhgf+ z53=Vg&!4V5x3`ID>$h#T3mkV^ZCY|OVn+OuF!SQs&CA*MtjnIt8nAk{j=8=;&lca6 zoZ;uV7?v_Raqu`No%3ThRAAV#cb|IKKATNFU$^W%e@A4+bh-Ydw(tB$Ut9Q8rnrVx zozK57D%)VuS1+(?gWKZ7RsX7+z1F;Y7?ig8j9_W(Vta|_o2=Z~D_hF69z0vezwtzB zY;^82HB;ZmM>4mkBn4$P8Oo&QP0-+Ix}$u$<@u)_fj_ty-u;YBbU6Nc*ERY2d)u~` zm31?%>HX?^$l%OepNPgo3^n(k@1K-f6Z(bobP0l+XkK`cgEryf*^u|gH)_;PL|g84=4s>1sB1& zn}g!wA{2*)hT5XGwlS2(p$7SA62*7>xV!i6x%(snls(urfE3{>DIvks?93dR7V`~S zmW5H)(_sc^T8#PSL*LlV*){;729hKJkW5YiE--voDh~_>gP}nfYyS9%h2%JnWbxdb zpxgVT{b36^ipLs_Cw!-9)T$U|otM{P_lPnEfa|(H2+??g#kC7mRU~qpK3Byh0Gejq zw}IlZs;WX_dQxD$zkT8xmFttOkt>WWF%prfH#&5C4(*P}S}5lH2FM5ocaL>&CC^S^ zU0qodDrH%wP|Rf&FUfKGsBiBhJMh$MwSsrhs8zYlrvk44pr4-x8kCH(p8n;}XEHl` x`#}cjjrC1z+xD&WSb;zTOw;7QQo{KDqAwjve&th-`0xM#002ovPDHLkV1kYU!uMh53JODVWnpw>WFU8GbZ8({Xk{Qr zNlj3Y*^6%g00H$$L_t(I%dL}3XcJKshQBdmO=}WK2*sjAU6hhd5#yt+Zd(e1doe0* zEUsJ`gITmvM#ga~f-W^1DTrtUu~>=^(6kh~)5e%sgrb3DOh{)kX?nXzBGWW2F8o&a za_{-if6n1ZY=f#P$2LjfePK3jO)CdwgI4G_fWqe*g=7sZ!av2Ib z2WH<=d2qksT|xqUUO$Fm0Q}k{pzAtrmxr3$g>~gJ)%iI}3k%4_62j&?6gtlLY#JbG z7nq!ydWvDL;_vRk+2ukW9>EhjMs1%PkQf{oVrcLTR@EYrcma^u)K^tgt^yCk;Y;lA z?g5~hN&&FDx0i}lp`ho9#~%a4qmkIfErU@tB?LV0?>~Al*cT)aI0V4*@(+^pb7V5# zegfB{k=Qe~pDd`F@&pKv437fvX8JY2STquQ)OHvC`!?D{7FA7I-09B-#m?ycsB>F! P00000NkvXXu0mjfAX6YG literal 0 HcmV?d00001 diff --git a/libede/res/status/printer-error.png b/libede/res/status/printer-error.png new file mode 100644 index 0000000000000000000000000000000000000000..21d4dedff9aaeac152b367c1beb065ccbf5e80b8 GIT binary patch literal 652 zcmV;70(1R|P)Ix5tl)sX-I0vSm} zK~y-)rIO!ElVKFcKj)n@BNI0?x0t$y)s@O{6$lm~B1Bh0zo0Jt6YL^trbHm#N^~jR zn9d7t^X?Vmy^w(^=!FP2Fk>(oZne$V=XtsqwuV0ndf@PI4xG>V@jdXLPyTe~60>7K z{2%hhA3k_AdMrAZm^GzR=}apYi)Jn{YmRbiPQouQFP~aE7K>H+CjvSo9ay@OCFgk@QX2wBG=H91LseI0=Pt}gW8!07;E47P0}B6t!B z&N&Xz!9g1O`vJ(NQha&$o*9w1PmFmX0I%XN$AEZUT^-l1UPo&U8yk40rnoyijLBqB z=``9HET0e4)Wp*CG^txRKO6zfX#6!wDO}eD;Pb!$k@j|c_4OR??xMBEXpPbutGStd z*Tr$1$_OID=H@2BU=Z83aaUJq=F(~v7=!V8K?ISqI!Ya)lqz?+w^zMH%d*(dfW-XZ&y+wCkdk zLTgP;Yb!tfeo8GZ)hZ~Z=!x9`pw#GNePV*1-d-dSK<(_H0Z%Z96^XE&Op?BTuL3wY zI3N@XRW7crjc;39BEh306QPEcFidJh)h*{a}$Ny`_LyWBA zwsW56H_SZqh?y~}nsxaS7^^jGc2tjy0yOKgLA+~$i>=6a)*ANwKLO3Ud;^q$Yrrk> z?#HoDCTD{3I$4^(dRYsd0`>s=fl{qu=Kz8s*atqYoN-Y}^KKg#me_pYi%`60`Tm{5 z)_vLYm8!#3@?PicnrIks&4p1mK7FE;_WNj-;?gB35_TS$j>LPyN|^_9zjX6n=lAyk zZe-ndn7&*h=sg58{Gsmv2!Hz?Oi`Jjzxb>ITwN2n*ZY4cPR{$Nq`K0^k^#E>2#Kml zR7IB`VS^R&&N4w<%A9vUHS4k&KyDuAgovCS+qym6wENT835Ud(KD1>pw? z@qH5pP8uridAC!U4$FdZyoV{)vU_~anizw&FuffGy-yr)i|FY)$aJ$MuJ z;6I2U2!aRygcs}4LlLAsx~Qec_S8eD|G`r!wr9hp5GWXY9S_mf+9WC+c!zoO&CK_` zk4LJC^8}x(`)>o@F}F5FUX8=hC?5w_LK6(p;e`3!t z$cXNH#w=Y=5(6RtKpe-o9LH9epO2N05s4V{W~te{K)(NrrL|aWHp>8>W<)b12QbmI zi$QQHsn?;t4?Q@5?(ajbMJWt1m!_U4^7{9l!p4lKYK%F&ySyAs1i_$MsQ@BCuLl5d zCnwlyw~xQ}`wv>G?Nbay-YlXtG9DGl|y5IiU!13ukxU zhnM#p_Oq_xiEe>sEA76t}Raj3J4p`kaZX;?WoG4{iIZZ4ncKX~xT z@u9OH^WDrXbhUw)+eUNKqxj_%VUQ-~v=VGt-WvXhhidAXyEez#Pdxot7vGc1XXJKq zQO>+FC<_bo5(I(x{#`kKqEDWC{sYiqw^#nSUc57RT#jEua`J8!?s)YKFxa2$sZMo0Pdvx}U6y%&|sXXK^R z!(_9MlZYpG-DaWi72{V%QMr8P0x)=>GmW)iMX**dTF_cB+7gDAC^G0suokp27-JBT ziwYo@&&aEa;b_^DPnFdzm@K=Sq|9pHI=HNA)TdAC@?X$tYZJVC;%c* zpKfDs>&pQ6{sQwir|=)#BnX72`V3G2z}YrA%H099H1^@RNtTMAu(h>_oJ72iWMVIE&3PhSVR`i%mWtof+;|8p7Gn%v+`Au8o66#OH7MmE zz%T2QC=~nJdQrHvKGKa9A*^cLzop&jKq(gygNU%UeuZ>RH}TkhQhOezv*QJ>FHWF! zgcXA}=6-+?gNVUeOBnt^@#n9JLW5EsH*SAUST$IqvDRSiKLH7VTQ{#q+5Ja6D;BFk zi@|8Ym3M=?gwR?t<$@1=4CctAV`gw={Zd+GAk58>)=AJMB;q7gvf17rq8U#aMg QBLDyZ07*qoM6N<$g2tO=(EtDd literal 0 HcmV?d00001 diff --git a/libede/res/status/weather-clear-night.png b/libede/res/status/weather-clear-night.png new file mode 100644 index 0000000000000000000000000000000000000000..4345752699fd099dadde439ba908e0cd5f70274b GIT binary patch literal 961 zcmV;y13vtTP)!PH_n1WWbi67KiySvhR`0&B~Ua$As-0XZM0E7_ly>wyh)z_!5)s8xc>>X^g zzrRaamN>#8O%rzac8TH+(^qHo$jIm`Qpy_u&f?O-sONbHvIrq?9EY8q zZ8}kmk_uB8vMgm{e6l8lcta?qCeNK6kx7yeM;$6#VXY;s2lVy#<2Vij11Hg1lI0oJ zTDEt#7(P4fD5a)ERaF;tO%q2EX_`R=p64T6mpJNRZAB2&>82@Le{Zq3w?m`ZAP54A zq8O9bT7=`EY8qna-_W`#WvyUv@CCH4A%vi>uMg?E;5hX1oXT1ND}@mE(=3}hH86-) ziYSTc935dTgkcDPwU$<^1wc_02qEa@JzUrQSrkR_ZM(hM^F1G3(=@`6)2CnLWPd-# z7^GCsTIYE_Lbx;=EjHVa3uDZ>0B&#G`^LDg#P5z02!XPB9H~H$$m(i~e ze)%5w_p j)AbKkRecBCK92K0k|1G{aY4T400000NkvXXu0mjf5y8v5 literal 0 HcmV?d00001 diff --git a/libede/res/status/weather-clear.png b/libede/res/status/weather-clear.png new file mode 100644 index 0000000000000000000000000000000000000000..7dc15ea96efad0905b544473015fc80b7fe7b4f2 GIT binary patch literal 682 zcmV;b0#*HqP)W! z3fe_~f&YQDYv&?Y5flVLjk<|wlX-0z3ufq(Vbc5^nq2rNXI-1yenaLfYLBs4~uT(Wh49B7U*xz_+u1=$qv z#gBA8SHroS)t|T}=?H7zVP)z=>1pR}i_}fvD$u&?1ps~|en?~6bxZe}9X<=GS_lQS z^p52HV{Cm+h>@sg^hz1yDhbrk{?gLd%#L1yR1NrXR2oBd;5xcVT(!w3&nhvlLIdaO zoBHg~8PE!tZ6+S`pOL0!qP-_P?`WgfkFYag0u!<5)MQt z;R23XKNR=>7Evr>Y_OJxWEq7?PyqdeumH&-ge3@N*;I{jaHoyN{$p>f{lHq)$ literal 0 HcmV?d00001 diff --git a/libede/res/status/weather-few-clouds-night.png b/libede/res/status/weather-few-clouds-night.png new file mode 100644 index 0000000000000000000000000000000000000000..d69efec9810eebca203e673210cfbe7c806205c3 GIT binary patch literal 965 zcmV;$13LVPP)*zW3hu?P5X+UG%`= z**xd)@NkaBf3Ul^GwZtUr>^VXNs?p^!1w)UX`23=B*}x#jjb1N?^|yPZO3uG%;$q| zR+d+Wu3fus1^GPM7?e~T9Ut=W(N7}FvagdQ+1uRM(*GLl?(Nu~=lwD>Gkf!HV|^&g zGNcm3BEoZhk|d>6DiH()9zOa}J$?G;W2MyX&5bQ>1K76x#r$0Ty|u>rP^WvzdArHQ z#Ti+aVc8Z!^f^Co5%#(?R`2>VGqdlyuKN{$wY#@7o6F@M-~a6MVzbpmN=dIDB89~F zeJZ1)7_CW@lzbr|$OjY)CBA#`ZQSqo7H#0;#_C$GAN5JIg!bhHA{Jy?W7{^CWzlT4 z=!QK!*CR<2gos&LUdh?E{fX^)-uu(jH{5=|PcID7Mx(W+SST<&GJ<7Ul*?D~eHW<& z#u!>>O{S-BSf1zIakbWqzVFiuL*iI~9=!J8;DC#E8{4)S8yjP4YLY05DHQXR%cBJO zfHY0(t}%vg=QU6Mc*5!FDZ|6Vbi*#ow^yiEYe*?LIXPi}f1h%>LaWuJR;$riT?a7E zhaau4w=dh*>+=gNEiGfTVX^)WP{8OxbfuC=rMNmW zf&q*+B#ENkZsWK%_4x%H$GK+%2qB2$7~l6%Y9Ll`u889p5y!+LMo58W4eH}K&R{my zK1iY{TDx+k==7rqAp~I96?E0qg}CrRd~Fo!#>c{qO2M5w{{dH`J8|d2 zXctvnXjBxX3KkT__p8AsZIiaQ_a@%C$Az{8O9#$khVy-VXMQuHsw}i@HoYE*hcdaL zg?hpZssV&PghpUN1DQ==v*~R>A(Y8|`nMMhd0-I%Eul;<_;SQ*OXp8cQTJMhsC zr0;5c<3qD*=Sfv<#Ty6b`>=nr_o9S#H*gT>oRvl>%7kH$AYk&Z(m%eF&g3D^8%)!VK}NtqlD|g{|X|god9)E^}yy~ zX@CZ75kubIN?%2}76!^FC4?&87-~ykzk&v!(_jk_Oh8ZutpEb(B7{bicr8Yup>0UI z4t8s-!sJArSk&e12bUMGqlAo4cl#ICxj)`qe&4(2Z2yJN^C0MMY1J{ zGvnYm(@aiI(V9#G@ZjNnzf>yq)KW-cb=ULp^*<9WNqlQ*ZfeH!JUrK>uC9*dZEbj- zM{%r3ba53L~DEd3S!Y1)oKOTb8$VF`ue5#zK>V&07#`$h{*mq zgHR^-EOGeGHw|=XWMqVLxkRa4#&H~~)e2+90#nn|_`Z*-QmIw|p3eJ?zV%N%dYroy ti9~h;)&>eHB3g4-MnsIYcFDjRSg-&9002ovPDHLkV1g<{Unl?o literal 0 HcmV?d00001 diff --git a/libede/res/status/weather-overcast.png b/libede/res/status/weather-overcast.png new file mode 100644 index 0000000000000000000000000000000000000000..0045129b8759981e0bf80204eb6c319cae56f36e GIT binary patch literal 975 zcmV;=12FuFP)g1W^UEh6hyU%Pk3T>ug;I(riU4S6Xh3UC6h*xA_Pcl8JO2fxlo(?a@SK$L zJs@q2c^~-v*wL~2#c#gG7<1Pn`48;6F4=63J9k!J@7ew6xzT)~BbUuJg;98R&uP{_N0W{d*ggQi-;!ed@HJUFp zCX%VlA1lkfFTL=}`ROZ{dE($O0_bsFcW--JJ55c^3=Rw;r6ST1LQ1+ix6{|xkJg&4 zTebl4z}d5Bx(^H=KnQ`7Ql36mIPL%&5v?JNLTa@dD=W*)&K1$x@L(oGQ*$%f>`rI? z+WeVJ=Am)dby3#Z!yO&l@H`J~3`$D;z-NAb4!5y^QzxIn_v>7qo?>xvksaH2V2v3~ zCX#5ak)wrte>#=wHr6^fZ(e8emq})>{z|#L##6^n0id-eolY}7Jw>UsgyT5g_di^^ zAcVLrM-CsFTwJ=9nVm0YS8uP1v9S~M_4XsBOKa=>M3H8_woVZEq>?F)j2K zsaHyQUI90(wd2;@qGk=Pu=&CQquWA7oDA5gh99&lYuY{y9L0m zT|Kz2d-~|;m=gn13LM8Fj6!_hM=3=ZhEysQysC#+t+F%M?MNvc|iUNPeVl8S%NC5Qq_4qVR8&OKVDy8_R zqdo4d{p3>_j=w}#>!~>J^Wt zQRsRWPrZlobb>msmjg~GLMa-f&r|o^41qupUC-ihID}H_OmAP0O^ZasZ-kGBUTg4p zM4?zj%+7JlaR|%(`?xP(#(MH3&#qpj=y32?<{AImD@do)Tdf?7 zM6mdLR8>_`Sy_p-xfx3!fUEK_)wl1Ube-f{GN+V!PXgm>$>dw>AAGdc*w#jNc9vt8 zwmsev0B{WsQeIr-XfR0ri|MV+Cr{o6K9jLnORjq=aji)+Ylnrv7K>r=`2cV_oz&FS z0B|rG#dhixPLrAA=}oPBD)HrfrZsN@kU|W5J337I&6@;o+}Mrj=;-L4*t!M>`K7ay zI=^3AO{a&Y6#Zfho;%Xiv>1v+EGCPE#<8*8h4%J#0OscAc4w;>E|6JTV)^02d^VM8 zHc5Ej9S)mw^Yi!;i9HuXq0s(c!#Oa()6=JMxm@PeRO&-94(Zsrb4M!b>$e%D5=ODO zT|52$Sw2rDoo0Du<#Lkb3f1N=V}BnVP)1<>VM*AxcRx z(VuMX?d_$eX~HlJn5KbDCL{jHW^+=?Fd^h?A;gKP$n0KgbMGmuIh(lm|CFU;?X z#bV&L4ZB(e=N#PPsP{L}fz&`-B%)z{VSe!H)t?#wJf#e!2Lqlbo`^)E#57GrBOM5Z zLNHAeuHzsW45Gcg9Xs-y*x9-hx~@Z2RU(8)4W$PI6u@v#S2qtVi8T@Fa_|8!WerwkxWv6pm|3#48yovU~`l!CD^+b2QmUR7b zf55Nk`u^jAfl#ql#cpg?)R&9&(*AxJstgNo$@3ot+ zdxGwAJc4c10RYs5f*K+bmQc!qahAmgV`fe?a;Y0|_Poe@HQ zu{8PO$$dj-9u9>XzC3bxf8fTJ%VwvqZ2tJsa7(RPL*lt}jf~Ong^<$<08C7i7-Q_4 zkQ#_q%I0>)=t-qc`QZ4`lv*DQA`~oOj*?rtt|N8q{BFkRg^(KDQz;u7Jv&1Wht-Cq z(R8xofxaFEfNx_X2PsK#Wuq(~+S`QL%fD8gn)_Dj*!f38e&6zFI=T12f&1#D#5SrZ z?7ib71OCof8@oT!2tvvF+S*Ncu6X+6soBC~qZ8iZZ|k3Z`s%?+MN!@z8%?RvXq&RX zGYm>eo(d^_%YSW(2V>ju-Nm1)uH(KrcWDmKKjK~UGEJNee&%%WArNmgeAy_BMIjv{10bmXcuGjTLQFzkaN%WJ4gQkJ$RtD`c_(b P00000NkvXXu0mjf0;%3A literal 0 HcmV?d00001 diff --git a/libede/res/status/weather-showers.png b/libede/res/status/weather-showers.png new file mode 100644 index 0000000000000000000000000000000000000000..d9685d242bbb306a574adac8a08afd61f9e304c8 GIT binary patch literal 959 zcmV;w13>(VP)cUm61$ChtEe1qEV#S@HNLM22!n#rj6)U(iSeJqesTGZa9mh6in#sR;?8;|%8reV z3ui5H9HT>x2_ur7rkFf1nVp%QZjn-qSF6>#eqH=+UK~GhtQDxg_`=E7I5wCl;?|)d zu3uM5k;~<%c{K+6_Y!RRtW>XZ{`|Ko&?AATM@L69;Bd~-o$J9Evs?ZB16XSj2&$_q zY}PjMeV@KPc>z3^QA*7nIdnt{A;{3JU|h9paNyk8x!^q`a!ReNPAD!`+luHA@>24^Is6=bEOxs+s@#XB~L; zSIQghu>??3zVXb_iA>$>5QI&l#t!4d-2`EiAZ#*}Z(}RE*8jD(O)Usx;H;E_%(+sb zx2H4n{6qKNrj~04KTOy+(1nr$KTOy*O{VVb<;q5gA13^;STWAocV7GI)g803fs{hL z{L~}+Rn$lcbb>ZJOcZ+XbwZ#M`m(LmO_M+;R5vv%>p|)q9}f)nzhwNyOA zY7moJhe=W@p5gL(NVctoif33_tMkqGmm=W3&wlwJY>(q>LEe9Iej!cmQT_)Zgm%u& h&YpSp)7?aXzX5{#t|NXs>Qev!002ovPDHLkV1g@wy}|$h literal 0 HcmV?d00001 diff --git a/libede/res/status/weather-snow.png b/libede/res/status/weather-snow.png new file mode 100644 index 0000000000000000000000000000000000000000..a83d855981fb90633803a74257679c3a3ff24019 GIT binary patch literal 998 zcmVSGm{OG{Sx72v zB+Z`+;-ae*r6>wTr6?g_T?RrHTBsC3id0JxqSZ}os!%~tn+esHCYi)$)X}sgOp-}5 z^XA?AX5L&EsX|K+oXy8MhwuB~2=2qk=rF)8Ddibs%(DPOh#!L>I1Z$T2H(3!FYYs1 zKx4=bUEkmNTqIuKAhcGb)9K*auT%LT2wH(VK>5EQ>#n&;O8J!#A}6K%sk3u`q`CQV zA*IB!EaG)_vSoKmL`sWz+o{mIvfVFuO55dR@y@=O)M6}QwpU#KoALs+01QH zQyrz?xvZ>Yn7DkY1k_l-%dM?@r7>kp*-#a(Li-wDZ?UGjdh1qUkI&JlH7qIF^W+{Wr5v;Yv{D#j zh(;eFpU+V&74h$Gar@39+qOAutgo|>x z9_6sgn#wYA&n?dfNIE3B-PI%xxE|4je!!SeD_g{M5qU)t7qQI$_vmO$)#?L5_06@2!7KmV+Hq?Yp3Mk=}S!#TI7 zyU&@pe91j}?5*%$8JE;jp0V#|xV@a^ov%;eWinWn5FF`hp`Zh751r|S7bf!levEJ(*xV*KQ;#HckI9dY#{_sG{#t5^8n!kMb8h|dvIWA zZgF$y>0MD4*F4h8IlxpJgZcdCN92{-YGcP67YKp}fBv4@3V|_(;0n34g U;~0);{{R3007*qoM6N<$g0%zDegFUf literal 0 HcmV?d00001 diff --git a/libede/res/status/weather-storm.png b/libede/res/status/weather-storm.png new file mode 100644 index 0000000000000000000000000000000000000000..feebe1d4e2aebc95b8cd5bea560e1173a0476e2d GIT binary patch literal 1031 zcmV+i1o-=jP)Fci}P@+&ML}xC~e#r&~57z;(jt?IfR@H)( z5|Ql@+-hfFXb6Q+DizTZX+>qDjO*7|aqirh51^g{c&#%D!Y$?I)A|Bs)4fl6;A|AYijj9Xl zCJX>va1c?L6Va*j7tVW?jSBu;TtKBct;Wj8d@8L@|KvE`x!gJL3)P&L?8XuNI4@QoSNeh z(Z@t|k|&eh#{P7ANcq@lNtqgYc;(n*Z57fy*kUE`vpq+lM;=fC?wy%h^%9npshaJy z^`!R=O_+NP4FF6}BAwn>aDBIsYW>~@kP*ckBXRY#VypwpW8?R2(O&FLr>kLr}tbgPhVPbG<`Xd%i7~O$TegkD{+B3nHMU zxfvXQ#u&q{Xc)_eyzN%g_!GN`i35yqbfRPQ4{1nTD{S7p0PyLhcVXK0KQi^a^f`QA z-J$3&Prjc5Q+xM+H+=fGwv2&@@bU-G{`(66{sw*~w9TjbR<8g6002ovPDHLkV1fjV B(ux28 literal 0 HcmV?d00001 diff --git a/libede/src/FileSystemBox.ec b/libede/src/FileSystemBox.ec index fda27fa..36e6b7b 100644 --- a/libede/src/FileSystemBox.ec +++ b/libede/src/FileSystemBox.ec @@ -1,4 +1,5 @@ public import "ecere" +import "FileSystemCache" #ifdef __WIN32__ static char * rootName = "Entire Computer"; @@ -11,7 +12,13 @@ private: define guiApp = (GuiApplication)((__thisModule).application); define selectionColor = guiApp.currentSkin.selectionColor; //Color { 10, 36, 106 }; -static char * fileIconNames[] = +void MessageBoxTodo(char * message) +{ + PrintLn("MessageBoxTodo(char * message) -- ", message); + MessageBox { type = ok, text = "MessageBoxTodo(char * message)", contents = message }.Modal(); +} + +static char * fileIconNames[] = { "<:ecere>mimeTypes/file.png", /* none */ @@ -50,6 +57,25 @@ static char * fileIconNames[] = "" }; +define countOfCompIconNames = 6; +static char * compIconNames[] = +{ +/* + "<:ede>a.png", + "<:ede>b.png", + "<:ede>c.png", + "<:ede>d.png", + "<:ede>not.png", +*/ + "<:ede>devices/media-optical.png", + "<:ede>devices/media-flash.png", + "<:ede>places/network-server.png", + "<:ede>places/folder-saved-search.png", + "<:ede>places/user-home.png", + "<:ede>emblem-not.png", + "" +}; + public enum _FileType { none, @@ -137,14 +163,20 @@ public enum _FileType } }; +public enum FileSystemBoxMode { directory, list }; + class FileSystemBoxBits { bool foldersOnly:1, filesOnly:1, details:1, pathColumn:1, treeBranches:1, previewPictures:1, navigateFolders:1, autoLoad:1; bool preview:1; + bool columnsCompareStyle:1; //bool header:1, freeSelect:1, fullRowSelect:1, multiSelect:1, autoScroll:1, alwaysHL : 1, moveRows:1, resizable:1; //bool moveFields:1, clearHeader:1, alwaysEdit:1, collapse:1, treeBranch:1, rootCollapse:1, heightSet:1; //bool sortable:1, noDragging:1, fillLastField:1, expandOnAdd:1; -}; + bool textFileLinesStyle:1; + + FileSystemBoxMode mode:2; +} public class FileSystemBox : Window // should we not derive from ListBox instead? // I say we should, but we can't right now... @@ -172,9 +204,14 @@ public: FileSystemNode root; FileSystemBoxSelection selection { }; + subclass(InterfaceFileSystemIterator) iteratorClass; + FileSystemCache cache; + virtual bool Window::NotifyNodeSelect(FileSystemBox box, FileSystemBoxSelection selection); //virtual bool Window::NotifyNodeNavigate(FileSystemBox box, FileSystemNode node); virtual bool Window::NotifyNodeOpen(FileSystemBox box, FileSystemBoxSelection selection); + virtual bool Window::NotifyNodeMenu(FileSystemBox box, Menu menu, FileSystemBoxSelection selection); + virtual bool Window::NotifyIteratorInit(FileSystemBox box, FileSystemIterator fileSystemIterator); property char * path { @@ -188,11 +225,27 @@ public: if(created) Load(); } - get { return path; } //isset { return path && path[0]; } } + property Array comparedPaths + { + set + { + delete comparedPaths; + if(value && value.count) + comparedPaths = value; + if(locationBox) + locationBox.path = value[0]; + if(created) + Load(); + } + get { return comparedPaths; } + //isset { return comparedPaths && comparedPaths.count; } + } + + property FileSystemBoxMode mode { set { bits.mode = value; } get { return bits.mode; } }; property bool foldersOnly { set { bits.foldersOnly = value; bits.filesOnly = !value; } get { return bits.foldersOnly; } }; property bool filesOnly { set { bits.filesOnly = value; bits.foldersOnly = !value; } get { return bits.filesOnly; } }; property bool previewPictures { set { bits.previewPictures = value; } get { return bits.previewPictures; } }; @@ -227,6 +280,8 @@ public: } get { return bits.preview; } }; + property bool columnsCompareStyle { set { bits.columnsCompareStyle = value; } get { return bits.columnsCompareStyle; } }; + property bool textFileLinesStyle { set { bits.textFileLinesStyle = value; } get { return bits.textFileLinesStyle; } }; property FileSystemNode node { @@ -360,26 +415,66 @@ public: Load(); } + bool MenuOpen(MenuItem selection, Modifiers mods) + { + OpenNode(); + } + + bool MenuReplaceListItemByContainingDir(MenuItem selection, Modifiers mods) + { + bool result = true; + //FileSystemBoxSelection selection = this.selection.Copy(); // TOFIX compiler bug -- FileSystemBox.c -- ../libede/src/FileSystemBox.ec:420:49: error: ‘selection’ redeclared as different kind of symbol + FileSystemBoxSelection sel = this.selection.Copy(); + FileSystemNode node = sel.node; + char newPath[MAX_LOCATION]; + StripLastDirectory(node.path, newPath); + //node.path = newPath; + //node. + //if(node && node.type.isFolder && bits.navigateFolders) + // property::path = node.path; + delete sel; + return result; + } + + bool MenuReplaceListItemByChild(MenuItem selection, Modifiers mods) + { + bool result = true; + //FileSystemBoxSelection selection = this.selection.Copy(); // TOFIX compiler bug -- FileSystemBox.c -- ../libede/src/FileSystemBox.ec:420:49: error: ‘selection’ redeclared as different kind of symbol + FileSystemBoxSelection sel = this.selection.Copy(); + FileSystemNode node = sel.node; + char newPath[MAX_LOCATION]; + StripLastDirectory(node.path, newPath); + //node.path = newPath; + //node. + //if(node && node.type.isFolder && bits.navigateFolders) + // property::path = node.path; + delete sel; + return result; + } + private: FileSystemBoxBits bits; char * path; char * extensions; + Array comparedPaths; BitmapResource fileIcons[_FileType]; + BitmapResource compIcons[countOfCompIconNames]; // todo: fix this limitation Bitmap bitmap; //BitmapArray bitmaps { growingFactor = 16 }; FileSystemBox() { - char wd[MAX_LOCATION]; - GetWorkingDir(wd, sizeof(wd)); - property::path = wd; - + path = CopyString(""); InitFileIcons(); + InitCompIcons(); // todo: these icons should not be initialize, they should be set + // or at least initalized when the comparison listing is requested + // and we know how many paths are being compared. list.AddField(nameField); bits.autoLoad = true; + //iteratorClass = class(FileSystemIterator); } ~FileSystemBox() @@ -403,8 +498,18 @@ private: } } - DataField nameField { header = "Name", dataType = "FileSystemNode", width = 240, userData = this, freeData = false }; - DataField pathField { header = "Location", dataType = /*"String"*/ "char *", width = 300, freeData = false }; + void InitCompIcons() + { + _FileType c; + for(c = 0; c < countOfCompIconNames; c++) + { + compIcons[c] = BitmapResource { compIconNames[c], alphaBlend = true }; + AddResource(compIcons[c]); + } + } + + DataField nameField { header = "Name", dataType = "FileSystemNode", width = 240, userData = this, freeData = false/*, editable = true*/; }; + DataField pathField { header = "Location", dataType = /*"String"*/ "char *", width = 300, freeData = true }; DataField typeField { header = "Type", dataType = /*"String"*/ "char *", width = 40, freeData = false }; DataField sizeField { header = "Size", dataType = "FileSize", width = 96, alignment = right, freeData = false }; DataField modifiedField { header = "Modified", dataType = "SecSince1970", width = 96, alignment = right, freeData = false }; @@ -412,7 +517,15 @@ private: bool OnPostCreate() { if(bits.autoLoad) + { + if(!path) + { + char wd[MAX_LOCATION]; + GetWorkingDir(wd, sizeof(wd)); + property::path = wd; + } Load(); + } return true; } @@ -480,19 +593,35 @@ private: FileSystemNode node = (FileSystemNode)row.tag; if(node) { - char * text; - PopupMenu popup; Menu menu { }; - text = PrintString("Open ", node.path); + if(NotifyNodeMenu) + NotifyNodeMenu(master, this, menu, selection); + else + { + char * text; + + text = PrintString("Open ", node.name); + MenuItem { menu, text, o, NotifySelect = MenuOpen, disabled = false }; //delete text; - MenuItem { menu, text, o, NotifySelect = MenuOpen, disabled = false }; - MenuItem { menu, "Cut\tCtrl+X", t, NotifySelect = null, disabled = false }; - MenuItem { menu, "Copy\tCtrl+C", c, NotifySelect = null, disabled = false }; - MenuItem { menu, "Paste\tCtrl+V", p, NotifySelect = null, disabled = false /*!clipboard*/ }; - MenuItem { menu, "Delete\tDel", d, NotifySelect = null, disabled = false }; - //MenuDivider { menu }; + if(node.bits.isListItem/* && TODO: unless node is at root location*/) + { + MenuDivider { menu }; + MenuItem { menu, "Replace by Parent\tCtrl+R", r, NotifySelect = MenuReplaceListItemByContainingDir, disabled = false }; + } + else if(bits.mode == list) + { + MenuDivider { menu }; + MenuItem { menu, "Replace List Item\tCtrl+R", r, NotifySelect = MenuReplaceListItemByChild, disabled = false }; + } + MenuDivider { menu }; + MenuItem { menu, "Cut\tCtrl+X", t, NotifySelect = null, disabled = false }; + MenuItem { menu, "Copy\tCtrl+C", c, NotifySelect = null, disabled = false }; + MenuItem { menu, "Paste\tCtrl+V", p, NotifySelect = null, disabled = false /*!clipboard*/ }; + MenuItem { menu, "Delete\tDel", d, NotifySelect = null, disabled = false }; + //MenuDivider { menu }; + } popup = PopupMenu { @@ -602,6 +731,15 @@ private: bool result; if((SmartKey)key == enter) result = OpenNode(); + #if 0 + else if((SmartKey)key == f2) + result = RenameNode(); + #endif + else if((SmartKey)key == f2) + { + FileSystemNode node = selection.node; + node.row.Edit(nameField); + } else result = true; return true; @@ -658,21 +796,44 @@ private: } } - bool MenuOpen(MenuItem selection, Modifiers mods) + bool OpenNode() { - OpenNode(); + bool result = false; + FileSystemBoxSelection sel = this.selection.Copy(); + //FileSystemNode node = selection.node; + for(node : sel.nodes) + { + sel.node = node; + if(node && node.type.isFolder && bits.navigateFolders) + property::path = node.path; + if(NotifyNodeOpen(this.master, this, sel) && !result) + result = true; + } + delete sel; + return result; } - bool OpenNode() + #if 0 + bool RenameNode() { bool result; - FileSystemBoxSelection selection = this.selection.Copy(); + //FileSystemBoxSelection selection = this.selection.Copy(); FileSystemNode node = selection.node; - if(node && node.type.isFolder && bits.navigateFolders) - property::path = node.path; - result = NotifyNodeOpen(this.master, this, selection); + //if(node && node.type.isFolder && bits.navigateFolders) + // property::path = node.path; + // ------------------------------------------- working here --------------------------- + //node.row.Edit(); + /*result = NotifyNodeRename(this.master, this, node); + if(result) + { + if(RenameFile(oldn, newn)) + { + node.name = newn; + } + }*/ return result; } + #endif // Edit Menu Menu editMenu { menu, "Edit", e }; @@ -756,31 +917,50 @@ private: list.AddField(sizeField); } }*/ - if(bits.treeBranches) - LoadTree(); - else - LoadList(); - } - - void LoadList() - { - FileListing listing { path, extensions = extensions }; - list.Clear(); - while(listing.Find()) + if(comparedPaths && !bits.treeBranches) + LoadComparedList(); + else { - if((!bits.foldersOnly && !bits.filesOnly) || - (bits.foldersOnly && listing.stats.attribs.isDirectory) || - (bits.filesOnly && listing.stats.attribs.isFile)) + FileAttribs pathAttribs = FileExists(path); + if(pathAttribs) { - FileSystemNode node = MakeFileSystemNode(listing.stats, listing.name, listing.path, false, bits.previewPictures, displaySystem); - AddNode(node); + if(pathAttribs.isDirectory) + { + if(bits.treeBranches) + LoadTreeDirectory(); + else + { + if(iteratorClass) + LoadListIterator(); + else + LoadListDirectory(); + } + } + else if(pathAttribs.isFile) // we assume this is a file list + { + File f = FileOpen(path, read); + if(f) + { + if(bits.treeBranches) + LoadTreeFileList(f); + else + LoadListFileList(f); + delete f; + } + else + MessageBoxTodo($"unable to open file list"); + } + else + MessageBoxTodo($"path is not a directory nor is it a file"); } + else + MessageBoxTodo($"path does not exist"); } list.Sort(nameField, 1); } - void LoadTree() + void LoadTreeDirectory() { bool isRoot = !strcmp(path, "/"); char name[MAX_LOCATION]; @@ -798,14 +978,14 @@ private: else strcpy(path, startPath);*/ - list.Clear(); + bits.mode = directory; delete root; - #ifdef __WIN32__ +#ifdef __WIN32__ if(isRoot) { root = FileSystemNode { bits.loaded = true, bits.childrenLoaded = true }; - AddTreeNode(root, true, false, null); + AddTreeNode(root, true, false, false, null); while(listing.Find()) { int len = strlen(listing.name); @@ -825,24 +1005,37 @@ private: info[0] = 0; } - parent = MakeFileSystemNode(listing.stats, name, listing.path, false, bits.previewPictures, displaySystem); + parent = + MakeFileSystemNode( + listing.stats, + name, + listing.path, + false, bits.previewPictures, false, + displaySystem); if(info[0]) parent.info = info; //CopyString(info); parent.bits.loaded = true; - AddTreeNode(parent, !listing.stats.attribs.isDirectory, listing.stats.attribs.isDirectory, root); + AddTreeNode( + parent, + !listing.stats.attribs.isDirectory, + false, + listing.stats.attribs.isDirectory, + root); if(!listing.stats.attribs.isDirectory) parent.bits.childrenLoaded = true; } node = FileSystemNode { name = msNetwork, type = network }; - AddTreeNode(node, false, true, null); + AddTreeNode(node, false, false, true, null); node.row.collapsed = true; } else - #endif +#endif { - root = MakeFileSystemNode(FileStats { attribs = FileExists(path)}, name, path, false, bits.previewPictures, displaySystem); - AddTreeNode(root, false, true, null); + FileStats stats; + FileGetStats(path, stats); + root = MakeFileSystemNode(stats, name, path, false, bits.previewPictures, false, displaySystem); + AddTreeNode(root, false, false, true, null); LoadTreeNode(root); } @@ -856,6 +1049,83 @@ private: list.SelectRow(root.row); } + void LoadListDirectory() + { + FileListing listing { path, extensions = extensions }; + + bits.mode = directory; + while(listing.Find()) + ProcessListItem(listing.name, listing.path, listing.stats, false); + } + + void LoadListFileList(File f) + { + char line[65536]; + bits.mode = list; + while(f.GetLine(line, 65536)) + { + FileStats stats {}; + char name[MAX_FILENAME]; + FileGetStats(line, stats); + GetLastDirectory(line, name); + ProcessListItem(name, line, stats, true); + } + } + + void LoadTreeFileList(File f) + { + char line[65536]; + bits.mode = list; + while(f.GetLine(line, 65536)) + { + FileStats stats {}; + char name[MAX_FILENAME]; + FileSystemNode node; + FileGetStats(line, stats); + GetLastDirectory(line, name); + node = ProcessTreeItem(name, line, stats, node); + } + } + + void LoadListIterator() + { + FileSystemIterator iterator = eInstance_New(iteratorClass); + if(iterator) + { + iterator.owner = this; + iterator.OnObject = ListIterator_OnObject; + //iterator.OnLeavingDirectory = ListIterator_OnLeavingDirectory; + NotifyIteratorInit(master, this, iterator); + iterator.Iterate(path, true); + delete iterator; + } + } + + bool ListIterator_OnObject(char * name, char * path, FileStats stats, bool isRootObject) + { + ProcessListItem(name, path, stats, false); + return false; + } + + //void ListIterator_OnLeavingDirectory(char * path) { } + + void ProcessListItem(char * name, char * path, FileStats stats, bool isListItem) + { + if((!bits.foldersOnly && !bits.filesOnly) || (bits.foldersOnly && stats.attribs.isDirectory) || (bits.filesOnly && stats.attribs.isFile)) + { + FileSystemNode node = MakeFileSystemNode(stats, name, path, false, bits.previewPictures, isListItem, displaySystem); + AddNode(node); + } + } + + FileSystemNode ProcessTreeItem(char * name, char * path, FileStats stats, FileSystemNode parent) + { + FileSystemNode node = MakeFileSystemNode(stats, name, path, false, bits.previewPictures, true, displaySystem); + AddTreeNode(parent, false, false, true, null); + //LoadTreeNode(node); + return node; + } + void LoadTreeNode(FileSystemNode node) { if(!node.bits.loaded) @@ -869,14 +1139,17 @@ private: while(listing.Find()) { + char * test; + FileSystemNode child = null; if(!listing.stats.attribs.isRemovable && ((!bits.foldersOnly && !bits.filesOnly) || (bits.foldersOnly && listing.stats.attribs.isDirectory) || (bits.filesOnly && listing.stats.attribs.isFile))) - { - FileSystemNode child = MakeFileSystemNode(listing.stats, listing.name, listing.path, false, bits.previewPictures, displaySystem); - AddTreeNode(child, true, false, node); + child = MakeAndAddToTreeFileSystemNodeFromFileListing(listing, node); + if(child) NodeChildLoad(child, node); - } + test = child.name; + if(!test) + PrintLn("error"); } } node.bits.childrenLoaded = true; @@ -905,19 +1178,27 @@ private: { char path[MAX_LOCATION]; parent.GetPath(path); + if(bits.textFileLinesStyle && FileExists(path).isFile) + { + PrintLn("Test"); + } + else { bool added = false; FileListing listing { path, extensions = extensions }; while(listing.Find()) { + char * test; + FileSystemNode child = null; if((!bits.foldersOnly && !bits.filesOnly) || (bits.foldersOnly && listing.stats.attribs.isDirectory) || (bits.filesOnly && listing.stats.attribs.isFile)) - { - FileSystemNode child = MakeFileSystemNode(listing.stats, listing.name, listing.path, false, bits.previewPictures, displaySystem); - AddTreeNode(child, listing.stats.attribs.isFile, !listing.stats.attribs.isFile, parent); + child = MakeAndAddToTreeFileSystemNodeFromFileListing(listing, parent); + if(child) added = true; - } + test = child.name; + if(!test) + PrintLn("error"); } if(!added) added = true; @@ -925,6 +1206,249 @@ private: parent.bits.childrenLoaded = true; } + void LoadComparedList() + { + int c, cmp/*, smallest*/, icon;//, equalCount; + int count = comparedPaths ? comparedPaths.count : 0; + //bool allDone = false; + bool not; + FileStats stats; + char path[MAX_LOCATION]; + //Array states { }; + //Array listings { }; + //Array equals { }; + //Array> mapNodes { }; + + //Array> lists { }; + //Map equals{ }; + + + MapNode> na; + //MapNode nb; + Map> names { }; + //Map> names { }; + //Map names { }; // does not seem to be working + //Map names { }; + { + for(c = 0; c < comparedPaths.count; c++) + { + FileListing listing { comparedPaths[c], extensions = extensions }; + while(listing.Find()) + { + /*Map*/Array m = names[listing.name]; + if(!m) + m = { }; + names[listing.name] = m; + /*/m[c] = */m.Add(c); + } + } + /* // compiles and should work but better solution? + for(c = 0; c < comparedPaths.count; c++) + { + FileListing listing { comparedPaths[c], extensions = extensions }; + while(listing.Find()) + { + Array a = names[listing.name]; + if(!a) + a = { }; + names[listing.name] = a; + a[c] = true; + } + } + */ + /* // does not seem to be working + for(c = 0; c < comparedPaths.count; c++) + { + FileListing listing { comparedPaths[c], extensions = extensions }; + while(listing.Find()) + { + names[listing.name][c] = true; + } + } + */ + /* + if(comparedPaths.count > 0) + { + FileListing listing { comparedPaths[0], extensions = extensions }; + while(listing.Find()) + { + // should be able to just do names[listing.name]._0 = true; + BoolArrayInt bai = names[listing.name]; + bai._0 = true; + names[listing.name] = bai; + } + } + if(comparedPaths.count > 1) + { + FileListing listing { comparedPaths[1], extensions = extensions }; + while(listing.Find()) + { + // should be able to just do names[listing.name]._1 = true; + BoolArrayInt bai = names[listing.name]; + bai._1 = true; + names[listing.name] = bai; + } + } + */ + // and so on.... + } + + /* + for(dirPath : comparedPaths) + { + char * p = dirPath; + if(FileExists(dirPath).isDirectory) + { + FileListing listing { dirPath, extensions = extensions }; + //MapNode mn; + Map list { }; + //states.Add(listing.Find() == true ? matching : endOfListing); + while(listing.Find()) + list[listing.name] = 0; + //for(mn = ; mn; mn = mn.next) + //mn = list.root.minimum; + mapNodes.Add(/-*mn*-/list.root.minimum); + lists.Add(list); + //PrintLn(dirPath, " -- .Find() -- ", states[states.count-1] == matching ? listing.name : "endOfListing*"); + //listings.Add(listing); + + { + MapNode mn; + PrintLn("------------- DIR LISTING FOR ", dirPath); + for(mn = list.root.minimum; mn; mn = mn.next) + { + PrintLn(mn.key); + } + } + } + } + */ + + for(na = names.root.minimum; na; na = na.next) + { + /*Map equals = na.value; + //MapNode nb; + /* + while(!allDone) + { + smallest = 0; + equals.Add(0); + for(c = 1; c < count; c++) + { + //if(states[c] == endOfListing) continue; + if(!mapNodes[c]) continue; + // todo: use better comparison method + // it should compare file type (dir/file) before + // comparing file name. + // should also provide alternative methods + // of comparison including ones that consider + // date changes as differences of some kind. + // pethaps a OnCompare(a, b) to allow implementation + // of custom methods of comparison. + // note: this (or these) method(s) depend on files + // being listed in sorted order by FileListing. + // different comparison methods should have + // appropriatly different sorting in FileListing. + // + //cmp = strcmp(listings[smallest].name, listings[c].name); + cmp = fstrcmp(mapNodes[smallest].key, mapNodes[c].key); + PrintLn("COMPARING - ", mapNodes[smallest].key, " and ", mapNodes[c].key); + if(cmp == 0) + equals.Add(c); + //equals[c] = true; + else if(cmp > 0) + { + smallest = c; + equals.size = 0; + equals.Add(c); + } + } + + */ + if(equals.count == count) // all are equal, no diff icon + { + icon = 0; + not = false; + } + else if(equals.count == count-1) // all are equal but one, not-sign icon for singled out missing + { + int i; + /* + for(nb = equals.root.minimum, i = 0; nb; nb = nb.next, i++) + { + if(i != nb.key) + */ + for(i = 0; i < equals.count; i++) + { + if(i != equals[i]) + { + icon = i+1; + break; + } + } + //if(!nb) + if(i == equals.count) + icon = count; + not = true; + } + else if(equals.count == 1) // only one is present, all others missing, present-sign for singled out present + { + //icon = equals.root.minimum.key+1; + icon = equals[0]+1; + not = false; + } + else // mixed + { + icon = 0; // todo + not = true; + } +#if 0 + // or + if(equals.count == count) // all are equal, no diff icon + ; + else if(count/2 - equals.count < 0) // more than half are equal, use not-sign icons for all missing + ; + else // less than half are equal, use present-sign icons for all present + ; +#endif + + /*if((!bits.foldersOnly && !bits.filesOnly) || + (bits.foldersOnly && listings[smallest].stats.attribs.isDirectory) || + (bits.filesOnly && listings[smallest].stats.attribs.isFile))*/ + strcpy(path, comparedPaths[/*smallest*/equals[0]]); + PathCat(path, /*mapNodes[smallest].key*/na.key); + FileGetStats(path, stats); + if((!bits.foldersOnly && !bits.filesOnly) || + (bits.foldersOnly && stats.attribs.isDirectory) || + (bits.filesOnly && stats.attribs.isFile)) + { + FileSystemNode node = + MakeComparedFileSystemNode( + stats, + /*mapNodes[smallest].key*/na.key, + path, + false, bits.previewPictures, + icon, not, equals, + displaySystem); + AddNode(node); + } + /* + for(equal : equals) + { + mapNodes[equal] = mapNodes[equal].next; + //states[equal] = listings[equal].Find() == true ? matching : endOfListing; + //PrintLn(comparedPaths[equal], " -- .Find() -- ", states[equal] == matching ? listings[equal].name : "endOfListing*"); + } + equals.size = 0; + //for(c = 0; c < count && states[c] == endOfListing; c++); + for(c = 0; c < count && !mapNodes[c]; c++); + if(c == count) + allDone = true; + */ + } + list.Sort(nameField, 1); + } + void AddNode(FileSystemNode node) { DataRow row = list.AddRow(); @@ -933,7 +1457,11 @@ private: incref node; row.SetData(nameField, node); if(bits.pathColumn) - row.SetData(pathField, node.path); + { + char path[MAX_LOCATION]; + StripLastDirectory(node.path, path); + row.SetData(pathField, CopyString(path)); + } if(bits.details) { if(node.type.isFile) @@ -945,7 +1473,46 @@ private: } } - void AddTreeNode(FileSystemNode node, bool loaded, bool addLoader, FileSystemNode addTo) + FileSystemNode MakeAndAddToTreeFileSystemNodeFromFileListing(FileListing listing, FileSystemNode parent) + { + FileSystemNode result = null; + /*if((!bits.foldersOnly && !bits.filesOnly) || + (bits.foldersOnly && listing.stats.attribs.isDirectory) || + (bits.filesOnly && listing.stats.attribs.isFile))*/ + /*if(!listing.stats.attribs.isRemovable && ((!bits.foldersOnly && !bits.filesOnly) || + (bits.foldersOnly && listing.stats.attribs.isDirectory) || + (bits.filesOnly && listing.stats.attribs.isFile)))*/ + { + bool textFileLinesStyle = false; + char * test = listing.name; + if(!test) + PrintLn("error"); + result = MakeFileSystemNode(listing.stats, listing.name, listing.path, false, bits.previewPictures, false, displaySystem); + test = result.name; + if(!test) + PrintLn("error"); + if(bits.textFileLinesStyle) + { + char ext[MAX_LOCATION]; + GetExtension(listing.name, ext); + if(!strcmpi(ext, "txt") || !strcmpi(ext, "text")) + textFileLinesStyle = true; + } + //AddTreeNode(result, true, false, textFileLinesStyle, parent); + AddTreeNode(result, !textFileLinesStyle && listing.stats.attribs.isFile, false, !listing.stats.attribs.isFile || textFileLinesStyle, parent); + test = result.name; + if(!test) + PrintLn("error"); + } + return result; + } + + void AddTreeNode( + FileSystemNode node, + bool loaded, + bool childrenLoaded, + bool addLoader, + FileSystemNode addTo) { DataRow row = (addTo && addTo.row) ? addTo.row.AddRow() : list.AddRow(); if(addTo) @@ -958,7 +1525,11 @@ private: node.row = row; row.SetData(null, node); if(bits.pathColumn) - row.SetData(pathField, node.path); + { + char path[MAX_LOCATION]; + StripLastDirectory(node.path, path); + row.SetData(pathField, CopyString(path)); + } if(bits.details) { if(node.type.isFile) @@ -970,11 +1541,12 @@ private: } node.bits.loaded = loaded; + node.bits.childrenLoaded = childrenLoaded; if(addLoader) //AddTreeNode(FileSystemNode { }, false, false, node); // why would this create a compile error? - AddTreeNode(FileSystemNode { type = none }, false, false, node); + AddTreeNode(FileSystemNode { type = none, name = "Loader" }, false, false, false, node); - if(node.indent > 0) + if(node.indent > 0 || bits.mode == list) row.collapsed = true; else if(node.type == folder) node.type = folderOpen; @@ -995,6 +1567,8 @@ private: } } +enum ComparisonState { endOfListing, matching }; + /* #if 0 class ExplorerView : FileSystemBox @@ -1673,7 +2247,7 @@ public: #else root.name = "/"; #endif - AddTreeNode(root, true, false, null, tree); + AddTreeNode(root, true, false, false, null, tree); // How can this make sense for linux? #ifdef __WIN32__ @@ -1700,13 +2274,13 @@ public: if(info[0]) parent.info = CopyString(info); parent.loaded = true; - AddTreeNode(parent, !listing.stats.attribs.isDirectory, listing.stats.attribs.isDirectory, root, tree); + AddTreeNode(parent, !listing.stats.attribs.isDirectory, false, listing.stats.attribs.isDirectory, root, tree); if(!listing.stats.attribs.isDirectory) parent.childrenLoaded = true; } #endif node = FileSystemNode { name = msNetwork, type = network }; - AddTreeNode(node, false, true, null, tree); + AddTreeNode(node, false, false, true, null, tree); node.row.collapsed = true; tree.Sort(nameField, 1); tree.SelectRow(root.row); @@ -2079,7 +2653,7 @@ private: class FileSystemNodeBits { - bool loaded:1, childrenLoaded:1, displayPath:1; + bool loaded:1, childrenLoaded:1, isListItem:1; }; public class FileSystemNode @@ -2110,6 +2684,8 @@ public: int indent; + property bool isListItem { set { bits.isListItem = value; } get { return bits.isListItem; } }; + property char * path { set { delete path; if(value && value[0]) path = CopyString(value); } @@ -2145,6 +2721,10 @@ public: Bitmap bitmap; + int cmpIcon; + bool cmpNot; + Array exists; // would use (see) BoolArrayInt to pack this into an int if could be accessed as an array + void GetPath(String outputPath) { if(path) @@ -2194,7 +2774,7 @@ public: FileSystemNode copy { }; copy.name = child.name; //CopyString(child.name); copy.type = child.type; - fsb.AddTreeNode(copy, child.bits.loaded, false, addTo); + fsb.AddTreeNode(copy, child.bits.loaded, false, false, addTo); if(forceExpanded) copy.row.collapsed = false; if(recursive) @@ -2248,25 +2828,46 @@ public: int len; int w, h; //int textOffset; - char string[MAX_FILENAME]; + char * alt; + char text[MAX_LOCATION]; + bool comp; Bitmap icon; + Bitmap diffIcon; + Bitmap notIcon; if(!this) return; + comp = fsb.comparedPaths && fsb.comparedPaths.count > 1; icon = fsb.fileIcons[type].bitmap; + alt = bits.isListItem ? path : name; + if(comp && !fsb.bits.columnsCompareStyle && cmpIcon) + { + /* + diffIcon = Bitmap { }; + diffIcon.AllocateDD( + surface.display.displaySystem, + fsb.compIcons[cmpIcon].bitmap.width, + fsb.compIcons[cmpIcon].bitmap.height); + if(fsb.compIcons[cmpIcon].bitmap) + diffIcon.Copy(fsb.compIcons[cmpIcon].bitmap); + */ + diffIcon = fsb.compIcons[cmpIcon-1].bitmap; + notIcon = fsb.compIcons[countOfCompIconNames-1].bitmap; + } //xStart = indent * indent + x + (icon ? (icon.width + 5) : 0); - xStart = x + (icon ? (icon.width + 5) : 0); + xStart = x + (icon ? (icon.width + 5) : 0) + (comp ? 18*(fsb.bits.columnsCompareStyle ? fsb.comparedPaths.count : 1) : 0); - if(!name) + if(!alt) return; if(info) - sprintf(string, "%s [%s]", label ? label : name, info); + sprintf(text, "%s [%s]", label ? label : alt, info); else - strcpy(string, label ? label : name); - len = strlen(string); + strcpy(text, label ? label : alt); //"%d-%d/%s", stats.inode, stats.nlink + //sprintf(text, "%d-%d/%s", stats.inode, stats.nlink, label ? label : alt); + len = strlen(text); if(!icon) { @@ -2279,7 +2880,7 @@ public: surface.SetForeground(displayFlags.selected ? fsb.selectionText : fsb.foreground); surface.TextOpacity(false); - surface.TextExtent(string, len, &w, &h); + surface.TextExtent(text, len, &w, &h); h = Max(h, 16); // Draw the current row stipple @@ -2288,8 +2889,8 @@ public: //surface.Area(xStart + w - 1, y, xStart + w + 1, y + h - 1); surface.Area(xStart - 3, y, xStart + w + 1, y + h - 1); - //surface.WriteTextDots(alignment, x + textOffset, y + 2, width - textOffset, name, strlen(name)); - surface.WriteTextDots(alignment, xStart, y + 2, width, string, len); + //surface.WriteTextDots(alignment, x + textOffset, y + 2, width - textOffset, alt, strlen(alt)); + surface.WriteTextDots(alignment, xStart, y + 2, width, text, len); if(!guiApp.textMode) { @@ -2311,6 +2912,80 @@ public: surface.LineStipple(0); } + if(comp) + { + if(!fsb.bits.columnsCompareStyle && diffIcon) + { + w = diffIcon.width; + h = diffIcon.height; + /*if(cmpNot && notIcon) + { + Surface s = diffIcon.GetSurface(0,0, {w,h}); + s.SetForeground(white); + s.Blit(notIcon, x,y, 0,0, w,h); + delete s; + }*/ + surface.SetForeground(white); + surface.Blit(diffIcon, x,y, 0,0, w,h); + if(cmpNot && notIcon) + surface.Blit(notIcon, x,y, 0,0, w,h); + x+=18; + //delete diffIcon; + } + else if(fsb.bits.columnsCompareStyle && exists && exists.count) + { + int c, d; + for(c = d = 0; c < fsb.comparedPaths.count; c++) + { + if(d == exists.count || exists[d] != c) + x+=18; + else + { + diffIcon = fsb.compIcons[c].bitmap; + if(diffIcon) + { + w = diffIcon.width; + h = diffIcon.height; + surface.SetForeground(white); + surface.Blit(diffIcon, x,y, 0,0, w,h); + } + x+=18; + d++; + } + } + /* + for(c = d = 0; c < exists.count; c++) + { + if(exists[c] != d) + { + d = exists[c]+1; + x+=18*(exists[c]-d); + } + else + { + diffIcon = fsb.compIcons[exists[c]].bitmap; + if(diffIcon) + { + w = diffIcon.width; + h = diffIcon.height; + surface.SetForeground(white); + surface.Blit(diffIcon, x,y, 0,0, w,h); + } + d++; + x+=18; + } + } + if(exists.count < fsb.comparedPaths.count && exists[exists.count-1] != d) + { + x+=18*(exists[exists.count-1]-d); + } + */ + } + else if(fsb.bits.columnsCompareStyle) + { + x+=18*fsb.comparedPaths.count; + } + } if(icon) { w = icon.width; @@ -2340,17 +3015,70 @@ public: //surface.alphaWrite = blend; surface.SetForeground(white); //surface.Blit(icon, x + indent * indentSize, y,0,0, icon.width, icon.height); - surface.Blit(icon, x,y,0,0, icon.width, icon.height); + surface.Blit(icon, x,y, 0,0, w,h); } } } + Window OnEdit(DataBox dataBox, DataBox obsolete, int x, int y, int w, int h, void * userData) + { + EditBox editBox + { + dataBox, anchor = { 0, 0, 0, 0 }; + borderStyle = none; + //borderStyle = contour; + opacity = 1.0f; + //background = white; + //autoSize = true; + contents = name; + }; + //dataBox.borderStyle = none; + dataBox.borderStyle = contour; + dataBox.background = white; + //dataBox.opacity = 0.0f; + editBox.Create(); + return editBox; + } + + bool OnSaveEdit(EditBox editBox, void * object) + { + bool changed = false; + if(editBox.modifiedDocument) + { +#if 0 + // how the heck did this work for PathBox? :S + //String::OnFree(); + //changed = _class._vTbl[__ecereVMethodID_class_OnGetDataFromString](_class, &this, editBox.contents); + PrintLn(name); + //if(strcmp(editBox.contents, this.name)) + ; + /*{ + //changed = NotifyNodeRename(this.master, this, node); + changed = true; + if(changed && RenameFile(name, editBox.contents)) + { + name = editBox.contents; + } + else + { + changed = false; + } + }*/ +#endif + } + return changed; + } + int OnCompare(FileSystemNode b) { int result; FileSystemNode a = this; if(a.type == b.type || (a.type < folder && b.type < folder) || (a.type >= drive)) + { + if(!a.name || !b.name) + PrintLn("error: FileSystemNode::OnCompare -- null-named node"); result = strcmpi(a.name, b.name); + } else { if(a.type == folder && b.type < folder) result = -1; @@ -2360,16 +3088,32 @@ public: return result; } - /*int OnCompare(FileSystemNode b) +#if 0 + //int OnCompare(FileSystemNode b) + //{ + //int result; + //FileSystemNode a = this; + //if(a.parent < b.parent) result = -1; + //else if(a.parent > b.parent) result = 1; + //else + //result = fstrcmp(a.name, b.name); + //return result; + //} +#endif + + bool OnGetDataFromString(char * string) { - int result; - FileSystemNode a = this; - if(a.parent < b.parent) result = -1; - else if(a.parent > b.parent) result = 1; - else - result = fstrcmp(a.name, b.name); - return result; - }*/ +#if 0 + if(string && *string) + { + int len = strlen(string) + 1; + name = new char[len]; + CopyBytes(name, string, len); + return true; + } +#endif + return false; + } char * OnGetString(char * tempString, FileSystemToolWindow fileSysToolWnd, bool * needClass) { @@ -2413,6 +3157,7 @@ FileSystemNode MakeFileSystemNode( const char * path, const bool pathAddName, const bool previewPicture, + const bool isListItem, const DisplaySystem displaySystem) { int len = strlen(name); @@ -2494,5 +3239,67 @@ FileSystemNode MakeFileSystemNode( node.bitmap.Load(path, null, displaySystem); } + if(isListItem) + node.bits.isListItem = true; + return node; } + +FileSystemNode MakeComparedFileSystemNode( + const FileStats stats, + const char * name, + const char * path, + const bool pathAddName, + const bool previewPicture, + const int cmpIcon, + const bool cmpNot, + const Array exists, + const DisplaySystem displaySystem) +{ + FileSystemNode node = MakeFileSystemNode(stats, name, path, pathAddName, previewPicture, false, displaySystem); + if(node) + { + node.cmpIcon = cmpIcon; + node.cmpNot = cmpNot; + node.exists = exists; + } + return node; +} + +#if 0 // could we do this? +class BoolArrayInt : int +{ + // packing 32 bools in one int exposing them as an array + bool [32]:1; // the :1 specifies the size of each element + // byte [4]:8; // packing 4 bytes in an int exposing them as an arrat +} +// allowing you to access each 32 bits with the following notation: +static void Dummy() +{ + int c; + BoolArrayInt a; + a[0] = true; + a[31] = false; + for(c = 0; c < 32; c++) + a[c] = SomFunction(...); +} +#endif +class BoolArrayInt : int +{ + bool _0:1; + bool _1:1; + bool _2:1; + bool _3:1; + bool _4:1; + bool _5:1; + bool _6:1; + bool _7:1; + bool _8:1; + bool _9:1; + bool _10:1; + bool _11:1; + bool _12:1; + bool _13:1; + bool _14:1; + bool _15:1; +} diff --git a/libede/src/FileSystemCache.ec b/libede/src/FileSystemCache.ec new file mode 100644 index 0000000..03920bd --- /dev/null +++ b/libede/src/FileSystemCache.ec @@ -0,0 +1,475 @@ +public import "ecere" + +public import "FileSystemIterator" + +public class FileSystemCacheIterator : InterfaceFileSystemIterator +{ +public: + FileSystemCache cache; + + bool Iterate(char * startPath, bool followLinks) + { + bool result = true; + char * path; + FSCacheObject o; + if(cache && cache.objects.count) + { + o = cache.FetchObject(startPath); + if(o) + { + bool listDirEntries; + FileSystemCacheIteratorStackFrame frame = null; + Array stack { }; + if(iterateStartPath) + { + path = o.GetPath(); + listDirEntries = OnObject(owner, o.name, path, o.stats, true); + if(o.firstChild) + { + if(listDirEntries) + { + OnEnteringDirectory(owner, path); + stack.Add((frame = { path, o.firstChild })); + path = null; + } + else + result = false; + } + delete path; + } + // else { /* TODO: frame is not initialized!! */ } + + while(frame) + { + o = frame.o; + if(o) + { + frame.o = o.nextSibling; + path = o.GetPath(); + listDirEntries = OnObject(owner, o.name, path, o.stats, !iterateStartPath && stack.count == 1); + if(o.firstChild) + { + if(listDirEntries) + { + OnEnteringDirectory(owner, path); + stack.Add((frame = { path, o.firstChild })); + path = null; + } + else + result = false; + } + delete path; + } + else + { + if(stack.count > (iterateStartPath ? 0 : 1)) + OnLeavingDirectory(owner, frame.path); + delete frame; + stack.lastIterator.Remove(); + frame = stack.count == 0 ? null : stack.lastIterator.data; + } + } + if(stack.count != 0) + PrintLn("dddddddd"); + delete stack; + } + } + return result; + } +} + +class FileSystemCacheIteratorStackFrame : struct +{ +public: + String path; + FSCacheObject o; + +private: + ~FileSystemCacheIteratorStackFrame() + { + delete path; + } +}; + +class FileSystemCacheBits +{ + bool indexInodes:1; +} + +public class DummyFileSystemCacheWindow : Window +{ +public: + FileSystemCache cache { }; +} + +public class FileSystemCache +{ +public: + Map roots { }; + Array objects { }; + Array normalParentStack; + Map deviceCaches { }; + + property bool indexInodes { set { bits.indexInodes = value; } get { return bits.indexInodes; } }; + + void/*FileSystemCache*/ ::Cache(char * path, bool indexInodes, DummyFileSystemCacheWindow dummyWindow) + { + FileSystemCache cache = dummyWindow.cache; + // TOIMP: for now we will assume the cache includes files from a single domain (partition/share) + // TOIMP: would like to use full blown file iterator driver system to support other types of file system, archives, etc + FileAttribs pathAttribs = FileExists(path); + if(pathAttribs) + { + cache = dummyWindow.cache;// = { }; + cache.indexInodes = indexInodes; + cache.normalParentStack = { }; + //cache.domainParentStack = { }; + if(pathAttribs.isDirectory) + { + FileSystemIterator fsi + { + owner = dummyWindow; //owner = (void *)this; + iterateStartPath = true; + + // COMPILER TOFIX: this will not compile (error: method class must be derived from class) -- bool Whatever/*FileSystemCache*/::OnFolder(...) + bool /*FileSystemCache*/DummyFileSystemCacheWindow::OnObject(char * name, char * path, FileStats stats, bool isRootObject) + { + bool result = true; + FileSystemCache cache = this.cache; + uint dev = stats.dev; + uint inode = stats.inode; + char * p; + FSCacheObject parent = isRootObject ? null : cache.normalParentStack.lastIterator.data; + FSCacheObject o { parent, name = CopyString(isRootObject ? path : name), stats = stats }; + FileStats s; + if(isRootObject) + { + // TODO see if we can find a parent for it + // see if we already have a FSCacheObject for it, if so, update + // distant parents -- when there are gaps.. maybe the parent's parent is present but not the parent + // keep a list of those and see if they can be pluged in after a Cache run + cache.roots[o] = FSCacheRoot { cache.objects.count, GetPathDirNamesArray(path) }; + } + else + { + if(!parent.firstChild) + parent.firstChild = parent.lastChild = o; + else + { + parent.lastChild.nextSibling = o; + o.prevSibling = parent.lastChild; + parent.lastChild = o; + } + } + cache.objects.Add(o); +#if _DEBUG + if(cache.objects.count % 1000 == 0) + PrintLn(path, " ----- ", cache.objects.count / 1000, " --------- ", dev); + FileGetStatsLink(path, s); + if(s.inode != inode) + { + PrintLn(s.inode); + PrintLn(inode); + PrintLn("crap"); + } + p = o.GetPath(); + if(strcmp(p, path)) + { + int c; + PrintLn("damn"); + PrintLn(p); + for(c = 0; c < cache.normalParentStack.count; c++) + { + delete p; + p = cache.normalParentStack[c].GetPath(); + PrintLn(p); + } + PrintLn(path); + PrintLn("bad"); + } + delete p; +#endif + if(dev && inode && cache.bits.indexInodes) + { + FileSystemDeviceCache devCache = cache.deviceCaches[dev]; + if(!devCache) + cache.deviceCaches[dev] = devCache = { }; + { + Array inodes = devCache.inodes[inode]; + if(!inodes) + devCache.inodes[inode] = inodes = { }; + else if(inodes.count == 1) + devCache.nonSingleLinks[inode] = true; + inodes.Add(o); + } + } + return result; + } + + void /*FileSystemCache*/DummyFileSystemCacheWindow::OnEnteringDirectory(char * path) + { + FileSystemCache cache = this.cache; + FSCacheObject o = cache.objects.lastIterator.data; + cache.normalParentStack.Add(o); + } + + void /*FileSystemCache*/DummyFileSystemCacheWindow::OnLeavingDirectory(char * path) + { + FileSystemCache cache = this.cache; + cache.normalParentStack.lastIterator.Remove(); + } + }; + fsi.Iterate(path, false); + { + if(cache.objects.count) + { + for(dev : cache.deviceCaches) + { + PrintLn("# of inodes (dev", &dev, "): ", dev.inodes.count); + + if(dev.nonSingleLinks.count) + { + for(inode : dev.nonSingleLinks) + { + PrintLn(" ", &inode); + for(o : dev.inodes[&inode]) + { + char * path = o.GetPath(); + PrintLn(path); + delete path; + } + } + } + } + } + } + delete cache.normalParentStack; + delete fsi; + } + } + //return cache; + } + + FSCacheObject FetchObject(char * path) + { + FSCacheObject result = null; + for(root : roots) + { + FSCacheObject o = &root; + Array names = GetPathDirNamesArray(path); + int c, max = Min(names.count, root.names.count); + for(c = 0; c < max; c++) + { + if(strcmp(names[c], root.names[c])) + break; + } + if(c == max) + { + if(c == names.count) + result = o; + else + { + for(; c < names.count; c++) + { + FSCacheObject child = o.firstChild; + o = null; + while(child) + { + if(!strcmp(child.name, names[c])) + { + o = child; + break; + } + child = child.nextSibling; + } + if(!o) + break; + } + if(o) + result = o; + } + break; + } + delete names; + } + return result; + } + + bool FileGetStats(char * path, FileStats stats) + { + FSCacheObject o = FetchObject(path); + if(o) + stats = o.stats; + else + stats = { }; + return o != null; + } + + Map> devsInodesDone { }; + Map linksPaths { }; + void Special(char * path/*, Map linksPaths*//*Map> devsInodesDone*/, DummyFileSystemCacheWindow dummyWindow) + { + FileSystemCacheIterator fsci { owner = dummyWindow, cache = this, iterateStartPath = true; + bool /*FileSystemCache*/DummyFileSystemCacheWindow::OnObject(char * name, char * path, FileStats stats, bool isRootObject) + { + uint dev = stats.dev; + uint inode = stats.inode; + FileSystemCache cache = this.cache; + if(dev && inode) + { + FileSystemDeviceCache devCache = cache.deviceCaches[dev]; + if(devCache) + { + Array links = devCache.inodes[inode]; + if(links && links.count) + { + if(links.count > 1) + { + Map inodesDone = cache.devsInodesDone[dev]; + Map linksPaths = cache.linksPaths; + bool done; + if(!inodesDone) + cache.devsInodesDone[dev] = inodesDone = { }; + done = inodesDone[inode]; + if(!done) + { + inodesDone[inode] = true; + //PrintLn(" ", &inode); + for(o : links) + { + char * path = o.GetPath(); + //PrintLn(path); + //delete path; + linksPaths[path] = true; + } + } + } + } + else + PrintLn("no links/count!!"); + } + else + PrintLn("no devCache!!"); + } + else + PrintLn("no dev/inode"); + return true; + } + }; + fsci.Iterate(path, false); + delete fsci; + } + void SpecialPrint() + { + MapNode mn; + PrintLn(" -------------------------------------------- Special -------------------------------------------- "); + PrintLn(" ------------------------------------------------------------------------------------------------- "); + for(mn = linksPaths.root.minimum; mn; mn = mn.next) + { + PrintLn(mn.key); + } + } + +private: + FileSystemCacheBits bits; + + ~FileSystemCache() + { + objects.Free(); + delete objects; + } +} + +public class FileSystemDeviceCache : struct +{ +public: + Map> inodes { }; + Map nonSingleLinks { }; // using a map presuming it will be faster than Array::Find() //Array nonSingleLinks { }; + +private: +} + +class FSCacheRoot : struct +{ +public: + uint position; + Array names; + +private: + ~FSCacheRoot() + { + if(names) + { + names.Free(); + delete names; + } + } +} + +/* +enum FSCacheObjectType { normal }; + +class FSCacheObjectBits +{ + FSCacheObjectType type:4; + bool isRoot:1; +} +*/ + +public class FSCacheObject : struct +{ +public: + FSCacheObject parent; + char * name; + FileStats stats; + FSCacheObject firstChild; + FSCacheObject lastChild; + FSCacheObject prevSibling; + FSCacheObject nextSibling; + + char * GetPath() + { + int c; + char path[MAX_LOCATION] = ""; + FSCacheObject o; + Array stack { }; + for(o = this; o; o = o.parent) + stack.Add(o); + for(c = stack.count - 1; c >= 0; c--) + { + o = stack[c]; + if(c < stack.count - 1) + strcat(path, DIR_SEPS); + strcat(path, o.name); + } + delete stack; + return CopyString(path); + } + +private: +// FSCacheObjectBits bits; + + ~FSCacheObject() + { + delete name; + } +} + +Array GetPathDirNamesArray(char * path) +{ + Array names; + if(path && path[0]) + { + char * p = path; + char rest[MAX_LOCATION]; + char name[MAX_FILENAME]; + names = { }; + while(strlen(p)) + { + SplitDirectory(p, name, rest); + if(p == path) p = rest; + names.Add(CopyString(name)); + } + } + return names; +} diff --git a/libede/src/FileSystemIterator.ec b/libede/src/FileSystemIterator.ec new file mode 100644 index 0000000..6c2cab3 --- /dev/null +++ b/libede/src/FileSystemIterator.ec @@ -0,0 +1,118 @@ +#ifdef BUILDING_ECERE_COM +namespace sys; +import "Array" +#else +#ifdef ECERE_STATIC +public import static "ecere" +#else +public import "ecere" +#endif +#endif + +public class FileSystemIterator : InterfaceFileSystemIterator +{ +public: + property char * extensions { set { delete extensions; if(value) extensions = CopyString(value); } get { return extensions; } } + + public bool Iterate(char * startPath, bool followLinks) + { + bool result = true; + bool listDirEntries; + Array stack { }; + FileSystemIteratorStackFrame frame; + + if(iterateStartPath) + { + char name[MAX_LOCATION] = ""; + FileStats stats; + if(followLinks) + FileGetStats(startPath, stats); + else + FileGetStatsLink(startPath, stats); + GetLastDirectory(startPath, name); + listDirEntries = OnObject(owner, name, startPath, stats, true); + if(listDirEntries) + { + OnEnteringDirectory(owner, startPath); + // FileListing should have a sorted = true/false property + stack.Add((frame = { { startPath, extensions = extensions } })); + } + } + + if(listDirEntries) + { + while(frame) + { + if(frame.listing.Find()) + { + FileStats stats = followLinks ? frame.listing.stats : frame.listing.lstats; + listDirEntries = OnObject(owner, frame.listing.name, frame.listing.path, stats, !iterateStartPath && stack.count == 1); + if(stats.attribs.isDirectory) + { + if(listDirEntries) + { + OnEnteringDirectory(owner, frame.listing.path); + stack.Add((frame = { { frame.listing.path, extensions = frame.listing.extensions } })); + } + else + result = false; + } + } + else + { + if(stack.count > (iterateStartPath ? 0 : 1)) + OnLeavingDirectory(owner, frame.listing.directory); + delete frame; + stack.lastIterator.Remove(); + frame = stack.count == 0 ? null : stack.lastIterator.data; + } + } + if(stack.count != 0) + PrintLn("dddddddd"); + stack.Free(); + } + delete stack; + return result; + } + +private: + char * extensions; + + ~FileSystemIterator() + { + delete extensions; + } +} + +public class FileSystemIteratorStackFrame : struct +{ +public: + FileListing listing; + +private: +} + +public class InterfaceFileSystemIterator +{ +public: + Window owner; // any_object owner; <-- this makes it so that uses of owner are not compiling... + // the idea here is to provide iterators with the ability to use arbitrary data when used by instanciation only not defivation. + void * data; // any_object data; <-- this... probably the same + bool iterateStartPath; + + virtual bool Iterate(char * startPath, bool followLinks); + virtual bool any_object::OnObject(/*any_object data, */char * name, char * path, FileStats stats, bool isRootObject); + virtual void any_object::OnEnteringDirectory(/*any_object data, */char * path); + virtual void any_object::OnLeavingDirectory(/*any_object data, */char * path); + +private: +} + +// TODO: implement threaded iteration somehow.... +static class IteratorThread : Thread +{ + void Temp() + { + //listing = FileListing { dir, extensions = filter.extensions }; // there should be a sorted = true/false + } +} diff --git a/libede/src/FileSystemSearch.ec b/libede/src/FileSystemSearch.ec index 53b6da8..690cd71 100644 --- a/libede/src/FileSystemSearch.ec +++ b/libede/src/FileSystemSearch.ec @@ -193,8 +193,8 @@ public: //DeleteMessageNode(); tree.Clear(); stack[0].browse = MakeFileSystemNode(stats, stack[0].path, stack[0].path, false, - tree.bits.previewPictures, tree.displaySystem); - tree.AddTreeNode(stack[0].browse, false, true, null); // TEMPORARY // searchPanel.AddBrowse(stack[0].browse, null); + tree.bits.previewPictures, false, tree.displaySystem); + tree.AddTreeNode(stack[0].browse, false, true, true, null); // TEMPORARY // searchPanel.AddBrowse(stack[0].browse, null); } guiApp.Unlock(); } @@ -251,16 +251,16 @@ public: DeleteMessageNode(); stack[frame].result = MakeFileSystemNode(stack[frame - 1].listing.stats, stack[frame - 1].listing.name, stack[frame - 1].path, true, - fsb.bits.previewPictures, fsb.displaySystem); - fsb.AddTreeNode(stack[frame].result, true, false, stack[frame - 1].result); // TEMPORARY // searchPanel.AddResult(stack[frame].result, stack[frame - 1].result); + fsb.bits.previewPictures, false, fsb.displaySystem); + fsb.AddTreeNode(stack[frame].result, true, true, false, stack[frame - 1].result); // TEMPORARY // searchPanel.AddResult(stack[frame].result, stack[frame - 1].result); stack[frame].result.row.collapsed = false; } else { DeleteMessageNode(); stack[0].result = MakeFileSystemNode(stats, stack[0].path, stack[0].path, true, - fsb.bits.previewPictures, fsb.displaySystem); - fsb.AddTreeNode(stack[0].result, true, false, null); // TEMPORARY // searchPanel.AddResult(stack[0].result, null); + fsb.bits.previewPictures, false, fsb.displaySystem); + fsb.AddTreeNode(stack[0].result, true, true, false, null); // TEMPORARY // searchPanel.AddResult(stack[0].result, null); stack[0].result.row.collapsed = false; } stack[frame].branched = true; @@ -297,7 +297,7 @@ public: stack[frame].browse = MakeFileSystemNode(stack[stackTop].listing.stats, stack[stackTop].listing.name, stack[stackTop].path, true, fsb.bits.previewPictures, fsb.displaySystem); - fsb.AddTreeNode(stack[frame].browse, true, false, stack[stackTop].browse); // TEMPORARY // searchPanel.AddBrowse(stack[frame].browse, stack[stackTop].browse); + fsb.AddTreeNode(stack[frame].browse, true, true, false, stack[stackTop].browse); // TEMPORARY // searchPanel.AddBrowse(stack[frame].browse, stack[stackTop].browse); if(frame) stack[frame].browse.row.collapsed = true; @@ -317,10 +317,10 @@ public: DeleteMessageNode(); stack[frame].result = MakeFileSystemNode(stack[stackTop].listing.stats, stack[stackTop].listing.name, stack[stackTop].path, true, - fsb.bits.previewPictures, fsb.displaySystem); + fsb.bits.previewPictures, false, fsb.displaySystem); if(optionTree) { - fsb.AddTreeNode(stack[frame].result, true, false, stack[stackTop].result); // TEMPORARY // searchPanel.AddResult(stack[frame].result, stack[stackTop].result); + fsb.AddTreeNode(stack[frame].result, true, true, false, stack[stackTop].result); // TEMPORARY // searchPanel.AddResult(stack[frame].result, stack[stackTop].result); stack[frame].result.row.collapsed = false; //searchPanel.SortResults(); // this can be very bad for performance in some situations // there should be a way to sort the nodes as they are added @@ -345,7 +345,7 @@ public: item = MakeFileSystemNode(stack[frame].listing.stats, stack[frame].listing.name, stack[frame].path, true, fsb.bits.previewPictures, fsb.displaySystem); - fsb.AddTreeNode(item, true, false, stack[frame].browse); // TEMPORARY // searchPanel.AddBrowse(item, stack[frame].browse); + fsb.AddTreeNode(item, true, true, false, stack[frame].browse); // TEMPORARY // searchPanel.AddBrowse(item, stack[frame].browse); //if(frame == 1) //searchPanel.SortBrowser(); // this can be very bad for performance in some situations // there should be a way to sort the nodes as they are added @@ -357,10 +357,10 @@ public: DeleteMessageNode(); item = MakeFileSystemNode(stack[frame].listing.stats, stack[frame].listing.name, stack[frame].path, true, - fsb.bits.previewPictures, fsb.displaySystem); + fsb.bits.previewPictures, false, fsb.displaySystem); if(optionTree) { - fsb.AddTreeNode(item, true, false, stack[frame].result); // TEMPORARY // searchPanel.AddResult(item, stack[frame].result); + fsb.AddTreeNode(item, true, true, false, stack[frame].result); // TEMPORARY // searchPanel.AddResult(item, stack[frame].result); item.row.collapsed = false; //searchPanel.SortResults(); // this can be very bad for performance in some situations // there should be a way to sort the nodes as they are added @@ -374,7 +374,7 @@ public: for(lin = lin.next; lin && strlen(temp) < MAX_F_STRING; lin = lin.next) strcatf(temp, ", %d", lin.num); node = FileSystemNode { name = temp/*CopyString(temp)*/, type = lineNumbers }; - fsb.AddTreeNode(node, true, false, item); // TEMPORARY // searchPanel.AddResult(node, item); + fsb.AddTreeNode(node, true, true, false, item); // TEMPORARY // searchPanel.AddResult(node, item); //row.AddRow().SetData(resultsNameField, node); lines.Free(null); } -- 1.8.3.1