From f6ec80d9bdcb0e2fb764522c84e031951588c809 Mon Sep 17 00:00:00 2001 From: w1z7ard Date: Sun, 28 Oct 2007 15:39:28 +0000 Subject: [PATCH] merge from dev branch (r583:HEAD) - qprojectM lib, qprojectM-jack added - updates to projectm engine for preset managment / callbacksO git-svn-id: https://projectm.svn.sourceforge.net/svnroot/projectm/trunk@630 6778bc44-b910-0410-a7a0-be141de4315d --- src/projectM-engine/KeyHandler.cpp | 3 +- src/projectM-engine/PresetLoader.cpp | 20 +- src/projectM-engine/PresetLoader.hpp | 14 +- src/projectM-engine/Renderer.hpp | 2 +- src/projectM-engine/projectM.cpp | 400 ++++++------ src/projectM-engine/projectM.hpp | 33 +- src/qprojectM-jack/AUTHORS | 0 src/qprojectM-jack/CMakeLists.txt | 42 ++ src/qprojectM-jack/COPYING | 340 ++++++++++ src/qprojectM-jack/ChangeLog | 1 + src/qprojectM-jack/ConfigFile.cpp | 142 +++++ src/qprojectM-jack/ConfigFile.h | 253 ++++++++ src/qprojectM-jack/FindPkgConfig.cmake | 360 +++++++++++ src/qprojectM-jack/INSTALL | 7 + src/qprojectM-jack/NEWS | 0 src/qprojectM-jack/README | 1 + src/qprojectM-jack/depcomp | 584 ++++++++++++++++++ src/qprojectM-jack/missing | 367 +++++++++++ src/qprojectM-jack/qprojectM-jack.cpp | 333 ++++++++++ src/qprojectM/CMakeLists.txt | 9 + src/qprojectM/COPYING | 340 ++++++++++ src/qprojectM/Doxyfile | 283 +++++++++ src/qprojectM/qtprojectM.kdevelop | 225 +++++++ src/qprojectM/qtprojectM.kdevelop.pcs | Bin 0 -> 117665 bytes src/qprojectM/qtprojectM.kdevses | 46 ++ src/qprojectM/qtprojectM.pro | 5 + src/qprojectM/src/CMakeLists.txt | 54 ++ src/qprojectM/src/ConfigFile.cpp | 142 +++++ src/qprojectM/src/ConfigFile.h | 253 ++++++++ src/qprojectM/src/FindPkgConfig.cmake | 360 +++++++++++ src/qprojectM/src/QProjectMFileDialog.hpp | 52 ++ src/qprojectM/src/QProjectM_MainWindow.cpp | 289 +++++++++ src/qprojectM/src/QProjectM_MainWindow.hpp | 251 ++++++++ src/qprojectM/src/QProjectM_MainWindow.ui | 407 ++++++++++++ src/qprojectM/src/ReadMe | 11 + src/qprojectM/src/application.qrc | 11 + src/qprojectM/src/editcopy.xpm | 193 ++++++ src/qprojectM/src/editcut.xpm | 252 ++++++++ src/qprojectM/src/editpaste.xpm | 295 +++++++++ src/qprojectM/src/filenew.xpm | 216 +++++++ src/qprojectM/src/fileopen.xpm | 295 +++++++++ src/qprojectM/src/filesave.xpm | 295 +++++++++ src/qprojectM/src/images/icons/CMakeLists.txt | 4 + .../images/icons/hi16-action-collection.png | Bin 0 -> 942 bytes .../icons/hi16-action-projectm_add_lyrics.png | Bin 0 -> 650 bytes .../hi16-action-projectm_add_playlist.png | Bin 0 -> 661 bytes .../icons/hi16-action-projectm_album.png | Bin 0 -> 945 bytes .../icons/hi16-action-projectm_artist.png | Bin 0 -> 704 bytes .../hi16-action-projectm_audioscrobbler.png | Bin 0 -> 783 bytes .../icons/hi16-action-projectm_back.png | Bin 0 -> 945 bytes .../icons/hi16-action-projectm_burn.png | Bin 0 -> 852 bytes .../hi16-action-projectm_change_language.png | Bin 0 -> 868 bytes .../icons/hi16-action-projectm_circle.png | Bin 0 -> 801 bytes .../icons/hi16-action-projectm_clock.png | Bin 0 -> 935 bytes .../icons/hi16-action-projectm_collection.png | Bin 0 -> 922 bytes .../icons/hi16-action-projectm_configure.png | Bin 0 -> 927 bytes .../hi16-action-projectm_covermanager.png | Bin 0 -> 730 bytes .../icons/hi16-action-projectm_device.png | Bin 0 -> 658 bytes .../icons/hi16-action-projectm_download.png | Bin 0 -> 874 bytes .../icons/hi16-action-projectm_dynamic.png | Bin 0 -> 876 bytes .../icons/hi16-action-projectm_edit.png | Bin 0 -> 670 bytes .../icons/hi16-action-projectm_editcopy.png | Bin 0 -> 629 bytes .../icons/hi16-action-projectm_equalizer.png | Bin 0 -> 639 bytes .../icons/hi16-action-projectm_external.png | Bin 0 -> 981 bytes .../hi16-action-projectm_fastforward.png | Bin 0 -> 957 bytes .../hi16-action-projectm_favourite_genres.png | Bin 0 -> 471 bytes .../icons/hi16-action-projectm_files.png | Bin 0 -> 434 bytes .../icons/hi16-action-projectm_files2.png | Bin 0 -> 467 bytes .../icons/hi16-action-projectm_info.png | Bin 0 -> 868 bytes .../icons/hi16-action-projectm_jamendo.png | Bin 0 -> 569 bytes .../icons/hi16-action-projectm_lock.png | Bin 0 -> 963 bytes .../icons/hi16-action-projectm_love.png | Bin 0 -> 896 bytes .../icons/hi16-action-projectm_lyrics.png | Bin 0 -> 477 bytes .../icons/hi16-action-projectm_mostplayed.png | Bin 0 -> 914 bytes .../icons/hi16-action-projectm_music.png | Bin 0 -> 672 bytes .../icons/hi16-action-projectm_next.png | Bin 0 -> 943 bytes .../icons/hi16-action-projectm_pause.png | Bin 0 -> 920 bytes .../icons/hi16-action-projectm_play.png | Bin 0 -> 922 bytes .../icons/hi16-action-projectm_playlist.png | Bin 0 -> 696 bytes .../hi16-action-projectm_playlist_clear.png | Bin 0 -> 575 bytes .../hi16-action-projectm_playlist_refresh.png | Bin 0 -> 801 bytes .../icons/hi16-action-projectm_podcast.png | Bin 0 -> 640 bytes .../icons/hi16-action-projectm_podcast2.png | Bin 0 -> 786 bytes .../icons/hi16-action-projectm_queue.png | Bin 0 -> 738 bytes .../icons/hi16-action-projectm_random.png | Bin 0 -> 876 bytes .../hi16-action-projectm_random_album.png | Bin 0 -> 874 bytes .../icons/hi16-action-projectm_random_no.png | Bin 0 -> 851 bytes .../hi16-action-projectm_random_track.png | Bin 0 -> 864 bytes .../icons/hi16-action-projectm_redo.png | Bin 0 -> 918 bytes .../icons/hi16-action-projectm_refresh.png | Bin 0 -> 959 bytes .../icons/hi16-action-projectm_remove.png | Bin 0 -> 962 bytes ...6-action-projectm_remove_from_playlist.png | Bin 0 -> 699 bytes .../hi16-action-projectm_repeat_album.png | Bin 0 -> 1008 bytes .../icons/hi16-action-projectm_repeat_no.png | Bin 0 -> 840 bytes .../hi16-action-projectm_repeat_playlist.png | Bin 0 -> 752 bytes .../hi16-action-projectm_repeat_track.png | Bin 0 -> 566 bytes .../icons/hi16-action-projectm_rescan.png | Bin 0 -> 965 bytes .../icons/hi16-action-projectm_rewind.png | Bin 0 -> 962 bytes .../icons/hi16-action-projectm_save.png | Bin 0 -> 572 bytes .../icons/hi16-action-projectm_scripts.png | Bin 0 -> 638 bytes .../icons/hi16-action-projectm_search.png | Bin 0 -> 646 bytes .../hi16-action-projectm_settings_engine.png | Bin 0 -> 934 bytes .../hi16-action-projectm_settings_general.png | Bin 0 -> 870 bytes ...i16-action-projectm_settings_indicator.png | Bin 0 -> 747 bytes ...hi16-action-projectm_settings_playback.png | Bin 0 -> 756 bytes .../hi16-action-projectm_settings_view.png | Bin 0 -> 884 bytes .../icons/hi16-action-projectm_stop.png | Bin 0 -> 880 bytes .../icons/hi16-action-projectm_track.png | Bin 0 -> 889 bytes .../icons/hi16-action-projectm_undo.png | Bin 0 -> 919 bytes .../icons/hi16-action-projectm_unlock.png | Bin 0 -> 923 bytes .../hi16-action-projectm_visualizations.png | Bin 0 -> 522 bytes .../icons/hi16-action-projectm_zoom.png | Bin 0 -> 714 bytes .../icons/hi32-action-audioscrobbler.png | Bin 0 -> 1634 bytes .../images/icons/hi32-action-collection.png | Bin 0 -> 1753 bytes .../icons/hi32-action-projectm_add_lyrics.png | Bin 0 -> 1208 bytes .../hi32-action-projectm_add_playlist.png | Bin 0 -> 1210 bytes .../icons/hi32-action-projectm_album.png | Bin 0 -> 1689 bytes .../icons/hi32-action-projectm_artist.png | Bin 0 -> 1474 bytes .../hi32-action-projectm_audioscrobbler.png | Bin 0 -> 1600 bytes .../icons/hi32-action-projectm_back.png | Bin 0 -> 1693 bytes .../icons/hi32-action-projectm_burn.png | Bin 0 -> 1684 bytes .../hi32-action-projectm_change_language.png | Bin 0 -> 1740 bytes .../icons/hi32-action-projectm_circle.png | Bin 0 -> 1586 bytes .../icons/hi32-action-projectm_clock.png | Bin 0 -> 1734 bytes .../icons/hi32-action-projectm_collection.png | Bin 0 -> 1773 bytes .../icons/hi32-action-projectm_configure.png | Bin 0 -> 1748 bytes .../hi32-action-projectm_covermanager.png | Bin 0 -> 1683 bytes .../icons/hi32-action-projectm_device.png | Bin 0 -> 1446 bytes .../icons/hi32-action-projectm_download.png | Bin 0 -> 1688 bytes .../icons/hi32-action-projectm_dynamic.png | Bin 0 -> 1683 bytes .../icons/hi32-action-projectm_edit.png | Bin 0 -> 1458 bytes .../icons/hi32-action-projectm_editcopy.png | Bin 0 -> 1409 bytes .../icons/hi32-action-projectm_equalizer.png | Bin 0 -> 1032 bytes .../icons/hi32-action-projectm_external.png | Bin 0 -> 1797 bytes .../hi32-action-projectm_fastforward.png | Bin 0 -> 1684 bytes .../hi32-action-projectm_favourite_genres.png | Bin 0 -> 894 bytes .../icons/hi32-action-projectm_files.png | Bin 0 -> 740 bytes .../icons/hi32-action-projectm_files2.png | Bin 0 -> 788 bytes .../icons/hi32-action-projectm_info.png | Bin 0 -> 1646 bytes .../icons/hi32-action-projectm_jamendo.png | Bin 0 -> 1210 bytes .../icons/hi32-action-projectm_love.png | Bin 0 -> 1584 bytes .../icons/hi32-action-projectm_lyrics.png | Bin 0 -> 846 bytes .../icons/hi32-action-projectm_mostplayed.png | Bin 0 -> 1646 bytes .../icons/hi32-action-projectm_music.png | Bin 0 -> 1349 bytes .../icons/hi32-action-projectm_next.png | Bin 0 -> 1691 bytes .../icons/hi32-action-projectm_pause.png | Bin 0 -> 1670 bytes .../icons/hi32-action-projectm_play.png | Bin 0 -> 1644 bytes .../icons/hi32-action-projectm_playlist.png | Bin 0 -> 1481 bytes .../hi32-action-projectm_playlist_clear.png | Bin 0 -> 992 bytes .../hi32-action-projectm_playlist_refresh.png | Bin 0 -> 1510 bytes .../icons/hi32-action-projectm_podcast.png | Bin 0 -> 1178 bytes .../icons/hi32-action-projectm_podcast2.png | Bin 0 -> 1482 bytes .../icons/hi32-action-projectm_queue.png | Bin 0 -> 1598 bytes .../icons/hi32-action-projectm_random.png | Bin 0 -> 1683 bytes .../hi32-action-projectm_random_album.png | Bin 0 -> 1731 bytes .../icons/hi32-action-projectm_random_no.png | Bin 0 -> 1661 bytes .../hi32-action-projectm_random_track.png | Bin 0 -> 1666 bytes .../icons/hi32-action-projectm_redo.png | Bin 0 -> 1659 bytes .../icons/hi32-action-projectm_refresh.png | Bin 0 -> 1711 bytes .../icons/hi32-action-projectm_remove.png | Bin 0 -> 1638 bytes ...2-action-projectm_remove_from_playlist.png | Bin 0 -> 1423 bytes .../hi32-action-projectm_repeat_album.png | Bin 0 -> 1785 bytes .../icons/hi32-action-projectm_repeat_no.png | Bin 0 -> 1692 bytes .../hi32-action-projectm_repeat_playlist.png | Bin 0 -> 1491 bytes .../hi32-action-projectm_repeat_track.png | Bin 0 -> 1508 bytes .../icons/hi32-action-projectm_rescan.png | Bin 0 -> 1776 bytes .../icons/hi32-action-projectm_rewind.png | Bin 0 -> 1680 bytes .../icons/hi32-action-projectm_save.png | Bin 0 -> 990 bytes .../icons/hi32-action-projectm_scripts.png | Bin 0 -> 1129 bytes .../icons/hi32-action-projectm_search.png | Bin 0 -> 1449 bytes .../hi32-action-projectm_settings_engine.png | Bin 0 -> 1747 bytes .../hi32-action-projectm_settings_general.png | Bin 0 -> 1726 bytes ...i32-action-projectm_settings_indicator.png | Bin 0 -> 1706 bytes ...hi32-action-projectm_settings_playback.png | Bin 0 -> 1626 bytes .../hi32-action-projectm_settings_view.png | Bin 0 -> 1744 bytes .../icons/hi32-action-projectm_stop.png | Bin 0 -> 1561 bytes .../icons/hi32-action-projectm_track.png | Bin 0 -> 1672 bytes .../icons/hi32-action-projectm_undo.png | Bin 0 -> 1659 bytes .../hi32-action-projectm_visualizations.png | Bin 0 -> 578 bytes .../icons/hi32-action-projectm_zoom.png | Bin 0 -> 1546 bytes src/qprojectM/src/src.pro | 12 + src/qprojectM/templates/cpp | 19 + src/qprojectM/templates/h | 19 + 183 files changed, 7046 insertions(+), 194 deletions(-) create mode 100644 src/qprojectM-jack/AUTHORS create mode 100644 src/qprojectM-jack/CMakeLists.txt create mode 100644 src/qprojectM-jack/COPYING create mode 100644 src/qprojectM-jack/ChangeLog create mode 100644 src/qprojectM-jack/ConfigFile.cpp create mode 100644 src/qprojectM-jack/ConfigFile.h create mode 100644 src/qprojectM-jack/FindPkgConfig.cmake create mode 100644 src/qprojectM-jack/INSTALL create mode 100644 src/qprojectM-jack/NEWS create mode 100644 src/qprojectM-jack/README create mode 100755 src/qprojectM-jack/depcomp create mode 100755 src/qprojectM-jack/missing create mode 100644 src/qprojectM-jack/qprojectM-jack.cpp create mode 100644 src/qprojectM/CMakeLists.txt create mode 100644 src/qprojectM/COPYING create mode 100644 src/qprojectM/Doxyfile create mode 100644 src/qprojectM/qtprojectM.kdevelop create mode 100644 src/qprojectM/qtprojectM.kdevelop.pcs create mode 100644 src/qprojectM/qtprojectM.kdevses create mode 100644 src/qprojectM/qtprojectM.pro create mode 100644 src/qprojectM/src/CMakeLists.txt create mode 100644 src/qprojectM/src/ConfigFile.cpp create mode 100644 src/qprojectM/src/ConfigFile.h create mode 100644 src/qprojectM/src/FindPkgConfig.cmake create mode 100644 src/qprojectM/src/QProjectMFileDialog.hpp create mode 100644 src/qprojectM/src/QProjectM_MainWindow.cpp create mode 100644 src/qprojectM/src/QProjectM_MainWindow.hpp create mode 100644 src/qprojectM/src/QProjectM_MainWindow.ui create mode 100644 src/qprojectM/src/ReadMe create mode 100644 src/qprojectM/src/application.qrc create mode 100644 src/qprojectM/src/editcopy.xpm create mode 100644 src/qprojectM/src/editcut.xpm create mode 100644 src/qprojectM/src/editpaste.xpm create mode 100644 src/qprojectM/src/filenew.xpm create mode 100644 src/qprojectM/src/fileopen.xpm create mode 100644 src/qprojectM/src/filesave.xpm create mode 100644 src/qprojectM/src/images/icons/CMakeLists.txt create mode 100644 src/qprojectM/src/images/icons/hi16-action-collection.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_add_lyrics.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_add_playlist.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_album.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_artist.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_audioscrobbler.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_back.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_burn.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_change_language.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_circle.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_clock.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_collection.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_configure.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_covermanager.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_device.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_download.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_dynamic.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_edit.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_editcopy.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_equalizer.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_external.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_fastforward.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_favourite_genres.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_files.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_files2.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_info.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_jamendo.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_lock.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_love.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_lyrics.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_mostplayed.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_music.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_next.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_pause.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_play.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_playlist.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_playlist_clear.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_playlist_refresh.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_podcast.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_podcast2.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_queue.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_random.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_random_album.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_random_no.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_random_track.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_redo.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_refresh.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_remove.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_remove_from_playlist.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_repeat_album.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_repeat_no.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_repeat_playlist.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_repeat_track.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_rescan.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_rewind.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_save.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_scripts.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_search.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_settings_engine.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_settings_general.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_settings_indicator.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_settings_playback.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_settings_view.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_stop.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_track.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_undo.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_unlock.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_visualizations.png create mode 100644 src/qprojectM/src/images/icons/hi16-action-projectm_zoom.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-audioscrobbler.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-collection.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_add_lyrics.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_add_playlist.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_album.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_artist.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_audioscrobbler.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_back.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_burn.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_change_language.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_circle.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_clock.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_collection.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_configure.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_covermanager.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_device.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_download.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_dynamic.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_edit.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_editcopy.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_equalizer.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_external.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_fastforward.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_favourite_genres.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_files.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_files2.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_info.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_jamendo.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_love.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_lyrics.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_mostplayed.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_music.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_next.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_pause.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_play.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_playlist.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_playlist_clear.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_playlist_refresh.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_podcast.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_podcast2.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_queue.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_random.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_random_album.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_random_no.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_random_track.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_redo.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_refresh.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_remove.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_remove_from_playlist.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_repeat_album.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_repeat_no.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_repeat_playlist.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_repeat_track.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_rescan.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_rewind.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_save.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_scripts.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_search.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_settings_engine.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_settings_general.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_settings_indicator.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_settings_playback.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_settings_view.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_stop.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_track.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_undo.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_visualizations.png create mode 100644 src/qprojectM/src/images/icons/hi32-action-projectm_zoom.png create mode 100644 src/qprojectM/src/src.pro create mode 100644 src/qprojectM/templates/cpp create mode 100644 src/qprojectM/templates/h diff --git a/src/projectM-engine/KeyHandler.cpp b/src/projectM-engine/KeyHandler.cpp index 5b94fd899..7114b057b 100755 --- a/src/projectM-engine/KeyHandler.cpp +++ b/src/projectM-engine/KeyHandler.cpp @@ -179,8 +179,7 @@ void projectM::default_key_handler( projectMEvent event, projectMKeycode keycode } m_activePreset = m_presetPos->allocate(this->presetInputs, this->presetOutputs); - renderer->setPresetName(m_activePreset->presetName()); - + renderer->setPresetName(m_activePreset->presetName()); presetInputs.frame = 0; smoothFrame = 0; break; diff --git a/src/projectM-engine/PresetLoader.cpp b/src/projectM-engine/PresetLoader.cpp index 81fd983f0..28fb97aff 100644 --- a/src/projectM-engine/PresetLoader.cpp +++ b/src/projectM-engine/PresetLoader.cpp @@ -158,11 +158,23 @@ void PresetLoader::handleDirectoryError() } -unsigned int PresetLoader::addPresetURL(const std::string & url) { +unsigned int PresetLoader::addPresetURL(const std::string & url, const std::string & presetName) { m_entries.push_back(url); - - /// @bug strip url out of preset name - m_presetNames.push_back(url); + m_presetNames.push_back(presetName); return m_entries.size()-1; } +void PresetLoader::removePreset(unsigned int index) { + std::vector::iterator pos = m_entries.begin(); + pos += index; + m_entries.erase(pos); + m_presetNames.erase(pos); +} + +const std::string & PresetLoader::getPresetURL ( unsigned int index) const { + return m_entries[index]; +} + +const std::string & PresetLoader::getPresetName ( unsigned int index) const { + return m_presetNames[index]; +} diff --git a/src/projectM-engine/PresetLoader.hpp b/src/projectM-engine/PresetLoader.hpp index 1a155ec4d..440ccca35 100644 --- a/src/projectM-engine/PresetLoader.hpp +++ b/src/projectM-engine/PresetLoader.hpp @@ -39,12 +39,18 @@ class PresetLoader { std::auto_ptr loadPreset(unsigned int index, const PresetInputs & presetInputs, PresetOutputs & presetOutputs) const; - /// Add a preset to the loader's collection. - /// \param presetInputs read only projectM variables to associate with the preset - /// \param presetOutputs the projectM variables the preset will write its final values to + /// \param url an url referencing the preset /// \returns The unique index assigned to the preset in the collection. Used with loadPreset - unsigned int addPresetURL ( const std::string & url); + unsigned int addPresetURL ( const std::string & url, const std::string & presetName); + + void removePreset(unsigned int index); + + /// Get a preset url given an index + const std::string & getPresetURL ( unsigned int index) const; + + /// Get a preset name given an index + const std::string & getPresetName ( unsigned int index) const; /** Returns the number of presets in the active directory */ inline std::size_t getNumPresets() const { diff --git a/src/projectM-engine/Renderer.hpp b/src/projectM-engine/Renderer.hpp index 508f07f95..24c6c84ad 100644 --- a/src/projectM-engine/Renderer.hpp +++ b/src/projectM-engine/Renderer.hpp @@ -44,7 +44,7 @@ public: int studio; int correction; - int noSwitch; + bool noSwitch; int totalframes; float realfps; diff --git a/src/projectM-engine/projectM.cpp b/src/projectM-engine/projectM.cpp index a0f0ded52..37156849b 100755 --- a/src/projectM-engine/projectM.cpp +++ b/src/projectM-engine/projectM.cpp @@ -69,208 +69,212 @@ double smoothDuration = 5; //int smoothFrame = 0; int oldFrame = 1; -DLLEXPORT projectM::projectM(int gx, int gy, int fps, int texsize, int width, int height, std::string preset_url,std::string title_fonturl, std::string title_menuurl) :beatDetect ( 0 ), renderer(0), presetURL(preset_url), title_fontURL(title_fonturl), menu_fontURL(menu_fontURL), smoothFrame(0) { - presetURL = preset_url; - projectM_reset(); - projectM_init(gx, gy, fps, texsize, width, height); - projectM_resetGL( width, height ); +DLLEXPORT projectM::projectM ( int gx, int gy, int fps, int texsize, int width, int height, std::string preset_url,std::string title_fonturl, std::string title_menuurl ) :beatDetect ( 0 ), renderer ( 0 ), presetURL ( preset_url ), title_fontURL ( title_fonturl ), menu_fontURL ( menu_fontURL ), smoothFrame ( 0 ) +{ + presetURL = preset_url; + projectM_reset(); + projectM_init ( gx, gy, fps, texsize, width, height ); + projectM_resetGL ( width, height ); } -projectM::~projectM() { +projectM::~projectM() +{ - destroyPresetTools(); - - if (renderer) - delete(renderer); - if (beatDetect) - delete(beatDetect); - if (pcm) - delete(pcm); + destroyPresetTools(); + + if ( renderer ) + delete ( renderer ); + if ( beatDetect ) + delete ( beatDetect ); + if ( pcm ) + delete ( pcm ); } DLLEXPORT unsigned projectM::initRenderToTexture() { - return renderer->initRenderToTexture(); + return renderer->initRenderToTexture(); } -DLLEXPORT void projectM::projectM_resetTextures() +DLLEXPORT void projectM::projectM_resetTextures() { renderer->ResetTextures(); } -DLLEXPORT projectM::projectM(std::string config_file) : - beatDetect ( 0 ), renderer(0), smoothFrame(0) { +DLLEXPORT projectM::projectM ( std::string config_file ) : + beatDetect ( 0 ), renderer ( 0 ), smoothFrame ( 0 ) +{ - projectM_reset(); - readConfig(config_file); + projectM_reset(); + readConfig ( config_file ); } -void projectM::readConfig(std::string config_file) +void projectM::readConfig ( std::string config_file ) { - ConfigFile config(config_file); - - int gx = config.read( "Mesh X", 32 ); - int gy = config.read( "Mesh Y", 24 ); - int texsize = config.read( "Texsize", 512 ); - int fps = config.read( "FPS", 35 ); - int wvw = config.read( "Window Width", 512 ); - int wvh = config.read( "Window Height", 512 ); - smoothDuration = config.read( "Smooth Transition Duration", 5 ); - presetDuration = config.read( "Preset Duration", 15 ); + ConfigFile config ( config_file ); + + int gx = config.read ( "Mesh X", 32 ); + int gy = config.read ( "Mesh Y", 24 ); + int texsize = config.read ( "Texsize", 512 ); + int fps = config.read ( "FPS", 35 ); + int wvw = config.read ( "Window Width", 512 ); + int wvh = config.read ( "Window Height", 512 ); + smoothDuration = config.read ( "Smooth Transition Duration", 5 ); + presetDuration = config.read ( "Preset Duration", 15 ); - presetURL = config.read( "Preset Path", "/usr/share/projectM/presets" ); + presetURL = config.read ( "Preset Path", "/usr/share/projectM/presets" ); - title_fontURL = config.read( "Title Font", "/usr/share/projectM/fonts/Vera.ttf" ); - menu_fontURL = config.read( "Menu Font", "/usr/share/projectM/fonts/VeraMono.ttf" ); + title_fontURL = config.read ( "Title Font", "/usr/share/projectM/fonts/Vera.ttf" ); + menu_fontURL = config.read ( "Menu Font", "/usr/share/projectM/fonts/VeraMono.ttf" ); - projectM_init(gx, gy, fps, texsize, wvw, wvh); + projectM_init ( gx, gy, fps, texsize, wvw, wvh ); - beatDetect->beat_sensitivity = config.read( "Hard Cut Sensitivity", 10.0 ); - if (config.read("Aspect Correction", true)) renderer->correction = 1; - else renderer->correction = 0; + beatDetect->beat_sensitivity = config.read ( "Hard Cut Sensitivity", 10.0 ); + if ( config.read ( "Aspect Correction", true ) ) renderer->correction = 1; + else renderer->correction = 0; - projectM_resetGL( wvw, wvh ); + projectM_resetGL ( wvw, wvh ); } DLLEXPORT void projectM::renderFrame() { -#ifdef DEBUG - char fname[1024]; - FILE *f = NULL; - int index = 0; - int x, y; +#ifdef DEBUG + char fname[1024]; + FILE *f = NULL; + int index = 0; + int x, y; #endif - // printf("Start of loop at %d\n",timestart); - mspf= ( int ) ( 1000.0/ ( float ) presetInputs.fps ); //milliseconds per frame + // printf("Start of loop at %d\n",timestart); + mspf= ( int ) ( 1000.0/ ( float ) presetInputs.fps ); //milliseconds per frame #ifndef WIN32 - presetInputs.time = getTicks ( &startTime ) * 0.001; + presetInputs.time = getTicks ( &startTime ) * 0.001; #else - presetInputs.time = getTicks ( startTime ) * 0.001; + presetInputs.time = getTicks ( startTime ) * 0.001; #endif /** !WIN32 */ - - - //DWRITE ( "frame: %d\ttime: %f\tprogress: %f\tavgtime: %d\tang: %f\trot: %f\n", - // this->presetInputs.frame, presetInputs.time, this->presetInputs.progress, this->avgtime, this->presetInputs.ang_per_pixel, - //this->presetOutputs.rot ); + + + //DWRITE ( "frame: %d\ttime: %f\tprogress: %f\tavgtime: %d\tang: %f\trot: %f\n", + // this->presetInputs.frame, presetInputs.time, this->presetInputs.progress, this->avgtime, this->presetInputs.ang_per_pixel, + //this->presetOutputs.rot ); // printf("start:%d at:%d min:%d stop:%d on:%d %d\n",startframe, frame frame-startframe,avgtime, noSwitch,progress); - presetInputs.ResetMesh(); + presetInputs.ResetMesh(); // printf("%f %d\n",Time,frame); - beatDetect->detectFromSamples(); - - DWRITE ( "=== vol: %f\tbass: %f\tmid: %f\ttreb: %f ===\n", - beatDetect->vol,beatDetect->bass,beatDetect->mid,beatDetect->treb ); - DWRITE ( "=== bass_att: %f ===\n", + beatDetect->detectFromSamples(); + + DWRITE ( "=== vol: %f\tbass: %f\tmid: %f\ttreb: %f ===\n", + beatDetect->vol,beatDetect->bass,beatDetect->mid,beatDetect->treb ); + DWRITE ( "=== bass_att: %f ===\n", beatDetect->bass_att ); - - presetInputs.bass = beatDetect->bass; - presetInputs.mid = beatDetect->mid; - presetInputs.treb = beatDetect->treb; - presetInputs.bass_att = beatDetect->bass_att; - presetInputs.mid_att = beatDetect->mid_att; - presetInputs.treb_att = beatDetect->treb_att; - - assert(m_activePreset.get()); + + presetInputs.bass = beatDetect->bass; + presetInputs.mid = beatDetect->mid; + presetInputs.treb = beatDetect->treb; + presetInputs.bass_att = beatDetect->bass_att; + presetInputs.mid_att = beatDetect->mid_att; + presetInputs.treb_att = beatDetect->treb_att; + + assert ( m_activePreset.get() ); m_activePreset->evaluateFrame(); - if ( renderer->noSwitch==0 && !m_presetChooser->empty()) + if ( renderer->noSwitch==false && !m_presetChooser->empty() ) { - if ( presetInputs.progress>1.0 ) - { - oldFrame = presetInputs.frame; - presetInputs.progress=0.0; - presetInputs.frame = 1; + if ( presetInputs.progress>1.0 ) + { + oldFrame = presetInputs.frame; + presetInputs.progress=0.0; + presetInputs.frame = 1; - *m_presetPos = m_presetChooser->weightedRandom(); + *m_presetPos = m_presetChooser->weightedRandom(); - m_activePreset2 = m_presetPos->allocate - (presetInputs, &m_activePreset->presetOutputs() == &presetOutputs ? presetOutputs2 : presetOutputs); + m_activePreset2 = m_presetPos->allocate + ( presetInputs, &m_activePreset->presetOutputs() == &presetOutputs ? presetOutputs2 : presetOutputs ); - assert(m_activePreset2.get()); - renderer->setPresetName(m_activePreset2->presetName()); - - //nohard=(int)(presetInputs.fps*3.5); - smoothFrame = (int)(presetInputs.fps * smoothDuration); - + assert ( m_activePreset2.get() ); + renderer->setPresetName ( m_activePreset2->presetName() ); + + //nohard=(int)(presetInputs.fps*3.5); + smoothFrame = ( int ) ( presetInputs.fps * smoothDuration ); + presetSwitchedEvent(false, **m_presetPos); // printf("SOFT CUT - Smooth started\n"); - } - else if ( ( beatDetect->vol-beatDetect->vol_old>beatDetect->beat_sensitivity ) && nohard<0) - { - // printf("%f %d %d\n", beatDetect->bass-beatDetect->bass_old,this->frame,this->avgtime); - *m_presetPos = m_presetChooser->weightedRandom (); - - m_activePreset = m_presetPos->allocate(presetInputs, presetOutputs); - renderer->setPresetName(m_activePreset->presetName()); - - assert(m_activePreset.get()); - //nohard=presetInputs.fps*1; - smoothFrame=0; - presetInputs.progress=0.0; - presetInputs.frame = 1; - } - else nohard--; + } + else if ( ( beatDetect->vol-beatDetect->vol_old>beatDetect->beat_sensitivity ) && nohard<0 ) + { + // printf("%f %d %d\n", beatDetect->bass-beatDetect->bass_old,this->frame,this->avgtime); + *m_presetPos = m_presetChooser->weightedRandom (); + + m_activePreset = m_presetPos->allocate ( presetInputs, presetOutputs ); + renderer->setPresetName ( m_activePreset->presetName() ); + + assert ( m_activePreset.get() ); + //nohard=presetInputs.fps*1; + smoothFrame=0; + presetInputs.progress=0.0; + presetInputs.frame = 1; + presetSwitchedEvent(true, **m_presetPos); + } + else nohard--; } - - if (smoothFrame > 1 && !m_presetChooser->empty()) - { - int frame = ++presetInputs.frame; - presetInputs.frame = ++oldFrame; - presetInputs.progress= 1.0; - assert(m_activePreset.get()); - m_activePreset->evaluateFrame(); - renderer->PerPixelMath(&m_activePreset->presetOutputs(), &presetInputs); - renderer->WaveformMath(&m_activePreset->presetOutputs(), &presetInputs, true); - presetInputs.frame = frame; - presetInputs.progress= frame /(float) avgtime; - assert(m_activePreset2.get()); - m_activePreset2->evaluateFrame(); - renderer->PerPixelMath(&m_activePreset2->presetOutputs(), &presetInputs); - renderer->WaveformMath(&m_activePreset2->presetOutputs(), &presetInputs, true); - - //double pos = -((smoothFrame / (presetInputs.fps * smoothDuration))-1); - //double ratio = 1/(1 + exp((pos-0.5)*4*M_PI)); - double ratio = smoothFrame / (presetInputs.fps * smoothDuration); - // printf("f(%f)=%f\n",pos, ratio); - PresetMerger::MergePresets(m_activePreset->presetOutputs(),m_activePreset2->presetOutputs(),ratio,presetInputs.gx, presetInputs.gy); + if ( smoothFrame > 1 && !m_presetChooser->empty() ) + { + int frame = ++presetInputs.frame; + presetInputs.frame = ++oldFrame; + presetInputs.progress= 1.0; + assert ( m_activePreset.get() ); + m_activePreset->evaluateFrame(); + renderer->PerPixelMath ( &m_activePreset->presetOutputs(), &presetInputs ); + renderer->WaveformMath ( &m_activePreset->presetOutputs(), &presetInputs, true ); - //printf("Smooth:%d\n",smoothFrame); + presetInputs.frame = frame; + presetInputs.progress= frame / ( float ) avgtime; + assert ( m_activePreset2.get() ); + m_activePreset2->evaluateFrame(); + renderer->PerPixelMath ( &m_activePreset2->presetOutputs(), &presetInputs ); + renderer->WaveformMath ( &m_activePreset2->presetOutputs(), &presetInputs, true ); - smoothFrame--; - - } + //double pos = -((smoothFrame / (presetInputs.fps * smoothDuration))-1); + //double ratio = 1/(1 + exp((pos-0.5)*4*M_PI)); + double ratio = smoothFrame / ( presetInputs.fps * smoothDuration ); + // printf("f(%f)=%f\n",pos, ratio); + PresetMerger::MergePresets ( m_activePreset->presetOutputs(),m_activePreset2->presetOutputs(),ratio,presetInputs.gx, presetInputs.gy ); + + //printf("Smooth:%d\n",smoothFrame); + + smoothFrame--; + + } else - { - if (smoothFrame == 1) - { - m_activePreset = m_activePreset2; - smoothFrame=0; + { + if ( smoothFrame == 1 ) + { + m_activePreset = m_activePreset2; + smoothFrame=0; // printf("Smooth Finished\n"); - } - - presetInputs.frame++; //number of frames for current preset - presetInputs.progress= presetInputs.frame/ ( float ) avgtime; - m_activePreset->evaluateFrame(); + } - renderer->PerPixelMath(&m_activePreset->presetOutputs(), &presetInputs); - renderer->WaveformMath(&m_activePreset->presetOutputs(), &presetInputs, false); + presetInputs.frame++; //number of frames for current preset + presetInputs.progress= presetInputs.frame/ ( float ) avgtime; + m_activePreset->evaluateFrame(); + + renderer->PerPixelMath ( &m_activePreset->presetOutputs(), &presetInputs ); + renderer->WaveformMath ( &m_activePreset->presetOutputs(), &presetInputs, false ); + + } - } - // std::cout<< m_activePreset->absoluteFilePath()<presetName = m_activePreset->absoluteFilePath(); @@ -304,13 +308,13 @@ DLLEXPORT void projectM::renderFrame() } void projectM::projectM_reset() -{ +{ /** Default variable settings */ - + this->wvw = 512; this->wvh = 512; - + /** Frames per preset */ this->avgtime = 500; @@ -328,7 +332,7 @@ void projectM::projectM_reset() projectM_resetengine(); } - void projectM::projectM_init ( int gx, int gy, int fps, int texsize, int width, int height ) +void projectM::projectM_init ( int gx, int gy, int fps, int texsize, int width, int height ) { /** Initialise engine variables */ @@ -348,7 +352,7 @@ void projectM::projectM_reset() #endif /** !WIN32 */ /** Nullify frame stash */ - + /** Initialise per-pixel matrix calculations */ @@ -356,10 +360,10 @@ void projectM::projectM_reset() presetInputs.fps = fps; this->nohard=fps*5; /** We need to initialise this before the builtin param db otherwise bass/mid etc won't bind correctly */ - assert(!beatDetect); + assert ( !beatDetect ); pcm = new PCM(); - beatDetect = new BeatDetect(pcm); + beatDetect = new BeatDetect ( pcm ); initPresetTools(); #if 0 @@ -474,23 +478,23 @@ void projectM::projectM_reset() #endif #endif - if (presetInputs.fps > 0) - mspf= ( int ) ( 1000.0/ ( float ) presetInputs.fps ); + if ( presetInputs.fps > 0 ) + mspf= ( int ) ( 1000.0/ ( float ) presetInputs.fps ); else mspf = 0; - this->avgtime=(int)(this->presetInputs.fps*presetDuration); + this->avgtime= ( int ) ( this->presetInputs.fps*presetDuration ); + - this->presetInputs.gx = gx; this->presetInputs.gy = gy; - this->renderer = new Renderer ( width, height, gx, gy, texsize, beatDetect, presetURL, title_fontURL, menu_fontURL); + this->renderer = new Renderer ( width, height, gx, gy, texsize, beatDetect, presetURL, title_fontURL, menu_fontURL ); - renderer->setPresetName(m_activePreset->presetName()); + renderer->setPresetName ( m_activePreset->presetName() ); // printf ( "exiting projectM_init()\n" ); } @@ -737,12 +741,12 @@ DLLEXPORT void projectM::projectM_resetGL ( int w, int h ) /** Sets the title to display */ DLLEXPORT void projectM::projectM_setTitle ( std::string title ) -{ - if (title != renderer->title) - { - renderer->title=title; - renderer->drawtitle=1; - } +{ + if ( title != renderer->title ) + { + renderer->title=title; + renderer->drawtitle=1; + } } @@ -758,7 +762,7 @@ int projectM::initPresetTools() /* Set the seed to the current time in seconds */ srand ( time ( NULL ) ); - if ( ( m_presetLoader = new PresetLoader (presetURL)) == 0 ) + if ( ( m_presetLoader = new PresetLoader ( presetURL ) ) == 0 ) { m_presetLoader = 0; std::cerr << "[projectM] error allocating preset loader" << std::endl; @@ -778,19 +782,19 @@ int projectM::initPresetTools() // Start the iterator m_presetPos = new PresetIterator(); - + // Start at end ptr- this allows next/previous to easily be done from this position. *m_presetPos = m_presetChooser->end(); - + // Load idle preset //std::cerr << "[projectM] Allocating idle preset..." << std::endl; - m_activePreset = IdlePreset::allocate(presetInputs, presetOutputs); + m_activePreset = IdlePreset::allocate ( presetInputs, presetOutputs ); // Case where no valid presets exist in directory - if (m_presetChooser->empty()) + if ( m_presetChooser->empty() ) { std::cerr << "[projectM] warning: no valid files found in preset directory \"" - << m_presetLoader->directoryName() << "\"" << std::endl; + << m_presetLoader->directoryName() << "\"" << std::endl; } //std::cerr << "[projectM] Idle preset allocated." << std::endl; @@ -804,9 +808,9 @@ int projectM::initPresetTools() void projectM::destroyPresetTools() { - if (m_presetPos) - delete(m_presetPos); - + if ( m_presetPos ) + delete ( m_presetPos ); + /// @slow might not be necessary m_presetPos = 0; @@ -818,7 +822,7 @@ void projectM::destroyPresetTools() if ( m_presetLoader ) delete ( m_presetLoader ); - + /// @slow might not be necessary m_presetLoader = 0; @@ -827,24 +831,60 @@ void projectM::destroyPresetTools() } -int projectM::addPresetURL(const std::string & presetURL) { - return m_presetLoader->addPresetURL(presetURL); +void projectM::queuePreset(unsigned int index) { +// m_presetQueueIndex = index; } -void projectM::selectPreset(unsigned int index) { +void projectM::removePreset(unsigned int index) { + m_presetLoader->removePreset(index); +} - if (m_presetChooser->empty()) +unsigned int projectM::addPresetURL ( const std::string & presetURL, const std::string & presetName ) +{ + return m_presetLoader->addPresetURL ( presetURL, presetName ); +} + +void projectM::selectPreset ( unsigned int index ) +{ + + if ( m_presetChooser->empty() ) return; - - assert (index < m_presetLoader->getNumPresets()); - assert (index >= 0); - *m_presetPos = m_presetChooser->begin(index); + assert ( index < m_presetLoader->getNumPresets() ); + assert ( index >= 0 ); - m_activePreset = m_presetPos->allocate(presetInputs, presetOutputs); + *m_presetPos = m_presetChooser->begin ( index ); - renderer->setPresetName(m_activePreset->presetName()); + m_activePreset = m_presetPos->allocate ( presetInputs, presetOutputs ); - presetInputs.frame = 0; - smoothFrame = 0; + renderer->setPresetName ( m_activePreset->presetName() ); + + presetInputs.frame = 0; + smoothFrame = 0; +} + +void projectM::setPresetLock ( bool isLocked ) +{ + renderer->noSwitch = isLocked; +} + +bool projectM::isPresetLocked() const +{ + return renderer->noSwitch; +} + +std::string projectM::getPresetURL ( unsigned int index ) const +{ + return m_presetLoader->getPresetURL(index); +} + + +std::string projectM::getPresetName ( unsigned int index ) const +{ + return m_presetLoader->getPresetName(index); +} + +unsigned int projectM::getPlayListSize() const +{ + return m_presetLoader->getNumPresets(); } diff --git a/src/projectM-engine/projectM.hpp b/src/projectM-engine/projectM.hpp index 4785f3437..a63351ee0 100755 --- a/src/projectM-engine/projectM.hpp +++ b/src/projectM-engine/projectM.hpp @@ -123,12 +123,39 @@ public: DLLEXPORT void key_handler( projectMEvent event, projectMKeycode keycode, projectMModifier modifier ); - ~projectM(); - + virtual ~projectM(); - int addPresetURL(const std::string & presetURL); + /// Plays a preset immediately void selectPreset(unsigned int index); + /// Removes a preset from the play list. If it is playing then it will continue as normal until next switch + void removePreset(unsigned int index); + + /// Tell projectM to play a particular preset when it chooses to switch + /// If the preset is locked the queued item will be not switched to until the lock is released + void queuePreset(unsigned int index); + + /// Turn on or off a lock that prevents projectM from switching to another preset + void setPresetLock(bool isLocked); + + /// Returns true if the active preset is locked + bool isPresetLocked() const; + + /// Add a preset url to the play list. Appended to bottom + unsigned int addPresetURL(const std::string & presetURL, const std::string & presetName); + + /// Returns the url associated with a preset index + std::string getPresetURL(unsigned int index) const; + + /// Returns the preset name associated with a preset index + std::string getPresetName ( unsigned int index ) const; + + /// Returns the size of the play list + unsigned int getPlayListSize() const; + + /// Occurs when active preset has switched. Switched to index is returned + virtual void presetSwitchedEvent(bool isHardCut, unsigned int index) const {}; + private: BeatDetect * beatDetect; diff --git a/src/qprojectM-jack/AUTHORS b/src/qprojectM-jack/AUTHORS new file mode 100644 index 000000000..e69de29bb diff --git a/src/qprojectM-jack/CMakeLists.txt b/src/qprojectM-jack/CMakeLists.txt new file mode 100644 index 000000000..0a9f5ad59 --- /dev/null +++ b/src/qprojectM-jack/CMakeLists.txt @@ -0,0 +1,42 @@ +PROJECT(qprojectM-jack) + +set(QT_USE_OPENGL TRUE) + +include(${QT_USE_FILE} FindPkgConfig.cmake) + +FIND_PACKAGE(OpenGL) +FIND_PACKAGE(Qt4 REQUIRED) + +# could be wrong +pkg_search_module(PROJECTM REQUIRED projectM qprojectM) + +pkg_search_module(JACK REQUIRED jack) + + +# the variable "qprojectM_SRCS" contains all .cpp files of this project +set(qprojectM_jack_SRCS + qprojectM-jack.cpp ConfigFile.h ConfigFile.cpp +) + +set(qprojectM_jack_MOC_HDRS + +) + + +# After this call, foo_MOC_SRCS = moc_Class1.cxx moc_Class2.cxx moc_Class3.cxx. +qt4_wrap_cpp(qprojectM_jack_MOC_SRCS ${qprojectM_MOC_HDRS}) + + +ADD_DEFINITIONS(-DLINUX -DPROJECTM_PREFIX='"${PROJECTM_PREFIX}"') +ADD_DEFINITIONS(${QT_DEFINITIONS}) +ADD_DEFINITIONS(-DQT_NO_DEBUG) + +INCLUDE_DIRECTORIES(${PROJECTM_INCLUDEDIR} ${JACK_INCLUDEDIR} ${SDL_INCLUDE_DIR} ${GTK_INCLUDE_DIR} ${QT_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTOPENGL_INCLUDE_DIR}) + +LINK_DIRECTORIES(${PROJECTM_LDFLAGS} ${JACK_LDFLAGS}) + +ADD_EXECUTABLE(qprojectM-jack ${qprojectM_jack_SRCS} ${qprojectM_jack_MOC_SRCS}) + +TARGET_LINK_LIBRARIES(qprojectM-jack qprojectM projectM jack ${QT_QTGUI_LIBRARIES} ${QT_QTOPENGL_LIBRARIES} ${QT_LIBRARIES}) + +INSTALL(TARGETS qprojectM-jack DESTINATION ${CMAKE_INSTALL_PREFIX}/bin ) \ No newline at end of file diff --git a/src/qprojectM-jack/COPYING b/src/qprojectM-jack/COPYING new file mode 100644 index 000000000..d60c31a97 --- /dev/null +++ b/src/qprojectM-jack/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/src/qprojectM-jack/ChangeLog b/src/qprojectM-jack/ChangeLog new file mode 100644 index 000000000..c80c00a49 --- /dev/null +++ b/src/qprojectM-jack/ChangeLog @@ -0,0 +1 @@ +10/10/2007 FIRST RELEASE! \ No newline at end of file diff --git a/src/qprojectM-jack/ConfigFile.cpp b/src/qprojectM-jack/ConfigFile.cpp new file mode 100644 index 000000000..f041064e5 --- /dev/null +++ b/src/qprojectM-jack/ConfigFile.cpp @@ -0,0 +1,142 @@ +// ConfigFile.cpp + +#include "ConfigFile.h" + +using std::string; + +ConfigFile::ConfigFile( string filename, string delimiter, + string comment, string sentry ) + : myDelimiter(delimiter), myComment(comment), mySentry(sentry) +{ + // Construct a ConfigFile, getting keys and values from given file + + std::ifstream in( filename.c_str() ); + + if( !in ) throw file_not_found( filename ); + + in >> (*this); +} + + +ConfigFile::ConfigFile() + : myDelimiter( string(1,'=') ), myComment( string(1,'#') ) +{ + // Construct a ConfigFile without a file; empty +} + + +void ConfigFile::remove( const string& key ) +{ + // Remove key and its value + myContents.erase( myContents.find( key ) ); + return; +} + + +bool ConfigFile::keyExists( const string& key ) const +{ + // Indicate whether key is found + mapci p = myContents.find( key ); + return ( p != myContents.end() ); +} + + +/* static */ +void ConfigFile::trim( string& s ) +{ + // Remove leading and trailing whitespace + static const char whitespace[] = " \n\t\v\r\f"; + s.erase( 0, s.find_first_not_of(whitespace) ); + s.erase( s.find_last_not_of(whitespace) + 1U ); +} + + +std::ostream& operator<<( std::ostream& os, const ConfigFile& cf ) +{ + // Save a ConfigFile to os + for( ConfigFile::mapci p = cf.myContents.begin(); + p != cf.myContents.end(); + ++p ) + { + os << p->first << " " << cf.myDelimiter << " "; + os << p->second << std::endl; + } + return os; +} + + +std::istream& operator>>( std::istream& is, ConfigFile& cf ) +{ + // Load a ConfigFile from is + // Read in keys and values, keeping internal whitespace + typedef string::size_type pos; + const string& delim = cf.myDelimiter; // separator + const string& comm = cf.myComment; // comment + const string& sentry = cf.mySentry; // end of file sentry + const pos skip = delim.length(); // length of separator + + string nextline = ""; // might need to read ahead to see where value ends + + while( is || nextline.length() > 0 ) + { + // Read an entire line at a time + string line; + if( nextline.length() > 0 ) + { + line = nextline; // we read ahead; use it now + nextline = ""; + } + else + { + std::getline( is, line ); + } + + // Ignore comments + line = line.substr( 0, line.find(comm) ); + + // Check for end of file sentry + if( sentry != "" && line.find(sentry) != string::npos ) return is; + + // Parse the line if it contains a delimiter + pos delimPos = line.find( delim ); + if( delimPos < string::npos ) + { + // Extract the key + string key = line.substr( 0, delimPos ); + line.replace( 0, delimPos+skip, "" ); + + // See if value continues on the next line + // Stop at blank line, next line with a key, end of stream, + // or end of file sentry + bool terminate = false; + while( !terminate && is ) + { + std::getline( is, nextline ); + terminate = true; + + string nlcopy = nextline; + ConfigFile::trim(nlcopy); + if( nlcopy == "" ) continue; + + nextline = nextline.substr( 0, nextline.find(comm) ); + if( nextline.find(delim) != string::npos ) + continue; + if( sentry != "" && nextline.find(sentry) != string::npos ) + continue; + + nlcopy = nextline; + ConfigFile::trim(nlcopy); + if( nlcopy != "" ) line += "\n"; + line += nextline; + terminate = false; + } + + // Store key and value + ConfigFile::trim(key); + ConfigFile::trim(line); + cf.myContents[key] = line; // overwrites if key is repeated + } + } + + return is; +} diff --git a/src/qprojectM-jack/ConfigFile.h b/src/qprojectM-jack/ConfigFile.h new file mode 100644 index 000000000..c2f002447 --- /dev/null +++ b/src/qprojectM-jack/ConfigFile.h @@ -0,0 +1,253 @@ +// ConfigFile.h +// Class for reading named values from configuration files +// Richard J. Wagner v2.1 24 May 2004 wagnerr@umich.edu + +// Copyright (c) 2004 Richard J. Wagner +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. + +// Typical usage +// ------------- +// +// Given a configuration file "settings.inp": +// atoms = 25 +// length = 8.0 # nanometers +// name = Reece Surcher +// +// Named values are read in various ways, with or without default values: +// ConfigFile config( "settings.inp" ); +// int atoms = config.read( "atoms" ); +// double length = config.read( "length", 10.0 ); +// string author, title; +// config.readInto( author, "name" ); +// config.readInto( title, "title", string("Untitled") ); +// +// See file example.cpp for more examples. + +#ifndef CONFIGFILE_H +#define CONFIGFILE_H + +#include +#include +#include +#include +#include + +using std::string; + +class ConfigFile { +// Data +protected: + string myDelimiter; // separator between key and value + string myComment; // separator between value and comments + string mySentry; // optional string to signal end of file + std::map myContents; // extracted keys and values + + typedef std::map::iterator mapi; + typedef std::map::const_iterator mapci; + +// Methods +public: + ConfigFile( string filename, + string delimiter = "=", + string comment = "#", + string sentry = "EndConfigFile" ); + ConfigFile(); + + // Search for key and read value or optional default value + template T read( const string& key ) const; // call as read + template T read( const string& key, const T& value ) const; + template bool readInto( T& var, const string& key ) const; + template + bool readInto( T& var, const string& key, const T& value ) const; + + // Modify keys and values + template void add( string key, const T& value ); + void remove( const string& key ); + + // Check whether key exists in configuration + bool keyExists( const string& key ) const; + + // Check or change configuration syntax + string getDelimiter() const { return myDelimiter; } + string getComment() const { return myComment; } + string getSentry() const { return mySentry; } + string setDelimiter( const string& s ) + { string old = myDelimiter; myDelimiter = s; return old; } + string setComment( const string& s ) + { string old = myComment; myComment = s; return old; } + + // Write or read configuration + friend std::ostream& operator<<( std::ostream& os, const ConfigFile& cf ); + friend std::istream& operator>>( std::istream& is, ConfigFile& cf ); + +protected: + template static string T_as_string( const T& t ); + template static T string_as_T( const string& s ); + static void trim( string& s ); + + +// Exception types +public: + struct file_not_found { + string filename; + file_not_found( const string& filename_ = string() ) + : filename(filename_) {} }; + struct key_not_found { // thrown only by T read(key) variant of read() + string key; + key_not_found( const string& key_ = string() ) + : key(key_) {} }; +}; + + +/* static */ +template +string ConfigFile::T_as_string( const T& t ) +{ + // Convert from a T to a string + // Type T must support << operator + std::ostringstream ost; + ost << t; + return ost.str(); +} + + +/* static */ +template +T ConfigFile::string_as_T( const string& s ) +{ + // Convert from a string to a T + // Type T must support >> operator + T t; + std::istringstream ist(s); + ist >> t; + return t; +} + + +/* static */ +template<> +inline string ConfigFile::string_as_T( const string& s ) +{ + // Convert from a string to a string + // In other words, do nothing + return s; +} + + +/* static */ +template<> +inline bool ConfigFile::string_as_T( const string& s ) +{ + // Convert from a string to a bool + // Interpret "false", "F", "no", "n", "0" as false + // Interpret "true", "T", "yes", "y", "1", "-1", or anything else as true + bool b = true; + string sup = s; + for( string::iterator p = sup.begin(); p != sup.end(); ++p ) + *p = toupper(*p); // make string all caps + if( sup==string("FALSE") || sup==string("F") || + sup==string("NO") || sup==string("N") || + sup==string("0") || sup==string("NONE") ) + b = false; + return b; +} + + +template +T ConfigFile::read( const string& key ) const +{ + // Read the value corresponding to key + mapci p = myContents.find(key); + if( p == myContents.end() ) throw key_not_found(key); + return string_as_T( p->second ); +} + + +template +T ConfigFile::read( const string& key, const T& value ) const +{ + // Return the value corresponding to key or given default value + // if key is not found + mapci p = myContents.find(key); + if( p == myContents.end() ) return value; + return string_as_T( p->second ); +} + + +template +bool ConfigFile::readInto( T& var, const string& key ) const +{ + // Get the value corresponding to key and store in var + // Return true if key is found + // Otherwise leave var untouched + mapci p = myContents.find(key); + bool found = ( p != myContents.end() ); + if( found ) var = string_as_T( p->second ); + return found; +} + + +template +bool ConfigFile::readInto( T& var, const string& key, const T& value ) const +{ + // Get the value corresponding to key and store in var + // Return true if key is found + // Otherwise set var to given default + mapci p = myContents.find(key); + bool found = ( p != myContents.end() ); + if( found ) + var = string_as_T( p->second ); + else + var = value; + return found; +} + + +template +void ConfigFile::add( string key, const T& value ) +{ + // Add a key with given value + string v = T_as_string( value ); + trim(key); + trim(v); + myContents[key] = v; + return; +} + +#endif // CONFIGFILE_H + +// Release notes: +// v1.0 21 May 1999 +// + First release +// + Template read() access only through non-member readConfigFile() +// + ConfigurationFileBool is only built-in helper class +// +// v2.0 3 May 2002 +// + Shortened name from ConfigurationFile to ConfigFile +// + Implemented template member functions +// + Changed default comment separator from % to # +// + Enabled reading of multiple-line values +// +// v2.1 24 May 2004 +// + Made template specializations inline to avoid compiler-dependent linkage +// + Allowed comments within multiple-line values +// + Enabled blank line termination for multiple-line values +// + Added optional sentry to detect end of configuration file +// + Rewrote messy trimWhitespace() function as elegant trim() diff --git a/src/qprojectM-jack/FindPkgConfig.cmake b/src/qprojectM-jack/FindPkgConfig.cmake new file mode 100644 index 000000000..afae15cb0 --- /dev/null +++ b/src/qprojectM-jack/FindPkgConfig.cmake @@ -0,0 +1,360 @@ +# - a pkg-config module for CMake +# +# Usage: +# pkg_check_modules( [REQUIRED] []*) +# checks for all the given modules +# +# pkg_search_module( [REQUIRED] []*) +# checks for given modules and uses the first working one +# +# When the 'REQUIRED' argument was set, macros will fail with an error +# when module(s) could not be found +# +# It sets the following variables: +# PKG_CONFIG_FOUND ... true iff pkg-config works on the system +# PKG_CONFIG_EXECUTABLE ... pathname of the pkg-config program +# _FOUND ... set to 1 iff module(s) exist +# +# For the following variables two sets of values exist; first one is the +# common one and has the given PREFIX. The second set contains flags +# which are given out when pkgconfig was called with the '--static' +# option. +# _LIBRARIES ... only the libraries (w/o the '-l') +# _LIBRARY_DIRS ... the paths of the libraries (w/o the '-L') +# _LDFLAGS ... all required linker flags +# _LDFLAGS_OTHERS ... all other linker flags +# _INCLUDE_DIRS ... the '-I' preprocessor flags (w/o the '-I') +# _CFLAGS ... all required cflags +# _CFLAGS_OTHERS ... the other compiler flags +# +# = for common case +# = _STATIC for static linking +# +# There are some special variables whose prefix depends on the count +# of given modules. When there is only one module, stays +# unchanged. When there are multiple modules, the prefix will be +# changed to _: +# _VERSION ... version of the module +# _PREFIX ... prefix-directory of the module +# _INCLUDEDIR ... include-dir of the module +# _LIBDIR ... lib-dir of the module +# +# = when |MODULES| == 1, else +# = _ +# +# A parameter can have the following formats: +# {MODNAME} ... matches any version +# {MODNAME}>={VERSION} ... at least version is required +# {MODNAME}={VERSION} ... exactly version is required +# {MODNAME}<={VERSION} ... modules must not be newer than +# +# Examples +# pkg_check_modules (GLIB2 glib-2.0) +# +# pkg_check_modules (GLIB2 glib-2.0>=2.10) +# requires at least version 2.10 of glib2 and defines e.g. +# GLIB2_VERSION=2.10.3 +# +# pkg_check_modules (FOO glib-2.0>=2.10 gtk+-2.0) +# requires both glib2 and gtk2, and defines e.g. +# FOO_glib-2.0_VERSION=2.10.3 +# FOO_gtk+-2.0_VERSION=2.8.20 +# +# pkg_check_modules (XRENDER REQUIRED xrender) +# defines e.g.: +# XRENDER_LIBRARIES=Xrender;X11 +# XRENDER_STATIC_LIBRARIES=Xrender;X11;pthread;Xau;Xdmcp +# +# pkg_search_module (BAR libxml-2.0 libxml2 libxml>=2) + + +# Copyright (C) 2006 Enrico Scholz +# +# Redistribution and use, with or without modification, are permitted +# provided that the following conditions are met: +# +# 1. Redistributions must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# 2. The name of the author may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +### Common stuff #### +set(PKG_CONFIG_VERSION 1) +set(PKG_CONFIG_FOUND 0) + +find_program(PKG_CONFIG_EXECUTABLE NAMES pkg-config DOC "pkg-config executable") +mark_as_advanced(PKG_CONFIG_EXECUTABLE) + +if(PKG_CONFIG_EXECUTABLE) + set(PKG_CONFIG_FOUND 1) +endif(PKG_CONFIG_EXECUTABLE) + + +# Unsets the given variables +macro(_pkgconfig_unset var) + set(${var} "" CACHE INTERNAL "") +endmacro(_pkgconfig_unset) + +macro(_pkgconfig_set var value) + set(${var} ${value} CACHE INTERNAL "") +endmacro(_pkgconfig_set) + +# Invokes pkgconfig, cleans up the result and sets variables +macro(_pkgconfig_invoke _pkglist _prefix _varname _regexp) + set(_pkgconfig_invoke_result) + + execute_process( + COMMAND ${PKG_CONFIG_EXECUTABLE} ${ARGN} ${_pkglist} + OUTPUT_VARIABLE _pkgconfig_invoke_result + RESULT_VARIABLE _pkgconfig_failed) + + if (_pkgconfig_failed) + set(_pkgconfig_${_varname} "") + _pkgconfig_unset(${_prefix}_${_varname}) + else(_pkgconfig_failed) + string(REGEX REPLACE "[\r\n]" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") + string(REGEX REPLACE " +$" "" _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") + + if (NOT ${_regexp} STREQUAL "") + string(REGEX REPLACE "${_regexp}" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") + endif(NOT ${_regexp} STREQUAL "") + + separate_arguments(_pkgconfig_invoke_result) + + #message(STATUS " ${_varname} ... ${_pkgconfig_invoke_result}") + set(_pkgconfig_${_varname} ${_pkgconfig_invoke_result}) + _pkgconfig_set(${_prefix}_${_varname} "${_pkgconfig_invoke_result}") + endif(_pkgconfig_failed) +endmacro(_pkgconfig_invoke) + +# Invokes pkgconfig two times; once without '--static' and once with +# '--static' +macro(_pkgconfig_invoke_dyn _pkglist _prefix _varname cleanup_regexp) + _pkgconfig_invoke("${_pkglist}" ${_prefix} ${_varname} "${cleanup_regexp}" ${ARGN}) + _pkgconfig_invoke("${_pkglist}" ${_prefix} STATIC_${_varname} "${cleanup_regexp}" --static ${ARGN}) +endmacro(_pkgconfig_invoke_dyn) + +# Splits given arguments into options and a package list +macro(_pkgconfig_parse_options _result _is_req) + set(${_is_req} 0) + + foreach(_pkg ${ARGN}) + if (_pkg STREQUAL "REQUIRED") + set(${_is_req} 1) + endif (_pkg STREQUAL "REQUIRED") + endforeach(_pkg ${ARGN}) + + set(${_result} ${ARGN}) + list(REMOVE_ITEM ${_result} "REQUIRED") +endmacro(_pkgconfig_parse_options) + +### +macro(_pkg_check_modules_internal _is_required _is_silent _prefix) + _pkgconfig_unset(${_prefix}_FOUND) + _pkgconfig_unset(${_prefix}_VERSION) + _pkgconfig_unset(${_prefix}_PREFIX) + _pkgconfig_unset(${_prefix}_INCLUDEDIR) + _pkgconfig_unset(${_prefix}_LIBDIR) + _pkgconfig_unset(${_prefix}_LIBS) + _pkgconfig_unset(${_prefix}_LIBS_L) + _pkgconfig_unset(${_prefix}_LIBS_PATHS) + _pkgconfig_unset(${_prefix}_LIBS_OTHER) + _pkgconfig_unset(${_prefix}_CFLAGS) + _pkgconfig_unset(${_prefix}_CFLAGS_I) + _pkgconfig_unset(${_prefix}_CFLAGS_OTHER) + _pkgconfig_unset(${_prefix}_STATIC_LIBDIR) + _pkgconfig_unset(${_prefix}_STATIC_LIBS) + _pkgconfig_unset(${_prefix}_STATIC_LIBS_L) + _pkgconfig_unset(${_prefix}_STATIC_LIBS_PATHS) + _pkgconfig_unset(${_prefix}_STATIC_LIBS_OTHER) + _pkgconfig_unset(${_prefix}_STATIC_CFLAGS) + _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_I) + _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_OTHER) + + # create a better addressable variable of the modules and calculate its size + set(_pkg_check_modules_list ${ARGN}) + list(LENGTH _pkg_check_modules_list _pkg_check_modules_cnt) + + if(PKG_CONFIG_EXECUTABLE) + # give out status message telling checked module + if (NOT ${_is_silent}) + if (_pkg_check_modules_cnt EQUAL 1) + message(STATUS "checking for module '${_pkg_check_modules_list}'") + else(_pkg_check_modules_cnt EQUAL 1) + message(STATUS "checking for modules '${_pkg_check_modules_list}'") + endif(_pkg_check_modules_cnt EQUAL 1) + endif(NOT ${_is_silent}) + + set(_pkg_check_modules_packages) + set(_pkg_check_modules_failed) + + # iterate through module list and check whether they exist and match the required version + foreach (_pkg_check_modules_pkg ${_pkg_check_modules_list}) + set(_pkg_check_modules_exist_query) + + # check whether version is given + if (_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") + string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\1" _pkg_check_modules_pkg_name "${_pkg_check_modules_pkg}") + string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\2" _pkg_check_modules_pkg_op "${_pkg_check_modules_pkg}") + string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\3" _pkg_check_modules_pkg_ver "${_pkg_check_modules_pkg}") + else(_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") + set(_pkg_check_modules_pkg_name "${_pkg_check_modules_pkg}") + set(_pkg_check_modules_pkg_op) + set(_pkg_check_modules_pkg_ver) + endif(_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") + + # handle the operands + if (_pkg_check_modules_pkg_op STREQUAL ">=") + list(APPEND _pkg_check_modules_exist_query --atleast-version) + endif(_pkg_check_modules_pkg_op STREQUAL ">=") + + if (_pkg_check_modules_pkg_op STREQUAL "=") + list(APPEND _pkg_check_modules_exist_query --exact-version) + endif(_pkg_check_modules_pkg_op STREQUAL "=") + + if (_pkg_check_modules_pkg_op STREQUAL "<=") + list(APPEND _pkg_check_modules_exist_query --max-version) + endif(_pkg_check_modules_pkg_op STREQUAL "<=") + + # create the final query which is of the format: + # * --atleast-version + # * --exact-version + # * --max-version + # * --exists + if (_pkg_check_modules_pkg_op) + list(APPEND _pkg_check_modules_exist_query "${_pkg_check_modules_pkg_ver}") + else(_pkg_check_modules_pkg_op) + list(APPEND _pkg_check_modules_exist_query --exists) + endif(_pkg_check_modules_pkg_op) + + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_VERSION) + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_PREFIX) + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_INCLUDEDIR) + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_LIBDIR) + + list(APPEND _pkg_check_modules_exist_query "${_pkg_check_modules_pkg_name}") + list(APPEND _pkg_check_modules_packages "${_pkg_check_modules_pkg_name}") + + # execute the query + execute_process( + COMMAND ${PKG_CONFIG_EXECUTABLE} ${_pkg_check_modules_exist_query} + RESULT_VARIABLE _pkgconfig_retval) + + # evaluate result and tell failures + if (_pkgconfig_retval) + if(NOT ${_is_silent}) + message(STATUS " package '${_pkg_check_modules_pkg}' not found") + endif(NOT ${_is_silent}) + + set(_pkg_check_modules_failed 1) + endif(_pkgconfig_retval) + endforeach(_pkg_check_modules_pkg) + + if(_pkg_check_modules_failed) + # fail when requested + if (${_is_required}) + message(SEND_ERROR "A required package was not found") + endif (${_is_required}) + else(_pkg_check_modules_failed) + # when we are here, we checked whether requested modules + # exist. Now, go through them and set variables + + _pkgconfig_set(${_prefix}_FOUND 1) + list(LENGTH _pkg_check_modules_packages pkg_count) + + # iterate through all modules again and set individual variables + foreach (_pkg_check_modules_pkg ${_pkg_check_modules_packages}) + # handle case when there is only one package required + if (pkg_count EQUAL 1) + set(_pkg_check_prefix "${_prefix}") + else(pkg_count EQUAL 1) + set(_pkg_check_prefix "${_prefix}_${_pkg_check_modules_pkg}") + endif(pkg_count EQUAL 1) + + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" VERSION "" --modversion ) + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" PREFIX "" --variable=prefix ) + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" INCLUDEDIR "" --variable=includedir ) + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" LIBDIR "" --variable=libdir ) + + message(STATUS " found ${_pkg_check_modules_pkg}, version ${_pkgconfig_VERSION}") + endforeach(_pkg_check_modules_pkg) + + # set variables which are combined for multiple modules + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LIBRARIES "(^| )-l" --libs-only-l ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LIBRARY_DIRS "(^| )-L" --libs-only-L ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS "" --libs ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS_OTHER "" --libs-only-other ) + + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" INCLUDE_DIRS "(^| )-I" --cflags-only-I ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS "" --cflags ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS_OTHER "" --cflags-only-other ) + endif(_pkg_check_modules_failed) + else(PKG_CONFIG_EXECUTABLE) + if (${_is_required}) + message(SEND_ERROR "pkg-config tool not found") + endif (${_is_required}) + endif(PKG_CONFIG_EXECUTABLE) +endmacro(_pkg_check_modules_internal) + +### +### User visible macros start here +### + +### +macro(pkg_check_modules _prefix _module0) + # check cached value + if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) + _pkgconfig_parse_options (_pkg_modules _pkg_is_required "${_module0}" ${ARGN}) + _pkg_check_modules_internal("${_pkg_is_required}" 0 "${_prefix}" ${_pkg_modules}) + + _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION}) + endif(NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) +endmacro(pkg_check_modules) + +### +macro(pkg_search_module _prefix _module0) + # check cached value + if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) + set(_pkg_modules_found 0) + _pkgconfig_parse_options(_pkg_modules_alt _pkg_is_required "${_module0}" ${ARGN}) + + message(STATUS "checking for one of the modules '${_pkg_modules_alt}'") + + # iterate through all modules and stop at the first working one. + foreach(_pkg_alt ${_pkg_modules_alt}) + if(NOT _pkg_modules_found) + _pkg_check_modules_internal(0 1 "${_prefix}" "${_pkg_alt}") + endif(NOT _pkg_modules_found) + + if (${_prefix}_FOUND) + set(_pkg_modules_found 1) + endif(${_prefix}_FOUND) + endforeach(_pkg_alt) + + if (NOT ${_prefix}_FOUND) + if(${_pkg_is_required}) + message(SEND_ERROR "None of the required '${_pkg_modules_alt}' found") + endif(${_pkg_is_required}) + endif(NOT ${_prefix}_FOUND) + + _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION}) + endif(NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) +endmacro(pkg_search_module) + +### Local Variables: +### mode: cmake +### End: diff --git a/src/qprojectM-jack/INSTALL b/src/qprojectM-jack/INSTALL new file mode 100644 index 000000000..7ffa23754 --- /dev/null +++ b/src/qprojectM-jack/INSTALL @@ -0,0 +1,7 @@ +First install JACK and projectM 1.0 + +cmake . -DCMAKE_BUILD_TYPE=RELEASE +make +make install + +You may need to type ccmake . and change the PREFIX if your system prefers /usr instead of /usr/local. \ No newline at end of file diff --git a/src/qprojectM-jack/NEWS b/src/qprojectM-jack/NEWS new file mode 100644 index 000000000..e69de29bb diff --git a/src/qprojectM-jack/README b/src/qprojectM-jack/README new file mode 100644 index 000000000..92be3d365 --- /dev/null +++ b/src/qprojectM-jack/README @@ -0,0 +1 @@ +see INSTALL \ No newline at end of file diff --git a/src/qprojectM-jack/depcomp b/src/qprojectM-jack/depcomp new file mode 100755 index 000000000..ca5ea4e1e --- /dev/null +++ b/src/qprojectM-jack/depcomp @@ -0,0 +1,584 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2006-10-15.18 + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 Free Software +# Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> $depfile + echo >> $depfile + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> $depfile + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` + tmpdepfile="$stripped.u" + if test "$libtool" = yes; then + "$@" -Wc,-M + else + "$@" -M + fi + stat=$? + + if test -f "$tmpdepfile"; then : + else + stripped=`echo "$stripped" | sed 's,^.*/,,'` + tmpdepfile="$stripped.u" + fi + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + + if test -f "$tmpdepfile"; then + outname="$stripped.o" + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" + sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no + for arg in "$@"; do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + "$@" || exit $? + IFS=" " + for arg + do + case "$arg" in + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/src/qprojectM-jack/missing b/src/qprojectM-jack/missing new file mode 100755 index 000000000..1c8ff7049 --- /dev/null +++ b/src/qprojectM-jack/missing @@ -0,0 +1,367 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2006-05-10.23 + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). +case $1 in + lex|yacc) + # Not GNU programs, they don't have --version. + ;; + + tar) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $1 in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/src/qprojectM-jack/qprojectM-jack.cpp b/src/qprojectM-jack/qprojectM-jack.cpp new file mode 100644 index 000000000..b084c09c3 --- /dev/null +++ b/src/qprojectM-jack/qprojectM-jack.cpp @@ -0,0 +1,333 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +#include +#include +#include +#include +#include +#include + +#include "ConfigFile.h" +#include +#include +#include +#include + +#include + +#define CONFIG_FILE "/share/projectM/config.inp" + +std::string read_config(); + +jack_port_t *input_port; +jack_client_t *client; +jack_default_audio_sample_t out[1024*1000]; + +#ifdef DEBUG +FILE *debugFile = NULL; +#endif + +volatile enum ClientState { + Init, + Run, + Exit +} client_state = Init; + + +projectM *globalPM = NULL; + +int dumpFrame = 0; +int frameNumber = 0; + +int texsize=512; +int gx=32,gy=24; +int wvw=512,wvh=512; +int fvw=1024,fvh=768; +int fps=30, fullscreen=0; + +std::string read_config() +{ + + int n; + + char num[512]; + FILE *in; + FILE *out; + + char* home; + char projectM_home[1024]; + char projectM_config[1024]; + + strcpy(projectM_config, PROJECTM_PREFIX); + strcpy(projectM_config+strlen(PROJECTM_PREFIX), CONFIG_FILE); + projectM_config[strlen(PROJECTM_PREFIX)+strlen(CONFIG_FILE)]='\0'; + printf("dir:%s \n",projectM_config); + home=getenv("HOME"); + strcpy(projectM_home, home); + strcpy(projectM_home+strlen(home), "/.projectM/config.inp"); + projectM_home[strlen(home)+strlen("/.projectM/config.inp")]='\0'; + + + if ((in = fopen(projectM_home, "r")) != 0) + { + printf("reading ~/.projectM/config.inp \n"); + fclose(in); + return std::string(projectM_home); + } + else + { + printf("trying to create ~/.projectM/config.inp \n"); + + strcpy(projectM_home, home); + strcpy(projectM_home+strlen(home), "/.projectM"); + projectM_home[strlen(home)+strlen("/.projectM")]='\0'; + mkdir(projectM_home,0755); + + strcpy(projectM_home, home); + strcpy(projectM_home+strlen(home), "/.projectM/config.inp"); + projectM_home[strlen(home)+strlen("/.projectM/config.inp")]='\0'; + + if((out = fopen(projectM_home,"w"))!=0) + { + + if ((in = fopen(projectM_config, "r")) != 0) + { + + while(fgets(num,80,in)!=NULL) + { + fputs(num,out); + } + fclose(in); + fclose(out); + + + if ((in = fopen(projectM_home, "r")) != 0) + { + printf("created ~/.projectM/config.inp successfully\n"); + fclose(in); + return std::string(projectM_home); + } + else{printf("This shouldn't happen, using implementation defualts\n");abort();} + } + else{printf("Cannot find projectM default config, using implementation defaults\n");abort();} + } + else + { + printf("Cannot create ~/.projectM/config.inp, using default config file\n"); + if ((in = fopen(projectM_config, "r")) != 0) + { printf("Successfully opened default config file\n"); + fclose(in); + return std::string(projectM_config);} + else{ printf("Using implementation defaults, your system is really messed up, I'm suprised we even got this far\n"); abort();} + + } + + } + + + abort(); +} + +int +process (jack_nframes_t nframes, void *arg) +{ + + jack_default_audio_sample_t *in; + jack_transport_state_t ts = jack_transport_query(client, NULL); + + if (ts == JackTransportRolling) { + + if (client_state == Init) + client_state = Run; + + in = (jack_default_audio_sample_t*)jack_port_get_buffer (input_port, nframes); + + //memcpy (out, in,sizeof (jack_default_audio_sample_t) * nframes); + + globalPM->pcm->addPCMfloat(in,nframes); +// printf("%x %f\n",nframes,in[128]); + + + } else if (ts == JackTransportStopped) { + + jack_transport_start(client); + if (client_state == Run) + client_state = Init; + } + + return 0; +} + +void jack_shutdown (void *arg) +{ + exit (1); +} + +int main( int argc, char **argv ) { + const char **ports; + const char *client_name; + const char *server_name = NULL; + jack_options_t options = JackNullOption; + jack_status_t status; + int i; + char projectM_data[1024]; + + // Start a new qapplication + QApplication app(argc, argv); + +std::string config_file; +config_file = read_config(); + + + QProjectM_MainWindow * mainWindow = new QProjectM_MainWindow(config_file); + mainWindow->show(); + + globalPM = mainWindow->getQProjectM(); + +/// @bug should put this in qprojectM! +#if 0 + ConfigFile config(config_file); + + int wvw = config.read( "Window Width", 512 ); + int wvh = config.read( "Window Height", 512 ); + int fullscreen = 0; + if (config.read("Fullscreen", true)) fullscreen = 1; + else fullscreen = 0; +#endif + + + //JACK INIT + //---------------------------------------------- + if (argc >= 2) { /* client name specified? */ + client_name = argv[1]; + if (argc >= 3) { /* server name specified? */ + server_name = argv[2]; + // options |= JackServerName; + } + } else { /* use basename of argv[0] */ + client_name = strrchr(argv[0], '/'); + if (client_name == 0) { + client_name = argv[0]; + } else { + client_name++; + } + } + + /* open a client connection to the JACK server */ + + client = jack_client_open (client_name, options, &status, server_name); + if (client == NULL) { + fprintf (stderr, "jack_client_open() failed, " + "status = 0x%2.0x\n", status); + if (status & JackServerFailed) { + fprintf (stderr, "Unable to connect to JACK server\n"); + } + exit (1); + } + + if (status & JackServerStarted) { + fprintf (stderr, "JACK server started\n"); + } + + if (status & JackNameNotUnique) { + client_name = jack_get_client_name(client); + fprintf (stderr, "unique name `%s' assigned\n", client_name); + } + + /* tell the JACK server to call `process()' whenever + there is work to be done. + */ + + if (jack_set_process_callback (client, process, 0)) { + std::cerr << "qprojectM-jack: failed to set process callbank!. quitting..." << std::endl; + exit(EXIT_FAILURE); + } + + /* tell the JACK server to call `jack_shutdown()' if + it ever shuts down, either entirely, or if it + just decides to stop calling us. + */ + + jack_on_shutdown (client, jack_shutdown, 0); + + /* display the current sample rate. + */ + + printf ("engine sample rate: %d\n", + jack_get_sample_rate (client)); + + /* create two ports */ + + input_port = jack_port_register (client, "input", + JACK_DEFAULT_AUDIO_TYPE, + JackPortIsInput, 0); + + if (input_port == NULL) { + fprintf(stderr, "no more JACK ports available\n"); + exit (1); + } + + /* Tell the JACK server that we are ready to roll. Our + * process() callback will start running now. */ + + //END JACK INIT ---------------------------------- + + //JACK BEGIN----------------------------- + + if (jack_activate (client)) { + fprintf (stderr, "cannot activate client"); + exit (1); + } + + /* Connect the ports. You can't do this before the client is + * activated, because we can't make connections to clients + * that aren't running. Note the confusing (but necessary) + * orientation of the driver backend ports: playback ports are + * "input" to the backend, and capture ports are "output" from + * it. + */ + + ports = jack_get_ports (client, NULL, NULL, JackPortIsOutput); + if (ports == NULL) { + fprintf(stderr, "no physical capture ports\n"); + exit (1); + } + + + i=0; + while (ports[i]!=NULL) + { + printf("Connecting to Jack port %s\n",ports[i]); + if (jack_connect (client, ports[i], jack_port_name (input_port))) { + fprintf (stderr, "cannot connect input ports\n"); + } + i++; + } + + free (ports); + + //----------------------------------END + + //return 1; + return app.exec(); +} + + diff --git a/src/qprojectM/CMakeLists.txt b/src/qprojectM/CMakeLists.txt new file mode 100644 index 000000000..45ab1a118 --- /dev/null +++ b/src/qprojectM/CMakeLists.txt @@ -0,0 +1,9 @@ +project(qprojectM) # the name of your project + +cmake_minimum_required(VERSION 2.4.0) + +find_package(Qt4 REQUIRED) # find and setup Qt4 for this project + + +# tell cmake to process CMakeLists.txt in that subdirectory +add_subdirectory(src) diff --git a/src/qprojectM/COPYING b/src/qprojectM/COPYING new file mode 100644 index 000000000..5b6e7c66c --- /dev/null +++ b/src/qprojectM/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/src/qprojectM/Doxyfile b/src/qprojectM/Doxyfile new file mode 100644 index 000000000..cb5fb031c --- /dev/null +++ b/src/qprojectM/Doxyfile @@ -0,0 +1,283 @@ +# Doxyfile 1.5.1-KDevelop + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = qgltest +PROJECT_NUMBER = 0.1 +OUTPUT_DIRECTORY = +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +USE_WINDOWS_ENCODING = NO +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = /home/carm/ +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 8 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +BUILTIN_STL_SUPPORT = NO +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = NO +FILE_VERSION_FILTER = +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = /home/carm/qgltest +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.mm \ + *.dox \ + *.py \ + *.C \ + *.CC \ + *.C++ \ + *.II \ + *.I++ \ + *.H \ + *.HH \ + *.H++ \ + *.CS \ + *.PHP \ + *.PHP3 \ + *.M \ + *.MM \ + *.PY \ + *.C \ + *.H \ + *.tlh \ + *.diff \ + *.patch \ + *.moc \ + *.xpm \ + *.dox +RECURSIVE = yes +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +REFERENCES_LINK_SOURCE = YES +USE_HTAGS = NO +VERBATIM_HEADERS = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = NO +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = YES +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = yes +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = qgltest.tag +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1024 +MAX_DOT_GRAPH_DEPTH = 1000 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/src/qprojectM/qtprojectM.kdevelop b/src/qprojectM/qtprojectM.kdevelop new file mode 100644 index 000000000..c9cbaa835 --- /dev/null +++ b/src/qprojectM/qtprojectM.kdevelop @@ -0,0 +1,225 @@ + + + + carm + carm@localhost + 0.1 + KDevTrollProject + C++ + + Qt + + + qgltest + . + false + + + kdevsubversion + + + + + + + + false + false + + + false + *.o,*.lo,CVS + false + + + + + true + 4 + 4 + ExternalDesigner + /usr/bin/qmake + /usr/bin/designer + /usr/lib/qt4 + + + + automatic_%2Fhome%2Fcarm%2FTestApp + automatic_%2Fhome%2Fcarm%2Fprojects%2FprojectM%2Ftrunk + automatic_%2Fhome%2Fcarm%2Fprojects%2FqtprojectM + automatic_%2Fhome%2Fcarm%2FqtprojectM + + + false + false + true + 250 + 400 + 250 + false + 0 + true + false + false + std=_GLIBCXX_STD;__gnu_cxx=std + false + false + false + false + false + true + true + false + .; + + + + set + m_,_ + theValue + true + true + + + false + true + Vertical + + + + + bash + bash_bugs + clanlib + fortran_bugs_gcc + gnome1 + gnustep + gtk + gtk_bugs + haskell + haskell_bugs_ghc + java_bugs_gcc + java_bugs_sun + kde2book + opengl + pascal_bugs_fp + php + php_bugs + perl + perl_bugs + python + python_bugs + qt-kdev3 + ruby + ruby_bugs + sdl + stl + sw + w3c-dom-level2-html + w3c-svg + w3c-uaag10 + wxwidgets_bugs + + + KDE Libraries (Doxygen) + + + + + + + + /usr/bin/gdb + true + false + false + + + + + + false + true + 10 + + + + + + /home/carm/projects/qtprojectM + + executable + + /home/carm/projects/qtprojectM + false + false + true + false + false + + + + src + + + true + false + 1 + false + + 0 + + + + 2 + false + true + + + + + + + + + + + + + + + + + + Doxygen Documentation Collection + qgltest.tag + + + + + qgltest + qgltest + Qgltest + QGLTEST + carm + + carm@localhost + GPL + COPYING + + 0.1 + 2007 + /home/carm/qgltest + + + + .h + .cpp + + + + + /home/carm/projects/qtprojectM/tags + + + diff --git a/src/qprojectM/qtprojectM.kdevelop.pcs b/src/qprojectM/qtprojectM.kdevelop.pcs new file mode 100644 index 0000000000000000000000000000000000000000..6f74d16d1d28cd6da299c2e3ad9bed210fbbf1d7 GIT binary patch literal 117665 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/qprojectM/qtprojectM.pro b/src/qprojectM/qtprojectM.pro new file mode 100644 index 000000000..3f6c31381 --- /dev/null +++ b/src/qprojectM/qtprojectM.pro @@ -0,0 +1,5 @@ +SUBDIRS += src +TEMPLATE = subdirs +CONFIG += warn_on \ + qt \ + thread diff --git a/src/qprojectM/src/CMakeLists.txt b/src/qprojectM/src/CMakeLists.txt new file mode 100644 index 000000000..ba1e9323e --- /dev/null +++ b/src/qprojectM/src/CMakeLists.txt @@ -0,0 +1,54 @@ +# the next line sets up include and link directories and defines some variables that we will use. +# you can modify the behavior by setting some variables, e.g. +set(QT_USE_OPENGL TRUE) +# -> this will cause cmake to include and link against the OpenGL module +include(${QT_USE_FILE} FindPkgConfig.cmake) + + +ADD_DEFINITIONS(-DLINUX -DPROJECTM_PREFIX='"${PROJECTM_PREFIX}"') +ADD_DEFINITIONS(${QT_DEFINITIONS}) +ADD_DEFINITIONS(-DQT_PLUGIN) +ADD_DEFINITIONS(-DQT_NO_DEBUG) +ADD_DEFINITIONS(-DQT_SHARED) + +# the variable "qprojectM_SRCS" contains all .cpp files of this project +set(qprojectM_SRCS + QProjectM_MainWindow.cpp + QProjectM_MainWindow.hpp + ConfigFile.h ConfigFile.cpp + QProjectMFileDialog.hpp +) + + +set(qprojectM_MOC_HDRS + QProjectM_MainWindow.hpp + QProjectMFileDialog.hpp +) + +set(qprojectM_UIS + QProjectM_MainWindow.ui +) + +# Qt resource file +set( qprojectM_RESOURCES + application.qrc +) + +# compile resources +qt4_add_resources( qprojectM_RC_SRCS ${qprojectM_RESOURCES} ) + +qt4_wrap_ui(qprojectM_UIS_H ${qprojectM_UIS}) + +# After this call, foo_MOC_SRCS = moc_Class1.cxx moc_Class2.cxx moc_Class3.cxx. +qt4_wrap_cpp(qprojectM_MOC_SRCS ${qprojectM_MOC_HDRS}) + +ADD_LIBRARY(qprojectM SHARED ${qprojectM_SRCS} ${qprojectM_RC_SRCS} ${qprojectM_MOC_SRCS} ${qprojectM_UIS_H}) +LINK_DIRECTORIES(${PROJECTM_LDFLAGS}) + +include_directories(${QT_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTOPENGL_INCLUDE_DIR} ${CMAKE_CURRENT_LIBRARY_DIR}) + +# link the "qprojectM" target against the Qt libraries. which libraries exactly, is defined by the "include(${QT_USE_FILE})" line above, which sets up this variable. +target_link_libraries(qprojectM projectM ${QT_QTGUI_LIBRARIES} ${QT_QTOPENGL_LIBRARIES} ${QT_LIBRARIES}) + +install(FILES QProjectM_MainWindow.hpp ui_QProjectM_MainWindow.h DESTINATION include/libprojectM) +install(TARGETS qprojectM DESTINATION lib) diff --git a/src/qprojectM/src/ConfigFile.cpp b/src/qprojectM/src/ConfigFile.cpp new file mode 100644 index 000000000..f041064e5 --- /dev/null +++ b/src/qprojectM/src/ConfigFile.cpp @@ -0,0 +1,142 @@ +// ConfigFile.cpp + +#include "ConfigFile.h" + +using std::string; + +ConfigFile::ConfigFile( string filename, string delimiter, + string comment, string sentry ) + : myDelimiter(delimiter), myComment(comment), mySentry(sentry) +{ + // Construct a ConfigFile, getting keys and values from given file + + std::ifstream in( filename.c_str() ); + + if( !in ) throw file_not_found( filename ); + + in >> (*this); +} + + +ConfigFile::ConfigFile() + : myDelimiter( string(1,'=') ), myComment( string(1,'#') ) +{ + // Construct a ConfigFile without a file; empty +} + + +void ConfigFile::remove( const string& key ) +{ + // Remove key and its value + myContents.erase( myContents.find( key ) ); + return; +} + + +bool ConfigFile::keyExists( const string& key ) const +{ + // Indicate whether key is found + mapci p = myContents.find( key ); + return ( p != myContents.end() ); +} + + +/* static */ +void ConfigFile::trim( string& s ) +{ + // Remove leading and trailing whitespace + static const char whitespace[] = " \n\t\v\r\f"; + s.erase( 0, s.find_first_not_of(whitespace) ); + s.erase( s.find_last_not_of(whitespace) + 1U ); +} + + +std::ostream& operator<<( std::ostream& os, const ConfigFile& cf ) +{ + // Save a ConfigFile to os + for( ConfigFile::mapci p = cf.myContents.begin(); + p != cf.myContents.end(); + ++p ) + { + os << p->first << " " << cf.myDelimiter << " "; + os << p->second << std::endl; + } + return os; +} + + +std::istream& operator>>( std::istream& is, ConfigFile& cf ) +{ + // Load a ConfigFile from is + // Read in keys and values, keeping internal whitespace + typedef string::size_type pos; + const string& delim = cf.myDelimiter; // separator + const string& comm = cf.myComment; // comment + const string& sentry = cf.mySentry; // end of file sentry + const pos skip = delim.length(); // length of separator + + string nextline = ""; // might need to read ahead to see where value ends + + while( is || nextline.length() > 0 ) + { + // Read an entire line at a time + string line; + if( nextline.length() > 0 ) + { + line = nextline; // we read ahead; use it now + nextline = ""; + } + else + { + std::getline( is, line ); + } + + // Ignore comments + line = line.substr( 0, line.find(comm) ); + + // Check for end of file sentry + if( sentry != "" && line.find(sentry) != string::npos ) return is; + + // Parse the line if it contains a delimiter + pos delimPos = line.find( delim ); + if( delimPos < string::npos ) + { + // Extract the key + string key = line.substr( 0, delimPos ); + line.replace( 0, delimPos+skip, "" ); + + // See if value continues on the next line + // Stop at blank line, next line with a key, end of stream, + // or end of file sentry + bool terminate = false; + while( !terminate && is ) + { + std::getline( is, nextline ); + terminate = true; + + string nlcopy = nextline; + ConfigFile::trim(nlcopy); + if( nlcopy == "" ) continue; + + nextline = nextline.substr( 0, nextline.find(comm) ); + if( nextline.find(delim) != string::npos ) + continue; + if( sentry != "" && nextline.find(sentry) != string::npos ) + continue; + + nlcopy = nextline; + ConfigFile::trim(nlcopy); + if( nlcopy != "" ) line += "\n"; + line += nextline; + terminate = false; + } + + // Store key and value + ConfigFile::trim(key); + ConfigFile::trim(line); + cf.myContents[key] = line; // overwrites if key is repeated + } + } + + return is; +} diff --git a/src/qprojectM/src/ConfigFile.h b/src/qprojectM/src/ConfigFile.h new file mode 100644 index 000000000..c2f002447 --- /dev/null +++ b/src/qprojectM/src/ConfigFile.h @@ -0,0 +1,253 @@ +// ConfigFile.h +// Class for reading named values from configuration files +// Richard J. Wagner v2.1 24 May 2004 wagnerr@umich.edu + +// Copyright (c) 2004 Richard J. Wagner +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. + +// Typical usage +// ------------- +// +// Given a configuration file "settings.inp": +// atoms = 25 +// length = 8.0 # nanometers +// name = Reece Surcher +// +// Named values are read in various ways, with or without default values: +// ConfigFile config( "settings.inp" ); +// int atoms = config.read( "atoms" ); +// double length = config.read( "length", 10.0 ); +// string author, title; +// config.readInto( author, "name" ); +// config.readInto( title, "title", string("Untitled") ); +// +// See file example.cpp for more examples. + +#ifndef CONFIGFILE_H +#define CONFIGFILE_H + +#include +#include +#include +#include +#include + +using std::string; + +class ConfigFile { +// Data +protected: + string myDelimiter; // separator between key and value + string myComment; // separator between value and comments + string mySentry; // optional string to signal end of file + std::map myContents; // extracted keys and values + + typedef std::map::iterator mapi; + typedef std::map::const_iterator mapci; + +// Methods +public: + ConfigFile( string filename, + string delimiter = "=", + string comment = "#", + string sentry = "EndConfigFile" ); + ConfigFile(); + + // Search for key and read value or optional default value + template T read( const string& key ) const; // call as read + template T read( const string& key, const T& value ) const; + template bool readInto( T& var, const string& key ) const; + template + bool readInto( T& var, const string& key, const T& value ) const; + + // Modify keys and values + template void add( string key, const T& value ); + void remove( const string& key ); + + // Check whether key exists in configuration + bool keyExists( const string& key ) const; + + // Check or change configuration syntax + string getDelimiter() const { return myDelimiter; } + string getComment() const { return myComment; } + string getSentry() const { return mySentry; } + string setDelimiter( const string& s ) + { string old = myDelimiter; myDelimiter = s; return old; } + string setComment( const string& s ) + { string old = myComment; myComment = s; return old; } + + // Write or read configuration + friend std::ostream& operator<<( std::ostream& os, const ConfigFile& cf ); + friend std::istream& operator>>( std::istream& is, ConfigFile& cf ); + +protected: + template static string T_as_string( const T& t ); + template static T string_as_T( const string& s ); + static void trim( string& s ); + + +// Exception types +public: + struct file_not_found { + string filename; + file_not_found( const string& filename_ = string() ) + : filename(filename_) {} }; + struct key_not_found { // thrown only by T read(key) variant of read() + string key; + key_not_found( const string& key_ = string() ) + : key(key_) {} }; +}; + + +/* static */ +template +string ConfigFile::T_as_string( const T& t ) +{ + // Convert from a T to a string + // Type T must support << operator + std::ostringstream ost; + ost << t; + return ost.str(); +} + + +/* static */ +template +T ConfigFile::string_as_T( const string& s ) +{ + // Convert from a string to a T + // Type T must support >> operator + T t; + std::istringstream ist(s); + ist >> t; + return t; +} + + +/* static */ +template<> +inline string ConfigFile::string_as_T( const string& s ) +{ + // Convert from a string to a string + // In other words, do nothing + return s; +} + + +/* static */ +template<> +inline bool ConfigFile::string_as_T( const string& s ) +{ + // Convert from a string to a bool + // Interpret "false", "F", "no", "n", "0" as false + // Interpret "true", "T", "yes", "y", "1", "-1", or anything else as true + bool b = true; + string sup = s; + for( string::iterator p = sup.begin(); p != sup.end(); ++p ) + *p = toupper(*p); // make string all caps + if( sup==string("FALSE") || sup==string("F") || + sup==string("NO") || sup==string("N") || + sup==string("0") || sup==string("NONE") ) + b = false; + return b; +} + + +template +T ConfigFile::read( const string& key ) const +{ + // Read the value corresponding to key + mapci p = myContents.find(key); + if( p == myContents.end() ) throw key_not_found(key); + return string_as_T( p->second ); +} + + +template +T ConfigFile::read( const string& key, const T& value ) const +{ + // Return the value corresponding to key or given default value + // if key is not found + mapci p = myContents.find(key); + if( p == myContents.end() ) return value; + return string_as_T( p->second ); +} + + +template +bool ConfigFile::readInto( T& var, const string& key ) const +{ + // Get the value corresponding to key and store in var + // Return true if key is found + // Otherwise leave var untouched + mapci p = myContents.find(key); + bool found = ( p != myContents.end() ); + if( found ) var = string_as_T( p->second ); + return found; +} + + +template +bool ConfigFile::readInto( T& var, const string& key, const T& value ) const +{ + // Get the value corresponding to key and store in var + // Return true if key is found + // Otherwise set var to given default + mapci p = myContents.find(key); + bool found = ( p != myContents.end() ); + if( found ) + var = string_as_T( p->second ); + else + var = value; + return found; +} + + +template +void ConfigFile::add( string key, const T& value ) +{ + // Add a key with given value + string v = T_as_string( value ); + trim(key); + trim(v); + myContents[key] = v; + return; +} + +#endif // CONFIGFILE_H + +// Release notes: +// v1.0 21 May 1999 +// + First release +// + Template read() access only through non-member readConfigFile() +// + ConfigurationFileBool is only built-in helper class +// +// v2.0 3 May 2002 +// + Shortened name from ConfigurationFile to ConfigFile +// + Implemented template member functions +// + Changed default comment separator from % to # +// + Enabled reading of multiple-line values +// +// v2.1 24 May 2004 +// + Made template specializations inline to avoid compiler-dependent linkage +// + Allowed comments within multiple-line values +// + Enabled blank line termination for multiple-line values +// + Added optional sentry to detect end of configuration file +// + Rewrote messy trimWhitespace() function as elegant trim() diff --git a/src/qprojectM/src/FindPkgConfig.cmake b/src/qprojectM/src/FindPkgConfig.cmake new file mode 100644 index 000000000..afae15cb0 --- /dev/null +++ b/src/qprojectM/src/FindPkgConfig.cmake @@ -0,0 +1,360 @@ +# - a pkg-config module for CMake +# +# Usage: +# pkg_check_modules( [REQUIRED] []*) +# checks for all the given modules +# +# pkg_search_module( [REQUIRED] []*) +# checks for given modules and uses the first working one +# +# When the 'REQUIRED' argument was set, macros will fail with an error +# when module(s) could not be found +# +# It sets the following variables: +# PKG_CONFIG_FOUND ... true iff pkg-config works on the system +# PKG_CONFIG_EXECUTABLE ... pathname of the pkg-config program +# _FOUND ... set to 1 iff module(s) exist +# +# For the following variables two sets of values exist; first one is the +# common one and has the given PREFIX. The second set contains flags +# which are given out when pkgconfig was called with the '--static' +# option. +# _LIBRARIES ... only the libraries (w/o the '-l') +# _LIBRARY_DIRS ... the paths of the libraries (w/o the '-L') +# _LDFLAGS ... all required linker flags +# _LDFLAGS_OTHERS ... all other linker flags +# _INCLUDE_DIRS ... the '-I' preprocessor flags (w/o the '-I') +# _CFLAGS ... all required cflags +# _CFLAGS_OTHERS ... the other compiler flags +# +# = for common case +# = _STATIC for static linking +# +# There are some special variables whose prefix depends on the count +# of given modules. When there is only one module, stays +# unchanged. When there are multiple modules, the prefix will be +# changed to _: +# _VERSION ... version of the module +# _PREFIX ... prefix-directory of the module +# _INCLUDEDIR ... include-dir of the module +# _LIBDIR ... lib-dir of the module +# +# = when |MODULES| == 1, else +# = _ +# +# A parameter can have the following formats: +# {MODNAME} ... matches any version +# {MODNAME}>={VERSION} ... at least version is required +# {MODNAME}={VERSION} ... exactly version is required +# {MODNAME}<={VERSION} ... modules must not be newer than +# +# Examples +# pkg_check_modules (GLIB2 glib-2.0) +# +# pkg_check_modules (GLIB2 glib-2.0>=2.10) +# requires at least version 2.10 of glib2 and defines e.g. +# GLIB2_VERSION=2.10.3 +# +# pkg_check_modules (FOO glib-2.0>=2.10 gtk+-2.0) +# requires both glib2 and gtk2, and defines e.g. +# FOO_glib-2.0_VERSION=2.10.3 +# FOO_gtk+-2.0_VERSION=2.8.20 +# +# pkg_check_modules (XRENDER REQUIRED xrender) +# defines e.g.: +# XRENDER_LIBRARIES=Xrender;X11 +# XRENDER_STATIC_LIBRARIES=Xrender;X11;pthread;Xau;Xdmcp +# +# pkg_search_module (BAR libxml-2.0 libxml2 libxml>=2) + + +# Copyright (C) 2006 Enrico Scholz +# +# Redistribution and use, with or without modification, are permitted +# provided that the following conditions are met: +# +# 1. Redistributions must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# 2. The name of the author may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +### Common stuff #### +set(PKG_CONFIG_VERSION 1) +set(PKG_CONFIG_FOUND 0) + +find_program(PKG_CONFIG_EXECUTABLE NAMES pkg-config DOC "pkg-config executable") +mark_as_advanced(PKG_CONFIG_EXECUTABLE) + +if(PKG_CONFIG_EXECUTABLE) + set(PKG_CONFIG_FOUND 1) +endif(PKG_CONFIG_EXECUTABLE) + + +# Unsets the given variables +macro(_pkgconfig_unset var) + set(${var} "" CACHE INTERNAL "") +endmacro(_pkgconfig_unset) + +macro(_pkgconfig_set var value) + set(${var} ${value} CACHE INTERNAL "") +endmacro(_pkgconfig_set) + +# Invokes pkgconfig, cleans up the result and sets variables +macro(_pkgconfig_invoke _pkglist _prefix _varname _regexp) + set(_pkgconfig_invoke_result) + + execute_process( + COMMAND ${PKG_CONFIG_EXECUTABLE} ${ARGN} ${_pkglist} + OUTPUT_VARIABLE _pkgconfig_invoke_result + RESULT_VARIABLE _pkgconfig_failed) + + if (_pkgconfig_failed) + set(_pkgconfig_${_varname} "") + _pkgconfig_unset(${_prefix}_${_varname}) + else(_pkgconfig_failed) + string(REGEX REPLACE "[\r\n]" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") + string(REGEX REPLACE " +$" "" _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") + + if (NOT ${_regexp} STREQUAL "") + string(REGEX REPLACE "${_regexp}" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") + endif(NOT ${_regexp} STREQUAL "") + + separate_arguments(_pkgconfig_invoke_result) + + #message(STATUS " ${_varname} ... ${_pkgconfig_invoke_result}") + set(_pkgconfig_${_varname} ${_pkgconfig_invoke_result}) + _pkgconfig_set(${_prefix}_${_varname} "${_pkgconfig_invoke_result}") + endif(_pkgconfig_failed) +endmacro(_pkgconfig_invoke) + +# Invokes pkgconfig two times; once without '--static' and once with +# '--static' +macro(_pkgconfig_invoke_dyn _pkglist _prefix _varname cleanup_regexp) + _pkgconfig_invoke("${_pkglist}" ${_prefix} ${_varname} "${cleanup_regexp}" ${ARGN}) + _pkgconfig_invoke("${_pkglist}" ${_prefix} STATIC_${_varname} "${cleanup_regexp}" --static ${ARGN}) +endmacro(_pkgconfig_invoke_dyn) + +# Splits given arguments into options and a package list +macro(_pkgconfig_parse_options _result _is_req) + set(${_is_req} 0) + + foreach(_pkg ${ARGN}) + if (_pkg STREQUAL "REQUIRED") + set(${_is_req} 1) + endif (_pkg STREQUAL "REQUIRED") + endforeach(_pkg ${ARGN}) + + set(${_result} ${ARGN}) + list(REMOVE_ITEM ${_result} "REQUIRED") +endmacro(_pkgconfig_parse_options) + +### +macro(_pkg_check_modules_internal _is_required _is_silent _prefix) + _pkgconfig_unset(${_prefix}_FOUND) + _pkgconfig_unset(${_prefix}_VERSION) + _pkgconfig_unset(${_prefix}_PREFIX) + _pkgconfig_unset(${_prefix}_INCLUDEDIR) + _pkgconfig_unset(${_prefix}_LIBDIR) + _pkgconfig_unset(${_prefix}_LIBS) + _pkgconfig_unset(${_prefix}_LIBS_L) + _pkgconfig_unset(${_prefix}_LIBS_PATHS) + _pkgconfig_unset(${_prefix}_LIBS_OTHER) + _pkgconfig_unset(${_prefix}_CFLAGS) + _pkgconfig_unset(${_prefix}_CFLAGS_I) + _pkgconfig_unset(${_prefix}_CFLAGS_OTHER) + _pkgconfig_unset(${_prefix}_STATIC_LIBDIR) + _pkgconfig_unset(${_prefix}_STATIC_LIBS) + _pkgconfig_unset(${_prefix}_STATIC_LIBS_L) + _pkgconfig_unset(${_prefix}_STATIC_LIBS_PATHS) + _pkgconfig_unset(${_prefix}_STATIC_LIBS_OTHER) + _pkgconfig_unset(${_prefix}_STATIC_CFLAGS) + _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_I) + _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_OTHER) + + # create a better addressable variable of the modules and calculate its size + set(_pkg_check_modules_list ${ARGN}) + list(LENGTH _pkg_check_modules_list _pkg_check_modules_cnt) + + if(PKG_CONFIG_EXECUTABLE) + # give out status message telling checked module + if (NOT ${_is_silent}) + if (_pkg_check_modules_cnt EQUAL 1) + message(STATUS "checking for module '${_pkg_check_modules_list}'") + else(_pkg_check_modules_cnt EQUAL 1) + message(STATUS "checking for modules '${_pkg_check_modules_list}'") + endif(_pkg_check_modules_cnt EQUAL 1) + endif(NOT ${_is_silent}) + + set(_pkg_check_modules_packages) + set(_pkg_check_modules_failed) + + # iterate through module list and check whether they exist and match the required version + foreach (_pkg_check_modules_pkg ${_pkg_check_modules_list}) + set(_pkg_check_modules_exist_query) + + # check whether version is given + if (_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") + string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\1" _pkg_check_modules_pkg_name "${_pkg_check_modules_pkg}") + string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\2" _pkg_check_modules_pkg_op "${_pkg_check_modules_pkg}") + string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\3" _pkg_check_modules_pkg_ver "${_pkg_check_modules_pkg}") + else(_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") + set(_pkg_check_modules_pkg_name "${_pkg_check_modules_pkg}") + set(_pkg_check_modules_pkg_op) + set(_pkg_check_modules_pkg_ver) + endif(_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") + + # handle the operands + if (_pkg_check_modules_pkg_op STREQUAL ">=") + list(APPEND _pkg_check_modules_exist_query --atleast-version) + endif(_pkg_check_modules_pkg_op STREQUAL ">=") + + if (_pkg_check_modules_pkg_op STREQUAL "=") + list(APPEND _pkg_check_modules_exist_query --exact-version) + endif(_pkg_check_modules_pkg_op STREQUAL "=") + + if (_pkg_check_modules_pkg_op STREQUAL "<=") + list(APPEND _pkg_check_modules_exist_query --max-version) + endif(_pkg_check_modules_pkg_op STREQUAL "<=") + + # create the final query which is of the format: + # * --atleast-version + # * --exact-version + # * --max-version + # * --exists + if (_pkg_check_modules_pkg_op) + list(APPEND _pkg_check_modules_exist_query "${_pkg_check_modules_pkg_ver}") + else(_pkg_check_modules_pkg_op) + list(APPEND _pkg_check_modules_exist_query --exists) + endif(_pkg_check_modules_pkg_op) + + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_VERSION) + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_PREFIX) + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_INCLUDEDIR) + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_LIBDIR) + + list(APPEND _pkg_check_modules_exist_query "${_pkg_check_modules_pkg_name}") + list(APPEND _pkg_check_modules_packages "${_pkg_check_modules_pkg_name}") + + # execute the query + execute_process( + COMMAND ${PKG_CONFIG_EXECUTABLE} ${_pkg_check_modules_exist_query} + RESULT_VARIABLE _pkgconfig_retval) + + # evaluate result and tell failures + if (_pkgconfig_retval) + if(NOT ${_is_silent}) + message(STATUS " package '${_pkg_check_modules_pkg}' not found") + endif(NOT ${_is_silent}) + + set(_pkg_check_modules_failed 1) + endif(_pkgconfig_retval) + endforeach(_pkg_check_modules_pkg) + + if(_pkg_check_modules_failed) + # fail when requested + if (${_is_required}) + message(SEND_ERROR "A required package was not found") + endif (${_is_required}) + else(_pkg_check_modules_failed) + # when we are here, we checked whether requested modules + # exist. Now, go through them and set variables + + _pkgconfig_set(${_prefix}_FOUND 1) + list(LENGTH _pkg_check_modules_packages pkg_count) + + # iterate through all modules again and set individual variables + foreach (_pkg_check_modules_pkg ${_pkg_check_modules_packages}) + # handle case when there is only one package required + if (pkg_count EQUAL 1) + set(_pkg_check_prefix "${_prefix}") + else(pkg_count EQUAL 1) + set(_pkg_check_prefix "${_prefix}_${_pkg_check_modules_pkg}") + endif(pkg_count EQUAL 1) + + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" VERSION "" --modversion ) + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" PREFIX "" --variable=prefix ) + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" INCLUDEDIR "" --variable=includedir ) + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" LIBDIR "" --variable=libdir ) + + message(STATUS " found ${_pkg_check_modules_pkg}, version ${_pkgconfig_VERSION}") + endforeach(_pkg_check_modules_pkg) + + # set variables which are combined for multiple modules + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LIBRARIES "(^| )-l" --libs-only-l ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LIBRARY_DIRS "(^| )-L" --libs-only-L ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS "" --libs ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS_OTHER "" --libs-only-other ) + + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" INCLUDE_DIRS "(^| )-I" --cflags-only-I ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS "" --cflags ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS_OTHER "" --cflags-only-other ) + endif(_pkg_check_modules_failed) + else(PKG_CONFIG_EXECUTABLE) + if (${_is_required}) + message(SEND_ERROR "pkg-config tool not found") + endif (${_is_required}) + endif(PKG_CONFIG_EXECUTABLE) +endmacro(_pkg_check_modules_internal) + +### +### User visible macros start here +### + +### +macro(pkg_check_modules _prefix _module0) + # check cached value + if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) + _pkgconfig_parse_options (_pkg_modules _pkg_is_required "${_module0}" ${ARGN}) + _pkg_check_modules_internal("${_pkg_is_required}" 0 "${_prefix}" ${_pkg_modules}) + + _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION}) + endif(NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) +endmacro(pkg_check_modules) + +### +macro(pkg_search_module _prefix _module0) + # check cached value + if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) + set(_pkg_modules_found 0) + _pkgconfig_parse_options(_pkg_modules_alt _pkg_is_required "${_module0}" ${ARGN}) + + message(STATUS "checking for one of the modules '${_pkg_modules_alt}'") + + # iterate through all modules and stop at the first working one. + foreach(_pkg_alt ${_pkg_modules_alt}) + if(NOT _pkg_modules_found) + _pkg_check_modules_internal(0 1 "${_prefix}" "${_pkg_alt}") + endif(NOT _pkg_modules_found) + + if (${_prefix}_FOUND) + set(_pkg_modules_found 1) + endif(${_prefix}_FOUND) + endforeach(_pkg_alt) + + if (NOT ${_prefix}_FOUND) + if(${_pkg_is_required}) + message(SEND_ERROR "None of the required '${_pkg_modules_alt}' found") + endif(${_pkg_is_required}) + endif(NOT ${_prefix}_FOUND) + + _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION}) + endif(NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) +endmacro(pkg_search_module) + +### Local Variables: +### mode: cmake +### End: diff --git a/src/qprojectM/src/QProjectMFileDialog.hpp b/src/qprojectM/src/QProjectMFileDialog.hpp new file mode 100644 index 000000000..c6987394d --- /dev/null +++ b/src/qprojectM/src/QProjectMFileDialog.hpp @@ -0,0 +1,52 @@ +/*************************************************************************** + * Copyright (C) 2007 by carm * + * carm@localhost * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + + +#ifndef QPROJECTM_FILEDIALOG_H +#define QPROJECTM_FILEDIALOG_H + + +#define CONFIG_FILE "/share/projectM/config.inp" + +#include +#include +#include +#include "libprojectM/projectM.hpp" + +#include +#include + + class QProjectMFileDialog : public QFileDialog + { + Q_OBJECT // must include this if you use Qt signals/slots + + public: + QProjectMFileDialog(QWidget * parent = 0): + QFileDialog(parent, "Add preset files", QString(), "Presets (*.prjm *.milk)" ) { + + this->setFileMode(QFileDialog::ExistingFiles); + } + + ~QProjectMFileDialog() { } + private: + + +}; +#endif diff --git a/src/qprojectM/src/QProjectM_MainWindow.cpp b/src/qprojectM/src/QProjectM_MainWindow.cpp new file mode 100644 index 000000000..d26f4eb50 --- /dev/null +++ b/src/qprojectM/src/QProjectM_MainWindow.cpp @@ -0,0 +1,289 @@ +/*************************************************************************** + * Copyright (C) 2007 by carm * + * carm@localhost * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + + +#include +#include "QProjectM_MainWindow.hpp" +#include "QProjectMFileDialog.hpp" + +#include +#include +#include + +QProjectM_MainWindow::QProjectM_MainWindow(const std::string & config_file) +:m_QProjectMFileDialog(new QProjectMFileDialog(this)) +{ + + ui.setupUi(this); + + m_QProjectMWidget = new QProjectMWidget(config_file, this); + + m_timer = new QTimer(this); + connect(m_timer, SIGNAL(timeout()), m_QProjectMWidget, SLOT(updateGL())); + + connect(ui.lockPresetCheckBox, SIGNAL(stateChanged(int)), + m_QProjectMWidget, SLOT(setPresetLock(int))); + + connect(m_QProjectMWidget, SIGNAL(projectM_Initialized()), this, SLOT(postProjectM_Initialize())); + + + ui.tableView->setVerticalHeader(0); + + ui.tableView->setModel(&playlistModel); + + m_QProjectMWidget->makeCurrent(); + m_QProjectMWidget->setFocus(); + + m_timer->start(0); + + setCentralWidget(m_QProjectMWidget); + + createActions(); + createMenus(); + createToolBars(); + createStatusBar(); + readSettings(); + ui.presetPlayListDockWidget->hide(); + + +} + +QProjectM * QProjectM_MainWindow::getQProjectM() { + return m_QProjectMWidget->getQProjectM(); +} + +void QProjectM_MainWindow::updatePlaylistSelection(bool hardCut, unsigned int index) { + + if (hardCut) + statusBar()->showMessage(tr("*** Hard cut ***") , 2000); + else + statusBar()->showMessage(tr("*** Soft cut ***") , 2000); + + ui.tableView->selectRow(index); + + +} + +void QProjectM_MainWindow::selectPlaylistItem(const QModelIndex & index) { + getQProjectM()->selectPreset(index.row()); +} + + +void QProjectM_MainWindow::postProjectM_Initialize() { + refreshPlaylist(); + + connect(m_QProjectMWidget->getQProjectM(), SIGNAL(presetSwitchedSignal(bool,unsigned int)), this, SLOT(updatePlaylistSelection(bool,unsigned int))); + + + connect(ui.tableView, SIGNAL(activated(const QModelIndex &)), + this, SLOT(selectPlaylistItem(const QModelIndex &))); + +} + +void QProjectM_MainWindow::keyReleaseEvent ( QKeyEvent * e ) { + + QModelIndex modelIndex; + switch (e->key()) { + case Qt::Key_L: + if (ui.lockPresetCheckBox->checkState() == Qt::Checked) + ui.lockPresetCheckBox->setCheckState(Qt::Unchecked); + else + ui.lockPresetCheckBox->setCheckState(Qt::Checked); + + // the projectM widget handles the actual lock + //e->ignore(); + //m_QProjectMWidget->keyReleaseEvent(e); + return; + + case Qt::Key_F: + this->setWindowState(this->windowState() ^ Qt::WindowFullScreen); + return; + + case Qt::Key_M: + + if (ui.presetPlayListDockWidget->isVisible()) { + ui.presetPlayListDockWidget->hide(); + } else + ui.presetPlayListDockWidget->show(); + + if (menuBar()->isVisible()) { + menuBar()->hide(); + m_QProjectMWidget->setFocus(); + } + else { + menuBar()->show(); + } + + if (statusBar()->isVisible()) { + statusBar()->hide(); + } + else { + statusBar()->show(); + } + return; + + case Qt::Key_R: + //modelIndex.selectRandom() + //modelIndex = QModelIndex(0,0,0); + //selectPlaylistItem(modelIndex); + //updatePlaylistSelection(true, modelIndex.row()); + return; + default: + //m_QProjectMWidget->keyReleaseEvent(e); + break;//e->ignore(); + } + +} + +void QProjectM_MainWindow::closeEvent(QCloseEvent *event) +{ +} + + +void QProjectM_MainWindow::open() +{ + + + if ( m_QProjectMFileDialog->exec()) { + const QStringList & files = m_QProjectMFileDialog->selectedFiles(); + + for (QStringList::const_iterator pos = files.begin(); + pos != files.end(); ++pos) { + if (*pos != "") + loadFile(*pos); + } + } + +} + + +void QProjectM_MainWindow::refreshPlaylist() { + + playlistModel.clear(); + + for (unsigned int i = 0; i < getQProjectM()->getPlayListSize(); i++) { + + const std::string & presetURL = getQProjectM()->getPresetURL(i); + const std::string & presetName = getQProjectM()->getPresetName(i); + + QList items; + items.append(new QStandardItem(QString(presetName.c_str()))); + items[0]->setEditable(false); + + playlistModel.appendRow(items); + } + + + QHeaderView * hHeader = new QHeaderView(Qt::Horizontal, this); + QHeaderView * vHeader = new QHeaderView(Qt::Vertical, this); + + hHeader->setClickable(true); + hHeader->setSortIndicatorShown(true); + hHeader->setSortIndicator(1, Qt::AscendingOrder); + hHeader->setStretchLastSection(true); + + ui.tableView->setVerticalHeader(vHeader); + ui.tableView->setHorizontalHeader(hHeader); + + playlistModel.setHeaderData(0, Qt::Horizontal, tr("Preset"));//, Qt::DisplayRole); + + vHeader->hide(); + + //playlistModel.setHeaderData(0, Qt::Vertical, 1000, Qt::SizeHintRole); + //playlistModel.setHeaderData(1, Qt::Horizontal, tr("Rating"));//, Qt::DisplayRole); + //playlistModel.setHeaderData(2, Qt::Horizontal, tr("Preset"));//, Qt::DisplayRole); + + +} + +void QProjectM_MainWindow::about() +{ + QMessageBox::about(this, tr("About QProjectM"), + tr("QProjectM provides useful gui extensions to the projectM core library.")); +} + + +void QProjectM_MainWindow::createActions() +{ + + connect(ui.actionExit, SIGNAL(triggered()), this, SLOT(close())); + + connect(ui.actionAddPresets, SIGNAL(triggered()), this, SLOT(open())); + + connect(ui.actionAbout_qprojectM, SIGNAL(triggered()), this, SLOT(about())); + + //connect(ui.actionAbout_Qt, SIGNAL(triggered()), this, SLOT(aboutQt())); + +} + +void QProjectM_MainWindow::createMenus() +{ + ui.menuBar->hide(); + +} + +void QProjectM_MainWindow::createToolBars() +{ +} + +void QProjectM_MainWindow::createStatusBar() +{ + statusBar()->hide(); + statusBar()->showMessage(tr("Welcome to qprojectM!")); +} + +void QProjectM_MainWindow::readSettings() +{ + QSettings settings("Trolltech", "QProjectM"); + QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint(); + QSize size = settings.value("size", QSize(1000, 600)).toSize(); + resize(size); + move(pos); +} + +void QProjectM_MainWindow::writeSettings() +{ + QSettings settings("Trolltech", "QProjectM"); + settings.setValue("pos", pos()); + settings.setValue("size", size()); +} + + + +void QProjectM_MainWindow::loadFile(const QString &fileName) +{ + QProjectM * projectM = this->getQProjectM(); + unsigned int index = projectM->addPresetURL(fileName.toStdString(), strippedName(fileName).toStdString()); + + QList items; + items.append(new QStandardItem(QString(projectM->getPresetName(index).c_str()))); + items[0]->setEditable(false); + + playlistModel.appendRow(items); + +} + + +QString QProjectM_MainWindow::strippedName(const QString &fullFileName) +{ + return QFileInfo(fullFileName).fileName(); +} + + diff --git a/src/qprojectM/src/QProjectM_MainWindow.hpp b/src/qprojectM/src/QProjectM_MainWindow.hpp new file mode 100644 index 000000000..c0e071d33 --- /dev/null +++ b/src/qprojectM/src/QProjectM_MainWindow.hpp @@ -0,0 +1,251 @@ +/*************************************************************************** + * Copyright (C) 2007 by carm * + * carm@localhost * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + + +#ifndef QPROJECTM_MAINWINDOW_H +#define QPROJECTM_MAINWINDOW_H +#define CONFIG_FILE "/share/projectM/config.inp" + +#include "ui_QProjectM_MainWindow.h" + +#include +#include +#include +#include "libprojectM/projectM.hpp" + +#include +#include + +class QAction; +class QMenu; +class QProjectMFileDialog; + +#include + + +class QProjectM : public QObject, public projectM { + Q_OBJECT + + public: + QProjectM(const std::string & config_file):projectM(config_file) {} + + + void presetSwitchedEvent(bool hardCut, unsigned int index) const { + presetSwitchedSignal(hardCut, index); + } + signals: + void presetSwitchedSignal(bool hardCut, unsigned int index) const; + public slots: + +}; + +class QProjectMWidget : public QGLWidget + { + Q_OBJECT // must include this if you use Qt signals/slots + + public: + QProjectMWidget(const std::string & _config_file, QWidget *parent) + : QGLWidget(parent), config_file(_config_file), m_projectM(0) {} + ~QProjectMWidget() { if (m_projectM) delete(m_projectM); } + + QProjectM * getQProjectM() { return m_projectM; } + + public slots: + void setPresetLock(int state) { + m_projectM->setPresetLock((bool)state); + } + signals: + void projectM_Initialized(); + + private: + std::string config_file; + QProjectM * m_projectM; + protected: + +void keyReleaseEvent ( QKeyEvent * e ) { + + projectMKeycode pkey; + bool ignore = false; + switch (e->key()) { + case Qt::Key_F4: + pkey = PROJECTM_K_F4; + break; + case Qt::Key_F3: + pkey = PROJECTM_K_F3; + break; + case Qt::Key_F2: + pkey = PROJECTM_K_F2; + break; + case Qt::Key_F1: + pkey = PROJECTM_K_F1; + break; + case Qt::Key_R: + pkey = PROJECTM_K_r; + break; + case Qt::Key_L: + pkey = PROJECTM_K_l; + ignore = true; + break; + case Qt::Key_N: + pkey = PROJECTM_K_n; + break; + case Qt::Key_P: + pkey = PROJECTM_K_p; + break; + default: + e->ignore(); + return; + } + projectMModifier modifier; + + //std::cerr << "HERE with key " << e->key() << std::endl; + m_projectM->key_handler(PROJECTM_KEYDOWN, pkey, modifier); + if (ignore) + e->ignore(); + + + } + + void initializeGL() + { + this->m_projectM = new QProjectM(config_file); + projectM_Initialized(); + } + + void resizeGL(int w, int h) + { + // setup viewport, projection etc.: + /// @bug is setup necessary on resize or should just be in initializeGL() ? + setup_opengl(w,h); + m_projectM->projectM_resetGL( w, h ); + } + + void paintGL() + { + assert(m_projectM); + m_projectM->renderFrame(); + } + + private: + + void setup_opengl( int w, int h ) +{ + + /* Our shading model--Gouraud (smooth). */ + glShadeModel( GL_SMOOTH); + /* Culling. */ + // glCullFace( GL_BACK ); + // glFrontFace( GL_CCW ); + // glEnable( GL_CULL_FACE ); + /* Set the clear color. */ + glClearColor( 0, 0, 0, 0 ); + /* Setup our viewport. */ + glViewport( 0, 0, w, h ); + /* + * Change to the projection matrix and set + * our viewing volume. + */ + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + + // gluOrtho2D(0.0, (GLfloat) width, 0.0, (GLfloat) height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + // glFrustum(0.0, height, 0.0,width,10,40); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + +glDrawBuffer(GL_BACK); + glReadBuffer(GL_BACK); + glEnable(GL_BLEND); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + // glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glEnable(GL_LINE_SMOOTH); + glEnable(GL_POINT_SMOOTH); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); +// glClear(GL_COLOR_BUFFER_BIT); + + // glCopyTexImage2D(GL_TEXTURE_2D,0,GL_RGB,0,0,texsize,texsize,0); + //glCopyTexSubImage2D(GL_TEXTURE_2D,0,0,0,0,0,texsize,texsize); + glLineStipple(2, 0xAAAA); + + +} + + + }; + +class QProjectM_MainWindow:public QMainWindow +{ + Q_OBJECT + +public: + + QProjectM_MainWindow(const std::string & config_file); + ~QProjectM_MainWindow() {}; + void keyReleaseEvent ( QKeyEvent * e ); + QProjectM * getQProjectM(); + + void refreshPlaylist(); + + +protected: + void closeEvent(QCloseEvent *event); + +private slots: + void open(); + void about(); + void postProjectM_Initialize(); + void updatePlaylistSelection(bool hardCut, unsigned int index); + void selectPlaylistItem(const QModelIndex & index); + +private: + + QStandardItemModel playlistModel; + Ui::qProjectM_MainWindow ui; + QTimer * m_timer; + void createActions(); + void createMenus(); + void createToolBars(); + void createStatusBar(); + void readSettings(); + void writeSettings(); + bool maybeSave(); + void loadFile(const QString &fileName); + QString strippedName(const QString &fullFileName); + + QProjectMWidget * m_QProjectMWidget; + + QMenu *fileMenu; + QMenu *helpMenu; + QToolBar *fileToolBar; + + QAction *openAct;; + QAction *exitAct; + QAction *aboutAct; + QAction *aboutQtAct; + + + QProjectMFileDialog * m_QProjectMFileDialog; +}; + +#endif diff --git a/src/qprojectM/src/QProjectM_MainWindow.ui b/src/qprojectM/src/QProjectM_MainWindow.ui new file mode 100644 index 000000000..fd22e51d4 --- /dev/null +++ b/src/qprojectM/src/QProjectM_MainWindow.ui @@ -0,0 +1,407 @@ + + qProjectM_MainWindow + + + + 0 + 0 + 787 + 568 + + + + qprojectM + + + + + + + + + 0 + 0 + 787 + 31 + + + + + &Playlist + + + + + + + + + + + + &Help + + + + + + + &Settings + + + + + + + + + + + + 0 + 0 + + + + + 315 + 0 + + + + + 300 + 0 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This dock panel provides a convenient interface to manage a list of presets for projectM to render. The behavior is very similar to a music player playlist.</p></body></html> + + + Preset Playlist + + + 1 + + + + + + 0 + 0 + 311 + 481 + + + + + 0 + + + + + -1 + + + + + + 0 + 0 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click here to add presets to the current playlist.</p></body></html> + + + + + + :/images/icons/hi16-action-projectm_add_playlist.png + + + + + + + + 0 + 0 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click here to the current play list</p></body></html> + + + + + + + + + :/images/icons/hi16-action-projectm_save.png + + + + + + + + 0 + 0 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Clears <span style=" font-style:italic;">all</span> items if <span style=" font-style:italic;">none are selected</span> and the currently selected items otherwise.</p></body></html> + + + + + + :/images/icons/hi16-action-projectm_playlist_clear.png + + + + + + + + 0 + 0 + + + + Start typing in a filter to crop the play list. + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use this search bar to crop your preset play list. Only the presets that match your search criteria will be queued.</p></body></html> + + + + + + + + + + 0 + 0 + + + + + 500 + 0 + + + + true + + + Double click on a preset to render it, or drag presets to change the preset order. + + + false + + + true + + + false + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + false + + + Qt::DashDotDotLine + + + + + + + -1 + + + + + true + + + + 0 + 0 + + + + PointingHandCursor + + + Change the preset play list's selection mode + + + + + + QCheckBox::indicator:checked { +image: url(:/images/icons/hi16-action-projectm_random.png); +} + +QCheckBox::indicator:unchecked{ +image: url(:/images/icons/hi16-action-projectm_random_no.png); +} + + + + + + true + + + true + + + + + + + true + + + + 0 + 0 + + + + PointingHandCursor + + + Change the preset play list's selection mode + + + + + + QCheckBox::indicator:checked {image: url(:/images/icons/hi16-action-projectm_lock.png); +} + +QCheckBox::indicator:unchecked{ +image: url(:/images/icons/hi16-action-projectm_unlock.png); +} + + + + + + false + + + true + + + + + + + + + + + + :/images/icons/hi16-action-projectm_add_playlist.png + + + &Add Presets... + + + + + About qprojectM + + + + + About Qt + + + + + &Quit + + + + + :/images/icons/hi16-action-projectm_save.png + + + &Save Playlist + + + + + Save Playlist &As... + + + + + Configure projectM... + + + + + &Open Playlist... + + + + + :/images/icons/hi16-action-projectm_lock.png + + + Lock Active Preset + + + + + + + + + presetOpenPushButton + clicked() + actionAddPresets + trigger() + + + 221 + 66 + + + -1 + -1 + + + + + diff --git a/src/qprojectM/src/ReadMe b/src/qprojectM/src/ReadMe new file mode 100644 index 000000000..87d23f71e --- /dev/null +++ b/src/qprojectM/src/ReadMe @@ -0,0 +1,11 @@ +READ THIS IN ORDER TO COMPILE THE Qt4 TEMPLATE +---------------------------------------------- + +Before compiling, check the Qt Options, go to +Project->Project Options->C++ Support and open the Qt Options tab. + +Check that the Qt installation directory is correct for the Qt version you've chosen. + +------------------ +Andreas Pakulat +July 2006 diff --git a/src/qprojectM/src/application.qrc b/src/qprojectM/src/application.qrc new file mode 100644 index 000000000..4710df732 --- /dev/null +++ b/src/qprojectM/src/application.qrc @@ -0,0 +1,11 @@ + + + images/icons/hi16-action-projectm_add_playlist.png + images/icons/hi16-action-projectm_lock.png + images/icons/hi16-action-projectm_playlist_clear.png + images/icons/hi16-action-projectm_random.png + images/icons/hi16-action-projectm_random_no.png + images/icons/hi16-action-projectm_save.png + images/icons/hi16-action-projectm_unlock.png + + diff --git a/src/qprojectM/src/editcopy.xpm b/src/qprojectM/src/editcopy.xpm new file mode 100644 index 000000000..8350ed0e6 --- /dev/null +++ b/src/qprojectM/src/editcopy.xpm @@ -0,0 +1,193 @@ +/* XPM */ +static char *editcopy[] = { +/* columns rows colors chars-per-pixel */ +"32 32 155 2", +" c black", +". c #191000", +"X c #221700", +"o c #2E2300", +"O c #452E00", +"+ c #433200", +"@ c #493000", +"# c #553800", +"$ c #5D4600", +"% c #6B5000", +"& c #724B00", +"* c #7D5E00", +"= c #6E694F", +"- c #7E795F", +"; c #865900", +": c #8A5C00", +"> c #8B6800", +", c #936200", +"< c #926D00", +"1 c #926B1A", +"2 c #967000", +"3 c #9B721D", +"4 c #9B7625", +"5 c #9E792A", +"6 c #A47C00", +"7 c #AA7D00", +"8 c #A1761A", +"9 c #A57816", +"0 c #A4791D", +"q c #AD8200", +"w c #B28500", +"e c #AE8530", +"r c #B99626", +"t c #97906D", +"y c #B18D48", +"u c #B49049", +"i c #B89542", +"p c #BA9C4D", +"a c #BD9E52", +"s c #BFA053", +"d c #B8AE78", +"f c #BEB47E", +"g c #C49300", +"h c #C89600", +"j c #C19D2C", +"k c #C1A43F", +"l c #C09E4E", +"z c #CFB457", +"x c #C9B159", +"c c #CAB573", +"v c #D4BF7C", +"b c #FFDF62", +"n c #FFE064", +"m c #FFE16D", +"M c #FFE372", +"N c #FFE479", +"B c #A19D8E", +"V c #ABA89A", +"C c #BEB580", +"Z c #BDB488", +"A c #B8B496", +"S c #AEADAA", +"D c #B3AFA1", +"F c #BCBBB6", +"G c #BFBFB9", +"H c #C0B680", +"J c #C4BA85", +"K c #C6BD8B", +"L c #CBB589", +"P c #C8BE88", +"I c #C3BC90", +"U c #CBC18C", +"Y c #CCC493", +"T c #D7CB8C", +"R c #DAC786", +"E c #D8C789", +"W c #DAC98B", +"Q c #D0C690", +"! c #D4CA94", +"~ c #D4CC9B", +"^ c #D8CE98", +"/ c #DCD29C", +"( c #C6C3B7", +") c #C8C6BE", +"_ c #D5C5A5", +"` c #DBC8A1", +"' c #DBD4A2", +"] c #DED9AE", +"[ c #D9D5B1", +"{ c #E0CC82", +"} c #E8D98B", +"| c #E8D991", +" . c #E1D7A1", +".. c #E5DBA5", +"X. c #E4DCAB", +"o. c #E8DDAA", +"O. c #E1DCB2", +"+. c #E1DCB8", +"@. c #FFE683", +"#. c #FFE78A", +"$. c #FFE885", +"%. c #FFE88D", +"&. c #FFE992", +"*. c #FFEC9D", +"=. c #FFF09F", +"-. c #ECE2AC", +";. c #E5E0B6", +":. c #E5E1B8", +">. c #EBE4B6", +",. c #EAE5BC", +"<. c #F0E5A8", +"1. c #FFEDA3", +"2. c #FFEDA9", +"3. c #F1E8B8", +"4. c #FFEFB1", +"5. c #FFF1A5", +"6. c #FFF2AD", +"7. c #FFF2B4", +"8. c #FFF2BC", +"9. c #CAC8C2", +"0. c #D6D4CB", +"q. c #DFDAC5", +"w. c #D4D2D0", +"e. c #E0D7C5", +"r. c #E4DAC3", +"t. c #E8DEC7", +"y. c #E0DFD3", +"u. c #E6E2C2", +"i. c #E8E1C5", +"p. c #EBE3CB", +"a. c #EEE9C2", +"s. c #E8E6DC", +"d. c #F3EDC3", +"f. c #F2EDCB", +"g. c #F7F2CD", +"h. c #FFF3C3", +"j. c #FFF4CA", +"k. c #FFF8C5", +"l. c #FFF8CD", +"z. c #FDF5D2", +"x. c #FFF7D8", +"c. c #FFF9D4", +"v. c #FFF9DC", +"b. c #E9E8E7", +"n. c #F3EFE3", +"m. c #F2F0E3", +"M. c #F4F2EA", +"N. c #FBF7E6", +"B. c #FEF9E3", +"V. c #FFFBEC", +"C. c #F4F4F3", +"Z. c #F8F7F6", +"A. c #FEFCF4", +"S. c #FEFEFC", +"D. c None", +/* pixels */ +"D.D.D.D.D.D.D.D.D.D.D.D.h g g g g g g g g g g w * D.D.D.D.D.", +"D.D.D.D.D.D.D.D.D.D.D.D.g z.z.g.g.g.g.g.g.z.g.R 2 D.D.D.D.D.", +"D.D.D.D.D.D.D.D.D.D.D.D.g z.d.3.3.3.3.3.3.>.f.g.z < D.D.D.D.", +"D.D.D.D.D., : ; , : : : 7 a i a R -.-.-.-.' m.u.g.j > D.D.D.", +"D.D.D.D., u y y L L L L ` t.t.e.e v -.-.-.Y b.S.+.d.q D.D.D.", +"D.D.D.D., S.S.S.S.S.S.S.S.Z.b.S.e.i W o.o.K w.S.A.u.q D.D.D.", +"D.D.D.D., S.S.S.A.S.S.S.S.M.w.S.S._ a E ..K 0.S.S.q.7 D.D.D.", +"D.D.D.D., S.A.V.A.A.A.V.A.n.9.S.S.C._ a ..Y t = - A 6 D.D.D.", +"D.D.D.D., A.A.V.A.V.V.V.A.n.9.S.S.S.Z.3 ' ' K Z A ] 7 D.D.D.", +"D.D.D.D., A.V.B.V.V.B.V.V.n.( F S S G 5 ' | / / X.f.q D.D.D.", +"D.D.D.D., A.V.x.B.x.V.B.N.B.e.D B V ) 3 / / ^ ^ ' a.q D.D.D.", +"D.D.D.D., V.N.N.B.B.B.v.v.N.z.p.i.p.n.8 ^ / ! Q ' a.q D.D.D.", +"D.D.D.D., B.B.x.v.x.z.j.j.x.z.z.c.B.B.0 ! ! ! ^ ' ,.q D.D.D.", +"D.D.D.D., B.h.h.z.z.x.x.z.z.z.h.j.x.v.0 ! Q Y ! ~ ,.q D.D.D.", +"D.D.D.D., v.c.k.x.h.j.j.j.z.8.h.k.j.v.0 U T U U ~ ,.q D.D.D.", +"D.D.D.D., v.k.z.h.h.h.j.8.j.h.h.j.k.v.0 U U U U Y ;.q D.D.D.", +"D.D.D.D., x.h.8.8.h.j.8.8.4.h.4.8.h.x.8 P H P P ~ ;.q D.D.D.", +"D.D.D.D., v.h.4.4.8.8.4.1.z.h.8.4.h.c.8 H J H J Y ;.q D.D.D.", +"D.D.D.D., c.2.z.j.4.*.1.1.8.2.2.*.2.l.8 J J H J U ] q D.D.D.", +"D.D.D.D., l.h.2.4.4.1.%.1.&.2.4.8.7.k.8 f d f H U ] q D.D.D.", +"D.D.D.D., z.8.#.1.4.1.*.1.1.1.*.N 4.l.8 f f C K ~ :.q D.D.D.", +"D.D.D.D., 8.&.4.#.%.4.&.@.#.%.%.&.2.l.8 K K Y ~ ] ,.6 D.D.D.", +"D.D.D.D., h.&.#.*.1.1.%.N N #.&.*.1.l.0 ' ] T x r 6 % D.D.D.", +"D.D.D.D., 4.4.%.*.#.b &.N M b M 2.1.k.9 k 7 > $ o D.D.D.", +"D.D.D.D., 7.&.N 5.&.N @.*.b N M N =.k., + D.D.D.", +"D.D.D.D., 6.N N M M &.#.N 2.$.%.8.6.<.& D.D.D.D.D.", +"D.D.D.D., 5.&.7.n $.m M 1.7.7.o.c 5 & @ D.D.D.D.D.D.D.D.D.", +"D.D.D.D., 7.*.m %.=.&.7.} p 1 % # X D.D.D.D.D.D.D.D.D.D.", +"D.D.D.D., 6.5.5.5.| a 1 & + . D.D.D.D.D.D.D.D.D.D.", +"D.D.D.D., 6.-.a 1 & O . D.D.D.D.D.D.D.D.D.D.D.D.", +"D.D.D.D.; : % O . D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.", +"D.D.D.D. D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D." +}; diff --git a/src/qprojectM/src/editcut.xpm b/src/qprojectM/src/editcut.xpm new file mode 100644 index 000000000..9a1189317 --- /dev/null +++ b/src/qprojectM/src/editcut.xpm @@ -0,0 +1,252 @@ +/* XPM */ +static char *editcut[] = { +/* columns rows colors chars-per-pixel */ +"32 32 214 2", +" c #000000", +". c #0B0B0B", +"X c #181300", +"o c #1D190B", +"O c #131313", +"+ c #1B1B1B", +"@ c #211E11", +"# c #26231A", +"$ c #2A2513", +"% c #2E2912", +"& c #2E2A19", +"* c #372E0B", +"= c #302A12", +"- c #312C1B", +"; c #3A320F", +": c #3C3415", +"> c #3C351B", +", c #232323", +"< c #2B2922", +"1 c #2C2C2C", +"2 c #302E26", +"3 c #353120", +"4 c #3F3B2D", +"5 c #313131", +"6 c #3A3A3A", +"7 c #423814", +"8 c #493E17", +"9 c #413D2F", +"0 c #423F32", +"q c #4F4319", +"w c #5C4A00", +"e c #5F4F0D", +"r c #514410", +"t c #554813", +"y c #4E472C", +"u c #444136", +"i c #4A483F", +"p c #534B2B", +"a c #504B37", +"s c #514C3A", +"d c #654F04", +"f c #604F0B", +"g c #665200", +"h c #675509", +"j c #6B5405", +"k c #6C5807", +"l c #6C590B", +"z c #745B04", +"x c #715D0A", +"c c #7B5B02", +"v c #625B3B", +"b c #7E6815", +"n c #6C643E", +"m c #4D4B42", +"M c #494949", +"N c #504D43", +"B c #54534C", +"V c #515151", +"C c #5D5B54", +"Z c #656048", +"A c #736A44", +"S c #726C54", +"D c #77725B", +"F c #696968", +"G c gray50", +"H c #826203", +"J c #806609", +"K c #836907", +"L c #8D6A03", +"P c #9A6F00", +"I c #9B7005", +"U c #9E730E", +"Y c #9C7511", +"T c #85732C", +"R c #88783B", +"E c #AE7C00", +"W c #A87B13", +"Q c #847B53", +"! c #827D64", +"~ c #9C862E", +"^ c #A98A1F", +"/ c #B28D0A", +"( c #B88D00", +") c #B2821A", +"_ c #B18E1B", +"` c #B3941C", +"' c #A88E2C", +"] c #A28C36", +"[ c #AE9224", +"{ c #89815E", +"} c #87826D", +"| c #858174", +" . c #888370", +".. c #8E8A7D", +"X. c #928C71", +"o. c #A28E44", +"O. c #AA9F74", +"+. c #B9A456", +"@. c #BDA85B", +"#. c #B2A068", +"$. c #C28700", +"%. c #CC8E00", +"&. c #C29A00", +"*. c #C4962F", +"=. c #CCA100", +"-. c #D6A800", +";. c #D1AC1B", +":. c #DDB31A", +">. c #D2A922", +",. c #D4AE2B", +"<. c #DBA12E", +"1. c #DBA433", +"2. c #DDB428", +"3. c #D2B23B", +"4. c #E6A200", +"5. c #E8A509", +"6. c #EAAF00", +"7. c #EFAC1E", +"8. c #F5A100", +"9. c #FFAD02", +"0. c #FCAF0D", +"q. c #FCB005", +"w. c #FFB60C", +"e. c #FFBD00", +"r. c #FFBD16", +"t. c #E3B432", +"y. c #E8BF3C", +"u. c #F6BE2F", +"i. c #C6A949", +"p. c #D9A948", +"a. c #D8AB52", +"s. c #DBBA45", +"d. c #C5B162", +"f. c #ECB74D", +"g. c #EFB841", +"h. c #EFBE4A", +"j. c #EABA55", +"k. c #FDC006", +"l. c #FFC10B", +"z. c #FFC800", +"x. c #FFC90D", +"c. c #FAC113", +"v. c #FBC11C", +"b. c #FDC910", +"n. c #EDC233", +"m. c #F5C32D", +"M. c #FFC728", +"N. c #F4C537", +"B. c #F6C63A", +"V. c #F5CB36", +"C. c #FFD73D", +"Z. c #E9C659", +"A. c #EAC85A", +"S. c #FFDA4B", +"D. c #FFDD5D", +"F. c #E9CD6B", +"G. c #FFD560", +"H. c #FFE06C", +"J. c gray56", +"K. c #959595", +"L. c gray62", +"P. c #A6A18A", +"I. c #A8A69E", +"U. c #AEA895", +"Y. c #B3AC8F", +"T. c #B8AF8B", +"R. c #B4AD96", +"E. c #B8B199", +"W. c #A4A4A4", +"Q. c #AAAAAA", +"!. c #B0ADA3", +"~. c #BBB6A3", +"^. c #B1B1B1", +"/. c #B9B9B6", +"(. c #BBBBBA", +"). c #C5BC9D", +"_. c #C2BCA2", +"`. c #C1BEB5", +"'. c #D2C38E", +"]. c #DCC78C", +"[. c #C7C0A7", +"{. c #C7C2AE", +"}. c #C7C3B2", +"|. c #C5C2B8", +" X c #CAC6B6", +".X c #CBC9BE", +"XX c #D9D3BB", +"oX c #E6D08A", +"OX c #E7DEBD", +"+X c #ECDEB3", +"@X c #FFF0B9", +"#X c #C5C5C5", +"$X c #CECCC7", +"%X c #D0CEC5", +"&X c #D0CFC8", +"*X c #D2D1CB", +"=X c #DBD6C5", +"-X c #DBD7C9", +";X c #D3D3D1", +":X c #DBDBDB", +">X c #E5E1D6", +",X c #E5E3DA", +".9.U r . . , T B.*.x qX + , Q !.Q. . + 1 [ m.p.k . qXqXqXqX , u O.W.;X! + ", +"4 8.j.` p 5 y ;.u.a.d % qXqXqXqXqXqX O , A P._., ", +"1 x <.f.m.x.b.y.a.g ; qXqXqXqXqXqXqXqX + 0 v O ", +" - h c W W W W z : qXqXqXqXqXqXqXqXqXqX . . ", +" * e l l f X qXqXqXqXqXqXqXqXqXqXqXqXqX ", +"qX qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX qX", +"qXqXqX qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX", +"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX", +"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX" +}; diff --git a/src/qprojectM/src/editpaste.xpm b/src/qprojectM/src/editpaste.xpm new file mode 100644 index 000000000..c29ad36be --- /dev/null +++ b/src/qprojectM/src/editpaste.xpm @@ -0,0 +1,295 @@ +/* XPM */ +static char *editpaste[] = { +/* columns rows colors chars-per-pixel */ +"32 32 257 2", +" c black", +". c #0D0900", +"X c #191000", +"o c #221700", +"O c #2A1B00", +"+ c #332200", +"@ c #3E2900", +"# c #3A2804", +"$ c #4D3300", +"% c #4B3E15", +"& c #44391B", +"* c #543800", +"= c #5A3B00", +"- c #4D4015", +"; c #524E25", +": c #5A4F2C", +"> c #524E3D", +", c #58562F", +"< c #53503E", +"1 c #5E623B", +"2 c #634100", +"3 c #684500", +"4 c #6E4900", +"5 c #614F11", +"6 c #685416", +"7 c #734C00", +"8 c #784F00", +"9 c #755B00", +"0 c #7C5200", +"q c #7C5A00", +"w c #7B570F", +"e c #69562F", +"r c #786600", +"t c #7F6A00", +"y c #766300", +"u c #60613F", +"i c #7C6422", +"p c #545143", +"a c #54524B", +"s c gray32", +"d c #5D5D57", +"f c #616641", +"g c #67695D", +"h c #6B734D", +"j c #6C7553", +"k c #616261", +"l c #686A64", +"z c #6B7162", +"x c #727272", +"c c #003DFF", +"v c #0043FF", +"b c #004BFF", +"n c #0053FF", +"m c #015AFF", +"M c #0063FF", +"N c #046DFF", +"B c #0865FF", +"V c #0378FF", +"C c #1663FF", +"Z c #1576FF", +"A c #2678FF", +"S c #6F7B84", +"D c #77856D", +"F c #7B8B75", +"G c #0083FF", +"H c #0197FF", +"J c #0B92FF", +"K c #1385FF", +"L c #01A5FF", +"P c #0DB5FF", +"I c #3096FF", +"U c #2DADFF", +"Y c #2FBCFF", +"T c #22C6FF", +"R c #2AC5FF", +"E c #30D0FF", +"W c #38D5FF", +"Q c #4493F1", +"! c #5F83FF", +"~ c #5F8AFF", +"^ c #5290E4", +"/ c #5F92FF", +"( c #4CAAFE", +") c #40B8FF", +"_ c #779DCB", +"` c #6693E2", +"' c #6290FF", +"] c #649DFF", +"[ c #71A6E5", +"{ c #79A4FF", +"} c #7FB3FF", +"| c #68B8F3", +" . c #42DCFF", +".. c #47E0FF", +"X. c #58E9FF", +"o. c #64C0EB", +"O. c #6ADFEF", +"+. c #825600", +"@. c #845A00", +"#. c #8B5C00", +"$. c #905F00", +"%. c #8C6103", +"&. c #876807", +"*. c #8A6111", +"=. c #886E1B", +"-. c #887600", +";. c #8C7A00", +":. c #936200", +">. c #986800", +",. c #926C22", +"<. c #987A3F", +"1. c #A07200", +"2. c #A27511", +"3. c #A97D15", +"4. c #A77B14", +"5. c #998712", +"6. c #A68000", +"7. c #A78F00", +"8. c #AD8016", +"9. c #AC9600", +"0. c #BB8F00", +"q. c #A99B2A", +"w. c #B9A000", +"e. c #B3A63C", +"r. c #958D43", +"t. c #988F44", +"y. c #9A9346", +"u. c #9F9948", +"i. c #8B897C", +"p. c #958F6F", +"a. c #98937B", +"s. c #A68443", +"d. c #B08C41", +"f. c #AF9462", +"g. c #B39864", +"h. c #B2A850", +"j. c #BDB355", +"k. c #C3972F", +"l. c #C5A400", +"z. c #CCAC00", +"x. c #D7BB00", +"c. c #CCA030", +"v. c #CBB43E", +"b. c #E4AD0C", +"n. c #ECB600", +"m. c #EDB900", +"M. c #F2BB00", +"N. c #C1B84C", +"B. c #C1B757", +"V. c #C5BB58", +"C. c #C9BE5A", +"Z. c #C2A978", +"A. c #DFC000", +"S. c #FDCB00", +"D. c #F6C300", +"F. c #FFD100", +"G. c #FEDB00", +"H. c #FFDF0E", +"J. c #F5D500", +"K. c #FBCD39", +"L. c #FFE832", +"P. c #FFE432", +"I. c #CEC25C", +"U. c #D7C648", +"Y. c #DDC74B", +"T. c #D0C55E", +"R. c #D3C85F", +"E. c #D5C960", +"W. c #DDD264", +"Q. c #E0CA4C", +"!. c #E7D14E", +"~. c #EFDA51", +"^. c #F4D050", +"/. c #F9D452", +"(. c #FEDD53", +"). c #E2D765", +"_. c #E9DD69", +"`. c #E6DD68", +"'. c #FDDB6E", +"]. c #FFEE4F", +"[. c #FEE354", +"{. c #FEEA55", +"}. c #F7E153", +"|. c #FFF056", +" X c #ECE16A", +".X c #F1E56D", +"XX c #F7EA6F", +"oX c #F7EB70", +"OX c #F9EC70", +"+X c #FEF372", +"@X c #979486", +"#X c gray60", +"$X c #969596", +"%X c #8AA193", +"&X c #82A89B", +"*X c #8CAEA3", +"=X c #86A7A9", +"-X c #8BA2B1", +";X c #ACA580", +":X c #A5A291", +">X c #B3AF98", +",X c #B8B7AF", +".k.c.6 FXkXkXkXDXkXkXkXx i b.>.+ YXYXYXYXYXYXYXYXYXYX", +"YXYXYX:.'.K.=.hX1X1X1X1X1X1X1Xd &.0.%.* 7 #.#.:.$.#.2 YXYXYX", +"YXYXYX:./.M.%.$Xk k d s s s e w >.2.d.s.Z.9XrXlXxX0X7 YXYXYX", +"YXYXYX:.^.M.1.: % % - % 5 6 &.GXIXIXPXPXPXPXPXLXIXIXg.3 YXYX", +"YXYX#X:.^.m.v.y.r.r.r.r.h.h.2.IXPXPXKXKXPXKXHXxXUXIXIXf.4 YX", +"YXYX#X:.^.m.Y.I.B.j.j.j.V.I.4.PXKXJXKXJXKXKXmXjXFXIXIXUX+. YX", +"YXYX#X:.^.m.Y.E.I.j.j.j.I.R.8.PXKXSXJXJXJXSXnXeXDXIXIXUX<. YX", +"YXYXYX:./.M.!.W.R.I.T.R.E.W.8.UXJXJXSXSXSXSXnXeX:X@Xi.X@X@X,X4 ", +"YXYXYX:.(.S.}..X X X X X X X8.PXSXAXAXAXAXAXNXzXpXwXwXjX7 ", +"YXYXYX:.(.S.[.OXOXOXoXoXt.; O s a p p p p a.AXMXvXaXzXGX+. ", +"YXYXYX:.(.S.[.+X+X+XOX+X; 7X2X] / / ~ ! 2Xp MXNXNXNXSXKX+. YX", +"YXYXYX:.(.F.|.+X+X+X+X+Xy., _ A m b v c ! p MXMXgXMXAXKX+. YX", +"YXYXYX:.(.F.|.+X+X+X+X+X+Xj.& ^ B n b v ' < gXMXgXgXNXKX+. YX", +"YXYXYX:.(.F.U.W.+X+X+X+X).y.g Q N m n b ~ < gXgXgXgXAXJXq YX", +"YXYXYX:.[.l.j j y.I.j.r.1 =X( K N M m b ~ < gXgXgXgXNXKX+. YX", +"YXYXYX:.[.t 5X4X&XD F =X| U J G V Z A C / < fXgXgXgXMXHX+. YX", +"YXYXYX:.[.l.h 3XX...W T P L H K I [ S ` { < fXfXfXfXMXKX+. YX", +"YXYXYX:.[.G.e.1 *XO...E R Y Y | -Xd Z.k 6X> fXfXfXfXBXJX+. YX", +"YXYXYX:.[.G.{.`.u.1 F &X*X%Xz l a.uXfXp.> p.sXsXsXfXBXJX+. YX", +"YXYXYX:.{.G.|.+X+X XN.q.5.7.q cXvXsXsXsXsXsXsXsXsXsXBXKX+. YX", +"YXYXYX:.|.G.].|.L.H.G.G.G.A.1.JXvXsXsXsXsXsXsXsXfXdXCXPX+. YX", +"YXYXYX:.{.G.G.G.G.G.x.w.;.t :.HXdXsXsXsXsXsXdXvXBXZXLXtX= YX", +"YXYXYX:.{.G.J.x.9.;.r 9 q 0 #.KXvXsXaXsXvXBXCXHXiXg.*.= O YX", +"YXYXYX:.L.9.-.y 9 q 0 = + #.HXbXdXbXVXZXcX8X,.3 $ . YX", +"YXYXYX%.z.9 q 7 * o $.PXZXmXmX0Xs.0 $ X YX", +"YXYXYX8 0 = o :.IXpXg.*.= O YXYXYXYX", +"YXYXYX YXYX@.#.2 @ . YXYXYXYXYXYX", +"YXYXYX YXYXYXYXYX YXYXYXYXYXYXYXYXYX", +"YXYXYXYXYXYXYXYXYXYXYXYXYXYX YXYXYXYXYXYXYXYXYXYXYXYX" +}; diff --git a/src/qprojectM/src/filenew.xpm b/src/qprojectM/src/filenew.xpm new file mode 100644 index 000000000..85efceb22 --- /dev/null +++ b/src/qprojectM/src/filenew.xpm @@ -0,0 +1,216 @@ +/* XPM */ +static char *filenew[] = { +/* columns rows colors chars-per-pixel */ +"32 32 178 2", +" c black", +". c #191000", +"X c #221700", +"o c #452E00", +"O c #4A3100", +"+ c #4E3400", +"@ c #553800", +"# c #604000", +"$ c #6A4600", +"% c #6D4800", +"& c #704A00", +"* c #724C00", +"= c #744C00", +"- c #764E00", +"; c #785000", +": c #805500", +"> c #815500", +", c #835700", +"< c #865900", +"1 c #875A00", +"2 c #8A5B00", +"3 c #8A5C00", +"4 c #8B5C00", +"5 c #8C5D00", +"6 c #8D5D00", +"7 c #8F5E00", +"8 c #805911", +"9 c #905F00", +"0 c #906000", +"q c #926000", +"w c #946200", +"e c #956300", +"r c #966400", +"t c #976400", +"y c #956913", +"u c #926C22", +"i c #9B7732", +"p c #B18D48", +"a c #B28E49", +"s c #B4904A", +"d c #BAA373", +"f c #A1A195", +"g c #ABAB9F", +"h c #ADADAB", +"j c #AFAFAB", +"k c #B3B3A6", +"l c #BCBCB8", +"z c #BFBFBC", +"x c #CBB489", +"c c #CBB58A", +"v c #CDB78B", +"b c #CAB891", +"n c #C9BB9E", +"m c #CEBEA2", +"M c #C6C6BC", +"N c #D9C8A8", +"B c #E8E1BA", +"V c #E8E1BB", +"C c #FEFFA1", +"Z c #FFFFA0", +"A c #FEFFA3", +"S c #FEFFA4", +"D c #FEFFA6", +"F c #FEFFA8", +"G c #FEFFA9", +"H c #FFFFA8", +"J c #FEFFAA", +"K c #FEFFAB", +"L c #FFFFAB", +"P c #FEFFAC", +"I c #FFFFAC", +"U c #FEFFAE", +"Y c #FEFFAF", +"T c #FEFFB0", +"R c #FEFFB1", +"E c #FFFFB0", +"W c #FEFFB4", +"Q c #FEFFB5", +"! c #FFFFB4", +"~ c #FEFFB8", +"^ c #FEFFB9", +"/ c #FFFFB8", +"( c #FFFFB9", +") c #FEFFBB", +"_ c #FFFFBA", +"` c #FEFFBD", +"' c #FFFFBD", +"] c #FEFFBE", +"[ c #FFFFBE", +"{ c #C8C8C1", +"} c #CACAC4", +"| c #CBCBC6", +" . c #DBD2C1", +".. c #DEDFCF", +"X. c #D4D4D1", +"o. c #E1D5C1", +"O. c #E3D9C3", +"+. c #E5DCCC", +"@. c #E8E8D3", +"#. c #ECECD7", +"$. c #F0EBDA", +"%. c #FEFFC2", +"&. c #FEFFC3", +"*. c #FFFFC2", +"=. c #FEFFC7", +"-. c #FFFFC7", +";. c #FEFFCB", +":. c #FEFFCC", +">. c #FFFFCC", +",. c #FEFFCE", +"<. c #FEFFD0", +"1. c #FEFFD1", +"2. c #FFFFD0", +"3. c #FFFFD1", +"4. c #FFFFD3", +"5. c #FEFFD5", +"6. c #FFFFD5", +"7. c #FEFFD6", +"8. c #FEFFD7", +"9. c #FFFFD6", +"0. c #FFFFD8", +"q. c #FEFFDA", +"w. c #FFFFDA", +"e. c #FFFFDB", +"r. c #FFFFDC", +"t. c #FEFFDE", +"y. c #FEFFDF", +"u. c #FFFFDE", +"i. c #FFFFDF", +"p. c #E9E9E7", +"a. c #F3F3E9", +"s. c #F3F3EB", +"d. c #F5F5E8", +"f. c #F8F8E3", +"g. c #FEFFE0", +"h. c LightYellow", +"j. c #FFFFE1", +"k. c #FEFFE3", +"l. c #FFFFE3", +"z. c #FDFEE7", +"x. c #FEFFE4", +"c. c #FEFFE5", +"v. c #FFFFE4", +"b. c #FBFBE9", +"n. c #FEFFE8", +"m. c #FFFFE8", +"M. c #FFFFE9", +"N. c #FFFFEA", +"B. c #FEFFEC", +"V. c #FEFFED", +"C. c #FFFFEC", +"Z. c #FFFFED", +"A. c #FEFFEF", +"S. c #F4F4F0", +"D. c #F4F4F3", +"F. c #F5F5F4", +"G. c #F8F8F6", +"H. c ivory", +"J. c #FFFFF1", +"K. c #FEFFF3", +"L. c #FFFFF3", +"P. c #FEFFF4", +"I. c #FFFFF4", +"U. c #FEFFF7", +"Y. c #FFFFF6", +"T. c #FFFFF7", +"R. c #FBFBFB", +"E. c #FFFFF8", +"W. c #FFFFF9", +"Q. c #FFFFFA", +"!. c #FFFFFB", +"~. c gray99", +"^. c #FEFFFD", +"/. c #FFFFFC", +"(. c #FFFFFD", +"). c #FFFFFE", +"_. c gray100", +"`. c None", +/* pixels */ +"`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.`.w 2 1 w 4 4 4 6 w 9 6 - `.`.`.`.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.r s p p c c c c N O.+.o.y # `.`.`.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.r ).).).).).).).).F.p.). .& o `.`.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w ).E.).E.).E.E.E.S.X.).R.n $ + `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w E.Y.Y.E.Y.E.E.E.a.| ).).D.m % `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w E.Y.Y.J.Y.J.Y.Y.a.| ).).).D.> `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w Y.J.J.J.J.J.J.J.a.M l h h { ; `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w Y.B.B.B.N.N.B.B.b...k f h } ; `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w J.N.N.N.N.N.N.N.l.f.#.@.#.a.> `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w J.l.l.l.l.l.l.l.l.l.l.l.l.J.> `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w J.r.l.l.r.l.r.l.r.l.r.l.r.J.1 `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w B.r.r.q.q.q.q.q.q.r.q.q.r.B.> `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w N.5.5.5.5.q.5.5.5.5.5.5.5.B., `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w N.<.<.<.<.<.<.<.5.<.<.<.<.N., `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w l.,.;.;.;.,.;.,.;.,.;.;.;.l., `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w l.-.-.-.-.-.-.;.-.-.-.-.;.l.> `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w l.-.%.%.%.%.%.%.%.%.%.%.%.l., `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w r.' ' ' ' ' ) ' ' ' ' ' ' r., `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w r.) ) W ) ) ) ) ) ) W ) ) q., `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w q.W W W W W W W W W W W W q., `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w 5.Y Y W Y Y Y Y Y Y Y Y Y 5., `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w 5.J J J Y J Y Y J Y J J Y q., `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w 5.J J D J J D J D J W ) ,.$.- `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w <.Z D D Z D J Y ' ,.B b i - O `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w <.Z Z Z Y ) <.B d u & @ X `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w ,.J ) ,.B d y & o . `.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.w Y.V d u & o . `.`.`.`.`.`.`.`.", +"`.`.`.`.`.`.`.`.1 4 & o . `.`.`.`.`.`.`.`.`.`.`.", +"`.`.`.`.`.`.`.`. `.`.`.`.`.`.`.`.`.`.`.`.`.`.", +"`.`.`.`.`.`.`.`. `.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`." +}; diff --git a/src/qprojectM/src/fileopen.xpm b/src/qprojectM/src/fileopen.xpm new file mode 100644 index 000000000..a6c33b62f --- /dev/null +++ b/src/qprojectM/src/fileopen.xpm @@ -0,0 +1,295 @@ +/* XPM */ +static char *fileopen[] = { +/* columns rows colors chars-per-pixel */ +"32 32 257 2", +" c black", +". c #0B0900", +"X c #130E00", +"o c #161100", +"O c #231A00", +"+ c #352600", +"@ c #3B311C", +"# c #433100", +"$ c #4F3B00", +"% c #4A3E16", +"& c #4A3D22", +"* c #4D421A", +"= c #54420D", +"- c #4E4529", +"; c #484338", +": c #484233", +"> c #5B4B24", +", c #624500", +"< c #674D00", +"1 c #6D4D00", +"2 c #6E4F17", +"3 c #6D5200", +"4 c #775500", +"5 c #745B0F", +"6 c #795200", +"7 c #7A5A00", +"8 c #715C18", +"9 c #764B0A", +"0 c #6C5423", +"q c #6D592E", +"w c #785E27", +"e c #735626", +"r c #665736", +"t c #7A631D", +"y c #7A672E", +"u c #776535", +"i c #5C5956", +"p c #78704F", +"a c #75726E", +"s c #8D4F00", +"d c #815700", +"f c #835A00", +"g c #8A5C00", +"h c #866400", +"j c #966100", +"k c #956F00", +"l c #9C6100", +"z c #9D7500", +"x c #856B2A", +"c c #8C752A", +"v c #8C723B", +"b c #977939", +"n c #A45D00", +"m c #A26100", +"M c #AA680D", +"N c #AB6700", +"B c #A07700", +"V c #A57B00", +"C c #AB7A00", +"Z c #AA7300", +"A c #AF721A", +"S c #B87E00", +"D c #B57B00", +"F c #B0731A", +"G c #B47C26", +"H c #B77E28", +"J c #897F59", +"K c #977C40", +"L c #927F58", +"P c #807A6C", +"I c #9C821D", +"U c #9F8A35", +"Y c #AC8000", +"T c #B28500", +"R c #B68800", +"E c #BB8B00", +"W c #A78337", +"Q c #A28B31", +"! c #AF9535", +"~ c #B58E3A", +"^ c #B88633", +"/ c #B49936", +"( c #BCA039", +") c #998445", +"_ c #978657", +"` c #8B8264", +"' c #8E8572", +"] c #978864", +"[ c #978C75", +"{ c #9F9072", +"} c #A38845", +"| c #A48952", +" . c #AA965C", +".. c #A89156", +"X. c #B5934D", +"o. c #B39D45", +"O. c #B49755", +"+. c #AB984A", +"@. c #AD9A65", +"#. c #A79778", +"$. c #A59874", +"%. c #A29B7A", +"&. c #A79775", +"*. c #BDA959", +"=. c #B3A46C", +"-. c #B1A07F", +";. c #B5A97A", +":. c #BEB37B", +">. c #C49200", +",. c #C89500", +"<. c #CC9800", +"1. c #C69812", +"2. c #D2A31C", +"3. c #C2A63E", +"4. c #D7AE37", +"5. c #C29840", +"6. c #C29B4E", +"7. c #C2A641", +"8. c #C6AA43", +"9. c #C8AC45", +"0. c #CBAF49", +"q. c #CAA746", +"w. c #C4A158", +"e. c #CAA65D", +"r. c #CEA857", +"t. c #CFA95A", +"y. c #C5AC50", +"u. c #CDB14B", +"i. c #CBB358", +"p. c #CAB152", +"a. c #D2AB59", +"s. c #D1B54D", +"d. c #D4B951", +"f. c #D6BC5B", +"g. c #DDB45E", +"h. c #D9BD56", +"j. c #D2B753", +"k. c #DAAB48", +"l. c #CEAE69", +"z. c #CCAD67", +"x. c #CCB662", +"c. c #CAB26B", +"v. c #C8B66B", +"b. c #CEB775", +"n. c #CEBE7F", +"m. c #D3AD66", +"M. c #D5BE64", +"N. c #D4BF6D", +"B. c #E4B34B", +"V. c #E0B75F", +"C. c #E1B85F", +"Z. c #E4BA61", +"A. c #E9BE63", +"S. c #DDC159", +"D. c #DAC269", +"F. c #D4C176", +"G. c #D8C67F", +"H. c #E1C55D", +"J. c #EFC05D", +"K. c #F1C15E", +"L. c #E0C264", +"P. c #E5C961", +"I. c #EDC164", +"U. c #E9CD65", +"Y. c #EFD36B", +"T. c #F2C564", +"R. c #F6C868", +"E. c #F8C760", +"W. c #FBCC6A", +"Q. c #FDCB63", +"!. c #F1D56D", +"~. c #FFD06C", +"^. c #F5D972", +"/. c #FED175", +"(. c #FADE77", +"). c #E4C87A", +"_. c #FEE27C", +"`. c #8F9192", +"'. c #9A9A96", +"]. c #A79F83", +"[. c #ADA583", +"{. c #A7A399", +"}. c #BBAC86", +"|. c #BDB088", +" X c #BBB298", +".X c #A7A8A6", +"XX c #ADAEB0", +"oX c #B5B6B4", +"OX c #BABCBC", +"+X c #C6B38E", +"@X c #D3BE80", +"#X c #D0BC95", +"$X c #C6BFA6", +"%X c #C5C29D", +"&X c #D2C283", +"*X c #DAC789", +"=X c #DBCA8B", +"-X c #D5C489", +";X c #DBCD94", +":X c #D6C699", +">X c #CFC8B1", +",X c #C8C6B7", +".L.ZXyXT.K.E.wX ..XKXKXR YXYX", +"YXYXYXYXYXYXYXYXYXYXYXYX V E 4.ZXsXW.K.I.Z.O.{.KXUXUXMXk YXYX", +"YXYXYXYXYXYX R E 7 YX< E 2.aXsX6XC.T.Z.w.[ xXUXUXUXUX2X3 YXYX", +"YXYXYXYX R >.).5X,.T ,.5XCX8XK.T.A.a.] OXUXUXUXUXUXUX2.O YXYX", +"YXYX Y E Z.ZXsX7XsX0XCXyXR.K.I.V._ .XUXUXUXUXUXLXKXJXV D N S 7 ", +" z E 4.fXsX/.K.~./.6X~.I.I.C...'.KXUXPXPXPXLXKXGXbXl.N m.SXm.D ", +" E 0XgX7XE.W.W.~.~.R.I.Z.w.' bXUXUXUXPXPXLXmXbX$X) ~ aXSXpXBXn ", +" <.CXT.Q.~.W.W.R.I.A.t._ hXUXUXUXUXPXLXGXnX,X .t XAXSXeX4Xl.Z ", +" <.sXB.W.W.W.T.A.g._ oXUXUXUXUXUXLXLXmXcX=.5 $.BXgXeX!.D.3Xm + ", +" <.sXB.R.R.A.V.| {.KXUXUXUXUXLXKXGXvX|.c u qXdXgX^.U.f.3XH f ", +" <.sXB.T.Z.m.[ nXUXUXUXUXPXKXHXbX,X) e X) y >XAXAX_.S.h.h.u.s.d.F.6.g YX", +" >.9X~ } u '.LXKXmXxX .5 [.IXAX_.!.S.h.h.d.8.s.D.n.j YXYX", +" >.:XW v & kXmXvX;.t ] BXAXrX!.U.u.S.9.u.3.7.i.;XM 1 YXYXYX", +" E #Xb u : nXcX_ u 1XSXgX^.U.H.S.d.8.s.d.u.b.-XG g YXYXYXYX", +" R +Xc r a zX[.= -XdX_.U.d.P.h.d.u.3.8.N.=Xw.l 1 YXYXYXYX", +" T }.x > `.oX> %.*.S.S.h.S.7.d.h.0.p.n.c.M d . YXYXYXYXYX", +" C ].w @ XXu p *.( h.S.s.u.u.u.p.N.*X^ g + YXYXYXYXYXYX", +" Z &.e ; ` * :.o.S.S.S.u.( 9.x.&XX.j , YXYXYXYXYXYX", +" B { 0 i % [.o.u.S.d.h.9.M.&Xz.M 6 YXYXYXYXYXYXYXYX", +" z { 0 - J *./ S.9.d.i.G.&XF g O YXYXYXYXYXYXYXYXYXYX", +" z $.2 w =.! s.d.p.N.;X^ l , YXYXYXYXYXYXYXYXYXYXYX", +" B &.9 ;.Q / j.x.@Xl.m 6 YXYXYXYXYXYXYXYXYXYXYXYXYX", +" h W @.+.I y.&Xb.F 7 O YXYXYXYXYXYXYXYXYXYXYXYXYXYXYX", +" $ s %XU F.=X^ j # YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX", +" g O. c #23224B", +", c #262353", +"< c #292655", +"1 c #2B2C54", +"2 c #2C2C5B", +"3 c #293746", +"4 c #2D304F", +"5 c #243243", +"6 c #2E315D", +"7 c #363647", +"8 c #303E4A", +"9 c #30325E", +"0 c #3C3C53", +"q c #2E2E60", +"w c #2F3160", +"e c #302E63", +"r c #313164", +"t c #363861", +"y c #353868", +"u c #384650", +"i c #284F6B", +"p c #2D547B", +"a c #3B486A", +"s c #36597D", +"d c #3D5D7C", +"f c #4C4C4C", +"g c #40405A", +"h c #414E56", +"j c #4B585E", +"k c #49545E", +"l c #555555", +"z c #4D4D6B", +"x c #434675", +"c c #4B5660", +"v c #4F5962", +"b c #41517E", +"n c #4B507D", +"m c #515C67", +"M c #505D6E", +"N c #5C5D7D", +"B c #546066", +"V c #54626D", +"C c #5B646D", +"Z c #55677A", +"A c #556B78", +"S c #5D6772", +"D c #6B6B6B", +"F c #646464", +"G c #616C73", +"H c #63707D", +"J c #6B7679", +"K c gray45", +"L c #00418E", +"P c #004494", +"I c #004894", +"U c #044F98", +"Y c #03509B", +"T c #0A5198", +"R c #13579C", +"E c #185DA1", +"W c #285888", +"Q c #2B6094", +"! c #396D9A", +"~ c #336A96", +"^ c #3D719B", +"/ c #226EB8", +"( c #326EA8", +") c #326BA3", +"_ c #3673AE", +"` c #3A76B4", +"' c #0B6FD1", +"] c #0F75D8", +"[ c #1479DA", +"{ c #1B7CDC", +"} c #466481", +"| c #42749C", +" . c #4A799E", +".. c #506A84", +"X. c #5F678D", +"o. c #576391", +"O. c #5A6592", +"+. c #5F6893", +"@. c #5B738B", +"#. c #507DA1", +"$. c #626283", +"%. c #636A94", +"&. c #656F98", +"*. c #657A8F", +"=. c #6B7299", +"-. c #717191", +";. c #797998", +":. c #687BA6", +">. c #2281DC", +",. c #3F81C0", +"<. c #3988D7", +"1. c #2785E1", +"2. c #2E8AE3", +"3. c #368FE5", +"4. c #3690E6", +"5. c #3D93E7", +"6. c #3D94E9", +"7. c #57839E", +"8. c #4787BC", +"9. c #5480A1", +"0. c #5B84A3", +"q. c #6E8496", +"w. c #6E8B9A", +"e. c #7D848E", +"r. c #728597", +"t. c #738598", +"y. c #768899", +"u. c #7B8B9B", +"i. c #6489A5", +"p. c #698EA7", +"a. c #6D8FA9", +"s. c #6E81AB", +"d. c #7683A6", +"f. c #768CB7", +"g. c #7395AD", +"h. c #7C96B0", +"j. c #4086CA", +"k. c #4986C3", +"l. c #4284C3", +"z. c #498ED2", +"x. c #4D95DB", +"c. c #548DC5", +"v. c #5D92C8", +"b. c #5593C9", +"n. c #5097DE", +"m. c #5198DE", +"M. c #4296E7", +"N. c #4895E2", +"B. c #4B99E5", +"V. c #4A9CEB", +"C. c #4599EB", +"Z. c #529DE6", +"A. c #589EE2", +"S. c #54A1EB", +"D. c #5AA1E6", +"F. c #5AA5EB", +"G. c #5EA8EF", +"H. c #53A3F1", +"J. c #5EAAF2", +"K. c #6699CB", +"L. c #799BC8", +"P. c #7EA6C9", +"I. c #60A2E5", +"U. c #65A7E8", +"Y. c #6BABE9", +"T. c #68ADF2", +"R. c #67B0F5", +"E. c #6DB3F6", +"W. c #70ADEA", +"Q. c #75B0E9", +"!. c #7CB5EB", +"~. c #73B9F8", +"^. c #7BBDFB", +"/. c #7CBAF6", +"(. c gray55", +"). c #828899", +"_. c #84949E", +"`. c #918E8A", +"'. c #949494", +"]. c #8F8FA9", +"[. c #8997A5", +"{. c #8A9AA9", +"}. c #9A9BAF", +"|. c #9399A9", +" X c #9FAAB5", +".X c #A29E9B", +"XX c #A7A7A7", +"oX c #ABABAB", +"OX c #A3A3B4", +"+X c #A8A8B7", +"@X c #A3ABB3", +"#X c #B4B5B5", +"$X c #B0B0BC", +"%X c #B7B9BC", +"&X c #BBB7B3", +"*X c #BBBBBB", +"=X c #82B1DB", +"-X c #81B7EC", +";X c #88BBED", +":X c #86BAED", +">X c #AEBBC8", +",X c #A6BDCD", +".U i 9 YXYX", +"YXYXYXo.2X] L C UXDXcXzXkXkXkXjXjXdXdX%X%X&X%X*XN.' ~ 6 YXYX", +"YXYXYXo.1X] P k hXoXXXXXoXoX#X#X*X%X&X%X%XdXkXxXx.[ ~ 6 YXYX", +"YXYXYXO.3X[ I m FXkXjXjXkXkXkXkXkXkXzXzXzXcXZXSXx.{ ! 6 YXYX", +"YXYXYXo.3X{ I S UXvXxXzXkXkXkXkXkXjXdX*X%X#X&X%XZ.1.^ 9 YXYX", +"YXYXYXO.4X>.U j jX#X#X#X%XdXdXkXzXkXzXzXcXvXDXJXA.1.| 6 YXYX", +"YXYXYXO.6X>.T V PXZXZXZXAXSXDXDXFXHXDXHXHXHXHXSXI.2.| 9 YXYX", +"YXYXYXO.6X2.T G UXLXDXDXAXZXZXAXZXvXcXzXkXkXkXgXY.3. .6 YXYX", +"YXYXYXO.9X4.R m zXdXdXkXzXvXAXDXHXLXPXPXIXUXUXUXQ.6. .9 YXYX", +"YXYXYXO.9X5.R H UXIXUXUXUXUXUXUXUXUXUXUXIXKXJXBX-XC.#.9 YXYX", +"YXYXYXO.eXM./ h.UXUXIXKXBXNXnXuXyXwX5X:X!.Y.Y.Y.D.H.9.6 YXYX", +"YXYXYX+.rXB.<.x.Q.;X-XQ.Y.U.U.D.Z.Z.B.B.C.V.V.B.B.T.0.9 YXYX", +"YXYXYX+.tXB.N.B.B.B.B.C.V.V.H.H.H.D.N.z.8._ ( <.D.R.0.9 YXYX", +"YXYXYX+.tXS.Z.F.D.m.z.l.` ) Q W p s } @.r.[. X>XG.E.0.9 YXYX", +"YXYXYX+.pXU.m.) p d ..*.u.|.+X @ o YXYXYXYXYXYXYXYXYXYXYXYX", +"YXYXYX YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX", +"YXYXYX YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX" +}; diff --git a/src/qprojectM/src/images/icons/CMakeLists.txt b/src/qprojectM/src/images/icons/CMakeLists.txt new file mode 100644 index 000000000..4ab1c030b --- /dev/null +++ b/src/qprojectM/src/images/icons/CMakeLists.txt @@ -0,0 +1,4 @@ +########### install files ############### + +kde4_install_icons( ${DATA_INSTALL_DIR}/amarok/icons ) + diff --git a/src/qprojectM/src/images/icons/hi16-action-collection.png b/src/qprojectM/src/images/icons/hi16-action-collection.png new file mode 100644 index 0000000000000000000000000000000000000000..0923e0cdfe1a4c273e756f94a8667ff79d4f190f GIT binary patch literal 942 zcmV;f15x~mP)5r00004b3#c}2nYxW zd9$O-V+${yw*OsTTpcQ#h0GdVgTXrP^EmwBbCDYpC`({U9}-6By@Gi@B+ev zeTCx2UU%`QnWVK)D4^#7H!kVYEJkuKw?|jod$(V3wHYMQX8HSQ! zVr^DKcUNTd(3o?ot6kxVxB|u)e1+fDU*D{Sd$+D5-K`p|Z?}O>cf~OL z(QU}J*!Xg41#(RmJg1ConuCWp#x5|w|Co6FPmA|3A_9A&p2@_#5BzJTZ7o!Zoc<)k ze4pWq(JE$_Jd7>q5XeQ86a8w0mn>hLys^Z3Xed+y5#3sCZWmt9Kc^)Qb;k4(XM@v5caN@FLw`Fy# z%>;~x#aJWrj|Z+Kk5Bwk_e+L}gD*s5*DAv6q)L09d{|MnL;|xVt!{DkVk5(d=AVN_jFaWcQ40rGKEz3nKozmz2*MLT}A00_~W!I;%+Q<(MX0Dd8 zU^qDboq%m`@Twn{pKpZ!V{j{cI@lbS{e!N@+5>_VmT26xg#C0xocMS5FX>`-yd5@| QDgXcg07*qoM6N<$f=XMu>i_@% literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_add_lyrics.png b/src/qprojectM/src/images/icons/hi16-action-projectm_add_lyrics.png new file mode 100644 index 0000000000000000000000000000000000000000..eae64b40b1ec11f43d8b499ba3374e65eb440f81 GIT binary patch literal 650 zcmV;50(Jd~P)Vmt6+@-bO5PN(fCD9xJ7>x#8~MPe0?W(p2LG_hc6p&a3mC6`Ns-I zGJ`NBOtNO!N~kxAG@6DWvV_Um^-P%0KwH*!EU%U{eZ3Ar3-RUuo3)2Y%Bx|u@VF=EbJ6f(WDTqOjJmsi4r9-kKK*CGjnH-MPRi|$OotT z9vsd?RF&<(0?0M(0}cWHCVeUJPVdTRiLR%&`@7}haF6WtEoM`0NB;h+u1+oJ0~$)|M*Sl5 zs~)}w{kv0E)?!Lg*wj3EHOb4$K4Yzm&B*Y6N>O{0bXlF}vu*rZ5BRi@bLT<>m(?jn z#ir)yP!Im2x|o7^1i`=L#6h(Vje15$3q;0IsYA5^|8G19LyDfohGLoi5i&LF0C+r+ zK*9K!0D}<^%>`6QYAMcmq+*y`f#tf87z2qz z6;wBL##jP8EJ;RZSqO|l3|u`GGX1T>hmR>=l3keZ%Un4TQti$d?A?LqfvS=^g~VY= z9eX-Fx*~&TgnWd!KXmIcM*=Ie$8HXRK+8av)=bVNjSM zC9^;Jp%jDYhv;GOB|;;?k%H2GK$O52p`nKY$%jA%qX(lgf`X)?F+@}x?u?m=&7Ilj zp0m&1=X^cPbsE>h_q15w_pQZZM1w@Shu&e?$}B z^*i{t1=uTwMFBqWId;7;7I<$8&;S1b96bFI!6IA|Q-M_-0!Nq}un zqDqW!`a0>6V{a9zyA>cJq>U75njvkZV2q*kD){htlzlrDp3+}cwgLbLfEaG?hCa9H z^qx{xTbrjb2B{>Zj3JdorA49ICh)~r5Z%{m9*?%oy$b*gPu}c~LtOgxpf7tn7#1HQ zEO#b1IXGhwo`>4izcKw!j+YMiCW+x|xny?y)luvBv^O_5=fzpV8wYH%>xj*2w?agr zz&w) zKo$~=F>GFI;vaqsUgj<W3Y@k!&zxFh-L>i+Eep2JfY%;$%WrX~!- zMNedm;QcO1wyj_ z@|d|l|GMPES__?MEa(I~w(_t&rq{&ah23J^#c`IqvFA62K5LpPM1Z;u;FraWm&ZF~ z7|^ECp&}^D5}^=S*(UKoANgdl{+?Cd$i)6Oxu!n=z;Ih+;_F6!_K)l&L+|hRDut<| zpBdGEw?bEEC+b=ww-#{}Ln(z&h-SEpn7w8({LE}4&FFqkGlN%b;`Y7wX^`|)dtjY| zF$VSddFVt#YmLm9rHHL1yuJ5EirgKd+TgXNE~x4+C!TmT+%o=7CE{Eo%`yN$i&9Wh zK`DiL-N&}qYsqviKeM3A7in&N_J5h;pQ13tco49iPd~-|;US3bE})}>;qqmH$sduP z`YwZWbif#TpBf`{M;n*w=}oSRCH9DbZ72#_ZF0275j&?f9V<(mq+;Xw<^2Bu4tai( T-xxPy00000NkvXXu0mjf8~wMS literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_artist.png b/src/qprojectM/src/images/icons/hi16-action-projectm_artist.png new file mode 100644 index 0000000000000000000000000000000000000000..eca23af0ab461dfe1505772f0ecc3f867f366092 GIT binary patch literal 704 zcmV;x0zdtUP)2x&Nnt#*WrenUOL_}|N zsA*2LOD|ACmaBO=IEW_43@*TGdOnQc-^C=wv5X)@@@N1&v0u2jEDdLnI@N}rq1=+<#gD4 z$G5O0Xkjw|22NTTdKK*I>&Q8`W&;2SO+Ajhc{f+udeh%MI2@07MZhBf!Gv6<)01o0 zkq;H?0st`aww1>FtIzO=b;M_*0j~&nM8IIn*{s>Ha@Sbet6mrQpWz230QmU8*ew&LuJ}Jq1U(`!7gJ&T0sG#9iq4BE0RZ5AS=AMr z9BmsL`V#VpfYMZ;$+PhnbbPygb%}_QPFkM(s=i@l!Fh|QrB9;b-92B^v#zU&C^dkH zkjA^)jmJh8>)k}>?<}nF#i(kzQ8!9!7}vJk3^UDA*af(OCqOM_~ILez+*Kno1N-PKi5$8~mgS7+y)x08Q? zU3yN><@sG6euOcG&4k<3`dnp@FGAs2kkLQvW3N6oaAN>KYA9b{ z$~A7^iZWHh!uN63{N@Jti35NO&$OFIGDv4k6f0kn_1VxGv!*BFK}iNals{Ip0N`2? zYsyI>cO_Y$S0l_B7p+$V06EqaK3$k?>KOBC?_KV-+UYi%1ONq%THT=xa)(lcJ6)l? zlZT@}s}TfRYJ}p1D%rNUqK8)I{8}PB6afuaTeTCDi>$N3hNdr00^p1aukWW*A2#~_}b7@6Hq>}%5Rg0l|cb) z?$4y!Yqs*|M@GY!32)BN%Cfvpup53JydCK3@AW_7mRIT8s7Dh5iZ--7ELHoc$>Cel zH6^IGu5^lnljETd&TP!lB6@1q3s3I1KL5qlpuXU6S|8>fh4t9TmPS8@DTKjQ7jbOBiDi%jW9L>GtMGKt))N z%nAgWCE1!5Sq=@z?wJ$XN;nc*yz7fGY0G}qCx0b8#~b1;d7-hT2D0ITA$KC5OA^n( z!0!arDf5R1s8?#IyEOMyBl-Vj`U}NQG*35pSN#A0 N002ovPDHLkV1mGEVPF6N literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_back.png b/src/qprojectM/src/images/icons/hi16-action-projectm_back.png new file mode 100644 index 0000000000000000000000000000000000000000..63642764cc222fdb335191a0d3bc32dbca51aee0 GIT binary patch literal 945 zcmV;i15W&jP)7lk3 zsV!Pd#YiluNWeq!7C{h?-nN0%*2V1j zDD=sROCjXZm5 zaDR%XxN)B?(=gc8W^wlTKGmIWI~7k@WIuoJ4lom&oSd{DJ92jH=`%09`s7fzy1HQU z(GMoG%LYgHY6OS`E>D?sJ^=f>lhkx;Z?#shTzvoCUkulE`}&4X51%;PqY^R2jXBNG zLk0_rAtG>NL3r(B;rkiQMny=(6ekY%sD1q>hh5k0Gac7;T*t|@G+SG0e#nw%Q7klg z;}Qfa&XI#n%-^k}Lych2(rn?R)0wjCI%Zd9pg-NwVkrbIim)1zUl$tMAl{LrJ!z0H zL#Z4Qg@P7P2rRI8+gIiA=k?hx*>?fw)wVgWA08T zZm+J@f-urnq!f)xon>Fp3u~+`7uo3S#Oh2^S&wKmgnDEmBCHl`L8dEt+i)FcrBd~C zm0E<>Lg+^%?q zPDSd@pV;`AF~ytbQ+#t_7ei)=m}m?Gu1)9V(8H}0j^oTDA{2|o!Aqb0mi=z(FS)l? zlhS%1o7IN+K_rbZ5$7WIkwaGQR}=8}JVXfBv;FI(4(~d?I0F+*Hz1 z3i5?o5Cl4RY%n$P_@UG|aC19^|Bo|Z0|&H-Gk3S#4{%^_+bu(>6<`jyFV24hbIz2m T9Zj3700000NkvXXu0mjf1W~(XqJB(#Dy zt)N9GO*l2vqubth{nL%i_4;AqsAL~WZ;cba*Im*8C~uxQ^yXF>xMe^9MS(O;X$5UW z6|azIbiB>&+r8gfvDI%$81JMV4+6-|=Qdu_YnBfU2r}=7D26Xb0mq~0xy*$TUS^s* zR{hcAnD{=+%tlMxG=2u4ClhUX@Wysm9LE6ECzVzAw}VHwhhN?EvT2>1vPlJsp2yJY zaFI)Nua%8WqsvaN&25~1N@8=dm-TsTU&x^o5xc*LI&)34V`^`8UA3goKKDl8yPk_z zbh+m89N}zdrDcWj(JPiadB>QSqBOH&yq@y<$HJX28cv*wW&IlaYCw1IZECGsEr5bs z0J}go=>)>SFKhAz`|AyNEh*I}=5%7LDb1M9xr0M6#^?3;J$!CEcJP@2SLHgcb zMUwIl7Q)?D)_%pksJmL~Uu^r|jB~?PhNmA&s4OmF+a5dL4x@KIXw;j2vR<2mC;#5W z+_w%wD30wfl8#mGm84P;o%L1DoJF!(>(fRfd0gY`+W))-85sgbfDTXvYCr@WQC)l9 e!-4|;1%Cnqd{3Z%9(TF`0000_&NTCJ zlRNj`<6=^5#E%0H=Y#V*oXt;(2#w{-|mMznYIx4S5VNIY%%?4PxiwP-u~2h`p~h_qa%X@=dNnL zz6KKhKMFW{Xkg%}=Uy7sUA+Uj_JoaNd&DE~*|&AR`q3cOswjt=*Pj=TA2d06Ua?%( z?217oqWI(uoAy2Xa=LGCU)IznZ8o$-Var#L+Qt5k3O7oM!fl1?3BPW|cyaF*s})Tx zP?*{zoqjxLXl*GGAz?#23YH1G;~}qREz-#l+ftZ%d-kl*lWOjY2->nR>UDQ|(+f$& z!M4CKgzh#7MbR2lBy2^tU(u!m&Rw(kqiT?7flV)D)7_fZyOUO7?Vd}fJH&A`sgx#i zr%q=_jG=Uh>xb+~Y94F#Szb5j>C!|kVeOtvcYAC~&Cky}vn$q>!v}l%6$;Z-XwyKO z%~}BuYQpD*5Zg8}Oz7`yu=dN{Te9w8&XVAO>O)A!sV3MKuI6qUB>^<~i!Sr^SquN_Z|G z=W_3NzH@(^L(GibMno2XMj|0DG?HTCBCYa&Vjm@Oq{W*CNn>O+CSyZ1-N6UjN1T6TEd$#N#+ zawg;Qx|8M9vcrkwoVxem*|-eV4O*53W-gpSO4)K{=;83q!ArfZ#{wub#GY&ELg299 zM1N-k)du~&hR?+K%g5gU%xcMG(mHv%fB3@XYj?WZYRNPN82B$VjS#TP;i{@=&fUz8 zJbCm{NGTf|+xiB&+r#A32+TMTK8?`b9;SwP&w!M&QMaYErENzlD@-tosSY$kWrYbl z7>s13wDnM=B_6D)GzkpFw2%7Fc+WZ`SW{^_;S+J)vMeyDfFesN1~dWM5g`JUSCZV} zTb2dAF6diW{pIGjJ!N`CU}g{zbOuNi>Vui#fuIx@--5CF+s#KpLARHEP@Tl8D7(PS>e$Vr$ErnE$#CDvpAPfUXt1C<@Gfao~A8(c2MC)YsQLv{Tc$ zjqU3%#!|zAaQhp<+43wKhKzhy1=kqGn(Ha;%(;P?um??ef{&ogn0ccXp_Tu+U8~~b*_~!-D f3V=lbd)oOg=U5&#Bvp>|00000NkvXXu0mjfCZ2C) literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_clock.png b/src/qprojectM/src/images/icons/hi16-action-projectm_clock.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f38d041e78677338a0155d2d6a73e588a67e8a GIT binary patch literal 935 zcmV;Y16cftP)*Yopl(;Kfn9FkKUQ5<7qxj9X_1n%o&?5rHCSW zGbnK&D1jsT6Outez35egAR_0h*t-pKi?SHYHX&+Fbgp^SX5^elMa{I%IO?1a=lt&9 zLoY&e-c7<6CjdMEDTA(ftg@x?cpWdD zJkI>wEY@0zOKONj1=d=!nGCPJ`U)>J)MKn|nVnnc0?xZdrSaOlyu7}lTR(b!C`467 z1<_~}Yb`U20fiBPp97xf5wEVs^E^gIZWAb8zcc#VH=YdCnY!AT-+uZOGMmL9_7AkZ zso33hF=1zamiqf2tX4EOH2TAL#ydSJgQi2zMiByXeIIk+D?6K#on04W{|_iEDx#yK zoz>JDQU=YA5KeO<@heMzE@Q04Sc}pcsSRIE=JN41fz+BnX|ypIYni$~&4UM12;nq) zL7*_&qO~C_62RK;V&YifDCwViOJRAVcvDaI0G7;O;PLe^FUkNGRmux-PEcfDo*%uHZkF zM=Vyu`le!LcIo{udOrGLuZcZFBNM0AH`ZJ3B?kGt`#b>Ybedym=|3yWTn)jdpP%f`PmaV{|oO}jdb|X2^|0c002ov JPDHLkV1hpkyTJee literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_collection.png b/src/qprojectM/src/images/icons/hi16-action-projectm_collection.png new file mode 100644 index 0000000000000000000000000000000000000000..3af9fb515ac23454bedc9ea6a31753690a8cfb81 GIT binary patch literal 922 zcmV;L17-Y)P)5r00004b3#c}2nYxW zdCGrP01o86rlqamr;#ztC7n^dgi zp%Fqw3W-#(wbaxg>MDg2nqmv}pwnus?fu}GrS#_nY;xjt_(Cvdj zY|!4Q%GkgAwNP8u>0qX0;mW@Z-%T{y<5%f6_v^&|M*^hZY*iIpJ-u5}bIk$*0OuY^ z6vA-?o_#M?w>a$;Co&WFI`n>xaW}vEInEw$1};nqbPjR5`_0I{RZ-!GHr6hljjO)1 z?*7jI05x!)%4N%Pxl+OB-*bmJ-e_Ag+P-zHW@YsZdY+Ue#dCWf2?Ta%T`N*?W!gl~ zA}^kmf{l}xYlGc6#290+ofwGY&ph-4GUR9Hr^Rtq3cDBTcDfc25)lP`^GxK@469aX zkR*ZS>x$wAN!F#d>@P)&Z4zI~MMhTFQcVq*IIt#a>w8*A+zC)NEAT}EV?SwF+)@XD zz|PTG*d>SjTo6fHu>SRjl~d#u)+Nn-X5^C(*I?Pe5+XwY=l_<_(iDfDV#t!)*z&1{ z!mcSqfxx!ytyt8qA{`HiT{e;zrGC_M#*$xm} zO%dz^x^N}MB8VWmv0X?PBJM;4i`vGO3pZVfL6i!uHfX>mUDTw+MiSaiOwusPNRpXv z=6m0J|E?NA(46%-XLHVvm>B?&eMgN#>YD4S%Spi(97mnzk!Fc4WTf8+kLy_XnBaZ; zyU19I(JXB{Y=|qW}>?%otv0&MmPRDzwb^*sSZgf%Kk&lS zcMW%@tly^mYUD{Q{aCsLP+#kjT_>u)Eb3a_LO{ds527kh*ko|iMdGek@G5Xu)Bm;?a!4*&7b6Z=cg znF(C83?jpT?N_6kX^E`0&9a>N+PreZ9{y{9|BHpq73|{db*sr7jO$^*nklNd9}+?9 z^#h;%A55DCiO#8yI9479asja#Mi}Q=4+UG%_%}cirw@+6z~cY_002ovPDHLkV1kq_ B!2|#R literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_covermanager.png b/src/qprojectM/src/images/icons/hi16-action-projectm_covermanager.png new file mode 100644 index 0000000000000000000000000000000000000000..51fd740481a36ce4df5b4372ef94c26f22a5071d GIT binary patch literal 730 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 Eg0!434*&oF literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_editcopy.png b/src/qprojectM/src/images/icons/hi16-action-projectm_editcopy.png new file mode 100644 index 0000000000000000000000000000000000000000..abaf69a19446f1af5b9945afcae86693c94cb87d GIT binary patch literal 629 zcmV-*0*d{KP)Od&M*2_}1wrP=e7yI*ci#7&7KV<>FdcX} zaL#$2d!I)gxR;DwKjk0vc1V^Q6*`r?`l#Mb-A`TKwY>8(`d$gG)WcLhiqhB2u!v9% zy+7kyT+&eM@y%*)Cf!8b4}7Se>&SYdxW0gK;8BCw+foE@F-y@4HLb1nVq;ZTAaugx z3o?FbxH1m#tDxM;N9v8XCZX)=@+n1-2|T&10FcW{dh`fqw6$K!QT-p3tx$0umu%ez zB!M=em*Rg26fHO>L{)a9NYFM+Shw{p6pi2_kEv|UtVu*0lgOH>P0Y_0c=m9fAW%Gg zewdO|RRUi0+MkMB4QpGNc)N^vxOumSfn(Wifg9`5GgB**U45C0*^b6$01*&?e|>!| z=KPgT&W+|M?67LXM3ji2^u!>#p%);vx9RNF8=YgheJKEfv|@0mZ9CB<%*_;dKUrMW z01}T(1JeMF{h!+p9&a1#?g};uJ2QH6YmS9{iJqga^LnS}%1W4DTrein8tkc+%g-f4 z_o2+U#V_R{B_g{HTKZ;R51eQ@tU+f%Hbcxzp P00000NkvXXu0mjf7s?l% literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_equalizer.png b/src/qprojectM/src/images/icons/hi16-action-projectm_equalizer.png new file mode 100644 index 0000000000000000000000000000000000000000..875be4f681b6098f113e8cb0798f618a061ad14a GIT binary patch literal 639 zcmV-_0)YLAP)!oo~x!8tbtuxDXoTl4Kt4S@9? zEMJ+$?JGvZP43>Fp;DEYQaI-VTTv8z{_c773{IGf0IWV09^bLdo07yihf=Ck za2O(j+qLvRZ1ZC_0$_i~>Sbl&Y^tql*Y zwIKnlwTMWm;Owy-UcCItU@)N3XfS8M+Dc%Y{5S~^nt1bC!qv-;R_i@0D=T3dhX6%U zOj!|;Qb80&h{!)Ilb-*lAc~>`3rUh7A{b+)b|K5MunPcD6k&{^TCI{K2}&szHd@2NSjo zH>Vd?1{-WLrl1ACF4P-AR4DTk6a>G(;Y7R;FNCc!Et?l%)9J)*p=j5oW}{8|VdpANb!r&yPPmJVXeA{}UlUcEZE*QoC9vl(=O=`OHML!P;2|@cNM5(BeuWSWWKgASwq` z4tOPjKeAQVuK@E?&3e4SQX@(l2miy91ZY;F5Toa<-#0&Y^N(VyvcBYR;RE>3*h_ z4R>#fi(MPcp}(uAm#?(mdGWofw z->s*_%-vN0U;uFX%jAiN2PR`p-PH=yE8k~E+P(B6)TVP9pVq|R#2emc^ zK}D>wrkbcBy{QM2UeuVz7~?^1CS0oVUk|fHzMm3e|N#tSk2K>rh>}14FiLcZbrpown2IY&>QnfTcId?TGQo_chugO)_zf z4m-*lCtQvUz~em{@t8?EmCBZEJFR81y}49t+*AmGKxM7T%>uL}BNVkLnxV5)QP|sJ zoVp0_epaL22uQWY&9;s`xsYX92x{E~%EbnM-@bIU=;M`})J+qBas}dUgL)&3ps*~9 z(3VvA>f*BNHT}T!m7-j1P+k_4v&di%oSPNaj3^;zfmfdnGj#ACM1;i^*UM(2S3`C> zz2ID{IThFMjzx5CT`RJ)S>xC{NxC{sj(>ig9#v!f{WcN_jb>A*)_khfx|7*u&+B7j zV--!;?OCVRzjIrQvWzB2$I{%p*+AD7tzn-J#%!Vy4G|E8{M4N6Xb+#91Uw(Y)aQ35EB=j}#UxC}|`{~!E zkxQ4Co(+e!teuRSO2Pb+>v>+_^!Fvdd8j8j0bITV;s0?4EMRvalAgU@$^q=&p17hZ fwE)Zlcj5dG&R}uIbSaky00000NkvXXu0mjff9${C literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_favourite_genres.png b/src/qprojectM/src/images/icons/hi16-action-projectm_favourite_genres.png new file mode 100644 index 0000000000000000000000000000000000000000..8394af07e8dee461c31abaa5d1785095ccf7b240 GIT binary patch literal 471 zcmV;|0Vw{7P)f^t!fBBhRbS8nXa|e^(9x%Rm><1gJnq=H}77IJk`}1+&}XRF1CW`SrK_ z$mRDyE&jkB(2j(9JLF9m@K~HhlB$7vewWBi8SkU1Qfq1Pdu#v`t`owqgLvEy_G1cW zf9DGj(kCgFyNj005d?g}bTfvM=IY(elVLM~Gr$YPfJ`ZYU_tf(QNYn)H?b@sUrp67 z1MHMb{uD?l5sUbMEg>+ZWL5?^tOWiP0Ek7LKv4!LR0@9)R6GCwOdpfAcT|r7_1^#h N002ovPDHLkV1iGX#2Wwr literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_files.png b/src/qprojectM/src/images/icons/hi16-action-projectm_files.png new file mode 100644 index 0000000000000000000000000000000000000000..f29e29df17b844de0f367fe35108cc7753ed6700 GIT binary patch literal 434 zcmV;j0ZsmiP)b`XM65B_nre+S!>w`a{o#lXz!pMblSM0Gul9R z2ZL+iRssVTr*L-so1N$2Brsq6ktukeK$y~b=%K_n&^lc6CWDa=6Ag=h>Pcpxr<_k` z1actUbcax{fwdbpZa|zupivb?Up$Rz)WFQjhYvNl8Y>mv#7h`A>yVe&Tp*f)pMq5B z%U8_!r~!*D3<3jQ0@N6Y6Z080m-$OyV8BgC@2=3|7$$L6UR*?Q6G8y-6Y|Jx7a=s@ z!~_5m8S*%TYIVyC^vb}~UqK~y-6rIWF0R6!JmzqxmsNI;8pv0o%j@&ppF^8u{Q1EjX_ zHLUdwY=x9b84*nrQ^c@>#zlnH-FWYu^Utx^AQ2Y4Nd{(`Gv_=1&(BE_!EH{8(W4b$ zbc5b8$9q4r`+S#n=gGh2=`Z5o5N0zVUFuyt_4OM#`nX*;AEzuC zd28cuUz|^fy?x^C2auMIu3b;0*i4~m=FZA9d-0NV?=IAUzW=ZG8b%FE4RM;y``>v! zC*|Shs~gq2sI@)Gl1&;JNyFn*HL65II?Z1CNfS=0HXI;F>S^b*adw-3Ys_fm!vS9K zzU$V$o?K*;zUOeFUIP%qRel2GS}r6nG`fZb>+#Y}0kXoS5XAD#mn(2wWdU$6va?Ur z`|E=N_IZr^0+8OrYKDgZ4FrqJl~AwlYh3;#;OIfbmvq~8{sTNO&XuFV*Z%+j002ov JPDHLkV1mJ+&Uyd< literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_info.png b/src/qprojectM/src/images/icons/hi16-action-projectm_info.png new file mode 100644 index 0000000000000000000000000000000000000000..c382af90468c1e6e1225d2b7d9d8a84f2bc11106 GIT binary patch literal 868 zcmV-q1DpJbP)+`0Fh zbI);+Ol;oe$H%jHcwh0}^Ju=kG+hElfT17=$^h2d3NQ~$zH#d0!lVDv09^Ryk^rNH zLVkRpzc1`)Z=+bq0kB=GQ+>F_pNn_nS}hs_CeFNh%I^cd{CY}&>Hfan;pd($(GoV} zQH);>a2`H9kX zOi#eYTcAWJ=0c7i8>IJW&#=~J6d==mWT2GK=ci7*FccKREI5bvo1vCqt`S4n-}Qn>_BT%RwAn0+S-Ei zy8!1sxRi|z%W@K;x{7S?q!^o$I=A-&t*tGHsIoG~lBN!8Qxa{7>IrQH!@I9IHmjCu z1V&pDZHVH8dOaaY3~A~x#-g@&YL(6E7EzLr7>#u)B0^ID^}6F>1kN}_2_P7kl32rL zb&KttT19DX=a*O3@eaHLK@fo^rKm+I)d*7KP@)h4yx<)yudJiBtthSSi0s}$ zxN`L-t7{u$=g*y8Xf$zR_Qvg*nae+8jM?o$F2j?i%JW4a+@8_e zOdJ@~$oroNFnZ{*&hgh?eK8z(>IsfK-c68EtgJrZkHsav|8X{6|7UXyn3(+HQ-1)^ u$mw@J-k){4DBhp*)K{M$nDc*1euC@8YD#=G`P)T2qlyn$nZrr2c>$ z1i_2wNfEpY{s)2}9`)v>rPm${QY9^n{1lhnb~=s+KaP=yxW8C z`|x-?MnuS~Z+p9ITkC6gdx>0s`TETrTSnwg1K9iWi3?X`b5~}^^D_J_KyY#O>*rnP z`i;i5M~#Kjz`)<5qXQ{5!Z1WrX*Mu$xpt{DQZAxiufugGtj9VNAcNB(Ps+hJFwmz! zI-&*xrl%*KY;JzMoobGi-Ld#6KgIX&`zL&ZrLOfM1-sx+kuj|C>Sq110e%T-^T520{|vYv}}do zt^kOjqQF>zA-DQ-=v=J^04hCr4qy@hRJ#ZHCjb);K!n8KkF0pYz(mmzV;9NvQ+^%;*-AP(!N?800000NkvXX Hu0mjf33>JN literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_lock.png b/src/qprojectM/src/images/icons/hi16-action-projectm_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..5294896a37f203c7c9d4026956c1d3812413eaf1 GIT binary patch literal 963 zcmV;!13dhRP)KLZ*U+ zMZqD61UKR0ATHv^)-h>I5gck1NwPJ`rHVGW++068`4T>agNvh}Z%}a%oO}c~K^z<$ zB4lt7!84uz8UFmBvEp_7ZetEcxivx0mthpknMbB+0>B_Gwb$=&1LQ@n_`&-#0^n)Y z>-b&%#%!vM1wMhzOqD5!bs#&l+Jd+Q+~i1G5LbX}_JTHuJHQ!MJ^`Gh@)y7{VHAUS z1>9j6#n1q7lgeGdwd&jgvH7ey+o)$(IW?)qYRQsyk zp4P`o20fquC5&QO+1m~R5DSyK)ubop^jn2^`2DVbjPJnEQ_@xV|$`ith~00004XF*Lt007wQ^&Awc0000WV@Og>004R=004l4008tQ004y1 z003=Y008K0002CT000|UgXaf$00060NklF(6o`@luIZDytNx(%M?A1j#=jXeoiDu@ccz2*e<$C`3;J3YWvX%iZ4I&Wyz* zip^mjykZ{j`p^_&uzVaMtbmxxH299CWcNE0ORs30K5e}c50f5^7<;-t0!>q z5ljN56xTTn0PhMYI-oqboKkHrT>J9z-;T{(C7E7?##_)HT21`-4*{UWf$M-M@_q{j zU1FfyYvNG=RDojH#~%Hp7KD;*m^t8Y6!A|e)oA>QU>iB#f lI0v}@&p~MUAb#*|4(EIvIOivgRj1P$T|Q@>3pWMV_-*bj#S*m5dv#1 z7XGodI6{z$yX@%Ak?HIhP)g?k#K)h0kxiwNHwN}U>&9Yn-k*@H)&!j`A+PT-1R;EM zA&RF2O)<*{2MpC(jmh)h`Q@_rxTCZg&SksZc&vf9PC=$!^4uem&FLsdzjVltI%GQ} zd$&urwn^R`g?OxiT(;X)+8mZj>0O&zTPT)58HWJDvIij8`EU#X-w1pUa0I?~D3$^? zwYH#??vp||eN9bCZu}VFL}Qe^x+4Kl*-&$$4!_KW?0qbW5Kf=e+7JXGJG&h|ne>Pz zTKGTRx#iK@9})x>tqrp5Ri;-~?+>QaDW2>yT)XX(Y>)rv@Pm@i?o5qjqhw{ZOxdeU zJ4%_Ey9-O$5MCRSxJxA#N`_^RIxpS}Xjm+9^k5Vl!rg@>lrqzfQf6%G@{F&w##&3^ zn9G)hd6sUMDV3pAhQ&WBw9Vb&S*!k!JQhq458Lr*}7Fj6rL|*>9(~a_xsnYi*$prr{&+3Lw9^t@Zf+{-@lYZCly$ zP&+c>u&}ty@3ZrqyKu>0Dy@tFg|W{*v~>Y%I`qo1b(|9kw-2CN_1AGeJ$j-J=f45l Wn`NsqvdKyS0000u_ z;X~M2X=!C;6|fO3EfhuAgd_xsD-q)U%{ypJ^0+#z z=q<|xL&`)Fbo*?))?FOYh2emRuyP`9K0Z0gAROy;T~4c~;+lwH0zhR+?aoaxD4n)D zo_U+Fo!5JSH2_#z8<8@{OaG3gl>uM?kU~Oa1V|wf1Gt7zsonhta2*4bPzYtFJd{ug z1EDC4G8za)u|XgaL>Uc&WCudS&uozFfGc<+qXAEJ5OE2Qj~8s!eY6}OU!CvCgn_0$ zAAQ0@&BgiI3z)&MP?&ui0>XZz`{C&A_ca$pK(RdY-e~jc5YTA`k4{q*^2@nY01q|R ziniBq{2lTSA^>1S1ZLiqa*Oum`sQ?*O)wAvL;yg;KM~Mtdv>oI?vt!O{Xu^K7+~N0 T6<>e700000NkvXXu0mjfR*$}S literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_mostplayed.png b/src/qprojectM/src/images/icons/hi16-action-projectm_mostplayed.png new file mode 100644 index 0000000000000000000000000000000000000000..3cf5c484c68c91c0052286873a6f4bc0546559ba GIT binary patch literal 914 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 literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_playlist.png b/src/qprojectM/src/images/icons/hi16-action-projectm_playlist.png new file mode 100644 index 0000000000000000000000000000000000000000..7a820b5ba74f801470027b7681655e7db0023cea GIT binary patch literal 696 zcmV;p0!RIcP)PdI zB3e2)I6C;Jbam5BP;e3laS=pC>`dEVzbM1w&Qp%>0{&bgO+ zE>~2QgOml3+gb#MfaHJrYQTivlaJDIr*`*LuiP9gNN3VwekoRW1g}bWD~JL4-RvfWg7GHTuSnq0`uaQ#NHL9TB`OfA7|#Zy_TQtAsC z8}W3ubv86lUzd5cl{dz^$P5n-(ACl2KwCD;rBa5)O2mEJjg@h5zPn_=egv-0ES0P&4<=nAm-WVZPfyiO!rZzv1 zJ=o1%9Zne|^|14W47WD7nOj(=|AeJjY-POcu*nehiUQBxgz=Zjjk3VYEHLudm-%J%=P)K~y-6rISrd)j<@-e`jX?FNS(w)Ix}IRhvlME3Il(1h(o6 z1bvpaty%|dTGXO-RL}>ItRzD%f=Elf-tOCfW=@O$z1OY;DLyc8Ugmkud0<9VmD9ih z$UVIbTm|egc>!3_N3tf>`^Cd6=jHDFMX4qha~yUNh$~yVxB5+=xGehR8}oVngqxe| zRqE?sJIk)s^ycmA4!!2~i4@ZDX_^OP#`%Mva&3B(+jlMvo4*=e>XX?B;b`so>-W5B zTrkf0u321|qgI(5HhpMQtBj2Z9IY)a%#l8Ai_685rlZpU5RgHD4w6F)X+~}fTqcfB zUs677`0~04?T&CJ4?__JTJ5r?fU1(Xl-wk^6oc3VEff(@1k{w1wIr7?D1vH#A>&A~ zIC_C|Q;=JWF(3$y-+|hML*&rGZX-~caKxx6O22fbGWvfk93`k1EjhxUG-->kl5c>bI6MWBL<| zpky2EasvTX==LH>(m|u5z>7DX@cG@|n!w9(;O4(x+kX&&XL8!_{0DC=vHpj@Jazy8 N002ovPDHLkV1m6b0_^|* literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_playlist_refresh.png b/src/qprojectM/src/images/icons/hi16-action-projectm_playlist_refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f18c52801643b3ed02677215538d70c4c08bed GIT binary patch literal 801 zcmV++1K#|JP)Y`n=1q&`J?uvHNg@UM5x@svXii>v9g+$au#6nBlRD(a55dSL4P<1kS zGxP4d*F^=vmEc*QvpnLx=XEdu@`Yap3${pTSfVFphsFlgT8Fe zjlqi|;wUH2Yl|D5@Q=qH`V%IycE_gvT${*?NCk>{&&~Uekuk?)DdYVm$~!#)HT%Ev zaX)Q$?pAl0YQ_31*Qcq^OaTyw!s<8Q;D@uqn!cEgeF2><%IV=MO(cvzx<_g~(VTfy zW*WS)<&u2RHqO><%K$ict(jjgWNcp5L{jrSC^<~1tXmoLd%!10afH8Ullf#W3+O=JsU9 zwcB;Je;6}ef^B=AGWt)#;l1rNhRVL9mZ8gK-re8H`M(?z#N@PwiBP-`sHf1`F8nrB z;anEb)i;mki7MY8FJZ0FFu#%RE=3hm3r3ZQ07E^ay+tu?P@0C)qZ%C>dr5PK;)aC) z)XR1L8yV-oo-TTdit~_W4(b*|YAJRo9eE{KESx-8VCOft2v#p5yZ?mTOoebZ;l#mC z2Kt+D&XYOM)DsJ7hWeVtc?eWc6$V!}^4(W+nfi5`9WO98yqpEyA^O}=6*4bS zvxv6-d1cq`-c?)H#;O7WSm(&AP*p)x@E($CN*srH=kdTFm#W#%hwfY!xG)FU{>uBk fAOlXx>+bvvIxq)56i%>C00000NkvXXu0mjfO|*8# literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_podcast.png b/src/qprojectM/src/images/icons/hi16-action-projectm_podcast.png new file mode 100644 index 0000000000000000000000000000000000000000..60448bef54aa3b50e0e5b2dd2de35bba302cbd11 GIT binary patch literal 640 zcmV-`0)PF9P)O{w{7+Z_Ij0Ta0N`(smjkc#hP;*Ne13iJ4mmqBDWkr{Y>4eBUw_i}!Z*ET z1Lx+BPgiOpo0{Alo2K^hYdUAsRi`iJztihBH>D5^Z)3GvRqIxM$dTG2r%pEpV5^f6 zN8z9@N@aPax2|{h={!%CcNuG4W@cxmh@+7K=!%3ms;(1IP1p5~?w`cJlZdT|M-co~ z{u8B^T)lD$fD0Ed!#^GcVMx`>v7uPreF<1tbO4A5Nh;*Y689fI2UQvemk5WpGE^y0 zKvfBYkc!E$0S57WG*?7G5l}-EZ)fJv3DTs?Xgp4mITS$^P%y?2;9=<%jKxA=4PyEe zEO!gy5zEBRh*m3S&xEDZEr^CKr7Eh5D@y1&EV*O6Zm35F&j_9onk~n8-RJR^9&4Qr z`*vHJKXdA_r7V@ARGJ+Jd4bi;Q7U*wFoW#ZS(?&rx3HcW;Pf}3P=U;0KQDCNU%Rz8 zn|b%W%R-}xxM;%Jo}ZkvIKo=X(?9`;qqYUu0l4e*1;7n^M*Joc$AiyW>qPJNjCjUX z$aT35(aqm&>DIjMSDrBk_il?Ng?LivDF{ONpOvy}8_DTe|Df_$jQzRrfXedyf7rJg zd=5-}i=HhaT$f7fIr>|B`R?|=1-*ERmE|g{%%cUdD>*~Y+bsa3C&utk^>H_!$BV@X zgMcWC=*|7Wky9UWuf7?8folb>KCG8YnX>HM-bhViBVJ^veEJDXg#r!x_7QvU5YfT{ z=K2WpgM-Kq`q6>vz+`TPhWAG=)==& zYHw#{Yz*h>_kT^$nkq-3v`|dWY9{{(*)#JeT5IGBTlwnB9R>!6u~@Qghv|8-9X&P0 z^7te_#a~A$O-zTnVxtT{})^fFtV48y;!5d;S1`q;k%hDQ8wYOGWc@M9c!XFVVI4?^Igc-lKZ29RU?_yu3B QG5`Po07*qoM6N<$f^Hq)$ literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_queue.png b/src/qprojectM/src/images/icons/hi16-action-projectm_queue.png new file mode 100644 index 0000000000000000000000000000000000000000..7f3f363d639c71f57569dd0d351a2b8ed3f94621 GIT binary patch literal 738 zcmV<80v-K{P)fB%5LzikrBdNTtw?=OG2EYV=7gh@L2u*<)Zv9`nvx_*P7sD6Tf3S#(k$-;e5!er zfJhnck9nfta1x~yT5FB>o^oWUwKY;eDHb%_4(mKGK5Kd-2f$#jWAs#>d+*U&=L)>{ zj14=UzA_Yxif$|8%8;SAC|GKQG*U@sVXxVxwi{5?mcCds6sw%TIY&VoA|Xf;%j0_; z0xjsIFtr#ED9=ba8Ee#PVJ#@Kq zzROTKV?9YZ*WcjMV2YFyxv#)l%ca4T?LEizs=!){wU$bu%lxLsm;+q<3C=l``lG;m zkF}Q5CoQ7YVt!ryCAe7au(GX~Ue59Hpv`nG-rQQ&{ zo-5GmIzBEd-Y>z#LO+poSlc8FWxmASrs2u+n60>yA6UY~JIB;|nM9NT__{9m_On3E z1O#cyUNfUqD&`8Fy%a2p3Um%k@?}XfZ+Z|q$BBoBqgzbQwYfdgq7ce_1f>*N=4iD4 zby@kC;cDv#?>GDD3oQ?BCR`qI+`5o=u{O$`D1>1AT8GKm4VHWb5h$+96&{W6P%46R zzc9uVhJq|RXb=PeLI^~frhaX0je5Ps!go*o7u>xe(fa>i7{@WyY88=X*^%D)H>^r2 U6g~3DSpWb407*qoM6N<$f~LYy)&Kwi literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_random.png b/src/qprojectM/src/images/icons/hi16-action-projectm_random.png new file mode 100644 index 0000000000000000000000000000000000000000..23dafa171828ee9bd4c001e116fda7e5ec30b399 GIT binary patch literal 876 zcmV-y1C#uTP)SkORG%?0#qDD*i#U<-H4TXRy>`EQXw+be^HaBK(Y7&hIivU``7MTRbt-7JY7;GlxO~SZ}9?8 z&g_Mr8JvSBMog7?za4fhD$q;;(>syEHZ;Z}d$hOg`~jaPH3xG%KFqX=kpd$H{;p8k zLQBc`hIaS2?J*DWi&=Ox-LjPRz7Me(9=c zG_mr@oFH(%^e!yT_1>-Z?_}HiW`|h|C@9qtEVTz^yXQ8mC1UQPr z-pJ~TVcdCMz%uvqA7#WuyeHT(SeA~M?Z6Qk^af^xX)0Zg?rPu^v+{qy=h5vdq#g_u zWX2<}fP*qt|9S@hdvOL(w1*AA>Fn4l#hORo=VoSOQ=eK-=Y=NZ~&roO7Ic02W~U4uJa7VyB=Awvw@E zZrmyo3Bf(rr>AcmfIS-^0Dx=o=J{c7-N8CbkwvZ;hK;PA7017&(3*-J9?gcz0Jdi~ zfc3L0yFvke{N!FUC<@c>1Ofq2Mjuk@#TOq!K!!1QujmD?I-nxbELko5CG^@ny9&)j`X(-EYpUigN#r5 zVtSHCeHV}w8M2}wZ~E9?oi2TPLX0%jv^Lg+?Ow9qd`umSzwPeTkTtSc92r5p%38z> z+PS*Y)7HdY5CEwm1rl))3~BHRjuO@M;Ej6qV@&h*v4GlC7#vc!ZP_?3d0rlgRfc$I zf1d5AV_*#6oZ!r5)eD7Ma*orLT~LwuAk3*=YUFA8t2P5HGkT?~=_;vB_7qjtuGB?A zaNxQH00i7uaP*Xl;U3Vn1k!?PCn2{=gfa}YKf{`RSMlWj@H8+}OM)^0o4~wfWQl%(Zk{7? zvmHbVgK9Bn#|lVZ-hw^(1-;GJq0>vh12a&xLxI4Os9l^xq__$IqXbT(9MX>!cdYaC z=fO5(b^rj#-1iEA^9TozVSSZO)Ie#p1d^-g`X^rWl@v1eO#rw43CuuB%TfThu{^Sh z_&()*V=VwqaeKoMfPY``7erp|24Hi(<;Ab_@4~A+hXdj4NdN!<07*qoM6N<$g5=|k A5C8xG literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_random_no.png b/src/qprojectM/src/images/icons/hi16-action-projectm_random_no.png new file mode 100644 index 0000000000000000000000000000000000000000..0629db4f9e6d7c286ca64f713601b5ba25bda805 GIT binary patch literal 851 zcmV-Z1FZasP)+s3=OsFI@Qt6fB5K5h}QJ(Ur8RSS(sfC=#Kxky62rtdfPnp>c*uYcpw_CU?^N zyk9PojBV)Iy$|O-oO9p=-g|cAhs#%<0p0`N-9DWMrd~gOtg)LL>r0sE;WKADVaUhCqmI~FK`o>0=_%(=J9&~!P)Z{UjyC;j^*QMvy|kQ^KtaFb1rE% zo1|$R=ei#_YA927kGE;}DRD2=nvvG@DJV zwRrE7>({Oxy7BYX!9wiUlVW^Ow7C>~b>^HeVfcE^mfmcr*wC1z@d3DMb(j zJCU7p?suTzoU7exb@oOghMclNnx@aCX-Y1aYgQ_ir8G^C&dkgdl~PPhOl+3R<=>oh z2duR(066de5ivxf4TZ?|TQ$b)Z@1g~!!YblPEP(B$FXX++lNKurGbHgKF@oPXhW2V zMn{hSUG{|rvn+c#iXvubXBizGrCzW1<2dKZM5DAAtTh;8=ytoz&CRi~v4JsLH-K8L zMzvaHdU~40#YME%7^Bf*P?>17-Xe<#>+9>RtgQ3}ip3&hV`Err$+C=6sYIjEU}dF~ z%S59@Z#l5mk|YTuBO?qA4PmXtT8q{itu@7Bk@4|y;y7kuVFBx`7i~}?X06k8p>wnW zk|aSX^>7!D#8FCd_{j5jSG&%Om^CG$hr8=Cb!+)SwezoTdC%&@W$rl8S|cK>&E@;8 zMypru+)JlK^l*O*AAI!b0pRl>;6$yG|7*`+ybmbFag6t*owWzcw>!OI=lliWle1?& zTY6+nJ9zuUQ%8U=qENl^)RW1d0Il1-XN`5&fseoa`t%=6)X zdN2fons^Wn7!oudjL{f8sR?=@9wgq>#Dk%UF~Nfd6Evcf0=7kH<s$h!oOWr&D4&OVx_mqgR!hxgom^$2LNVF-G*kn-C$KHO5N&W*RBJ4km zWm~n+J6fW?u2#>DOF>=9g-kED%rBH1#!A)rvxoNLttNQPB6z+d`bKWVG6^DjRzMs|rXsvOQHcrx}w=?IIm!p@}3)25@ zfe!r8D*8E^QYntVC|vav8xPt5n5KzR>aPl_-TO9N_~`am`xj<&@+ojchU!Xsxj;N$ z$Ri?%)ByXY35i4k1t~VYs=Cb>E&N8c z2Xs>>4_Id^%BV|Ro;=FH?sqtQI(JUpc*;uAp%h!vZji}0m!4rT*;SkS7G0X}b zp%_+*4Y}ztvQu9XTl?Din*=waGM9!KysH%*yJsaEyb~X21n_2mocU$UUbwZuov?t{ z+1S37%x#;2rcM_RFuaTN6W2y(E=nYC+*0tjsBt_)ef(XvWtvS>RfFN5gId1yruYNr q;QBZIACz%w50C^tl-jo1O8zJ605kpJl@dz;0000fA5=*(28Ku-DFt@Q-LgdYK#{Opas9U5itClfK6&p)ZH&oeb{`%(u%}yv1B!|BK7Ut1fFWar>e~U+T2hfC~VtC_awvDmi}^Uji!&+6#CMdol%$DuA;uJ9nuLZDu|!z z;O*0OK0jBX(ezom?bgz%)@#~0PN7_>=E`mp-xov_Ctr@zo-dHku5xRQ4OYv-!tZs; zZj(yI%cYFTYsYc2_w}|;UAUYVP-qQSSo7Jtos7MriOgT8@TW)1&o}wtxaQ5*VqCbK zmt8yCrX0sv2#k-9SCbu~Tl2rIWxR%LH`^ivv?dtT^rS4Rr3S_;G4Z~k+XR`*uCTIN z`}Wx5y&uQp@f+&jpRQCJ&z?S;8`X-(p4^vG?QLN~K}{&6sn>mqYaVAWE=sd0-yJ`a z9*?vHzXniuxN-1@E6XF7W|yA{hjrQ{S}mm@zwFj(H9xm+FfsMeuEZoTyJ5mR?F`sJ spD*HMub27(`nJdBwNeEj3v99TKbfg&PcYJFr2qf`07*qoM6N<$f_v$)>i_@% literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_refresh.png b/src/qprojectM/src/images/icons/hi16-action-projectm_refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..428f21cc2cd57c4deb24bc894c9dc43c926b4fd9 GIT binary patch literal 959 zcmV;w13>(VP)JhT9kc&QO&lR4lL(J=6*QTMQ!wjMQe>!wlDW_#@RXN zeV^w!@6(TTxcm3b1vlK6Fvf6ede8LL0WH8*+qN43wALfQDA2WQXVciNeQ^`e-E&3& zt+812Xl;6fQ<^Fv5sLtj%@tV6Ec55Yq?^m-+kuWfPwzCVfKNU(Wjn9K!bv?Oi^zZkVcyAlK%7CZ>yI z@?b21ux*a?C?eqy^>t}SD!s>+Qf)0SD@6#n`d5+hISVhJBkCF|%LHGI_|&B1EKKKk zupV}Avk?Ny%Sw?_HP}K}4asC2-@v*;|GG2rvez?XJALB#iEbaMHXf~jvovY4Qoza@aP%TbiW$KV3=9(cf$DtT@INapnX+kbFw8>Xh`kW!CWQtGau z%cHJRinhHD)pDNs>xxVs3U-J*Hkq+S9w}esSZfR+KqKe9^q$y=9k9?vAFVY?Y0iB;#FcM<>^H`AtdXf@?;!!S-oCEv z=#EG4cWO6QQL+9u?107e%sk^0|1j{)C3o)nVmr{$_0el)4d7;)pM7~%=V;Vv0LbUv hRh>_td}EEy{{h)fj#yVzftmmS002ovPDHLkV1f*l$D{xN literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_remove.png b/src/qprojectM/src/images/icons/hi16-action-projectm_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..ba4ff2363740a4a7d938a7c529fff020944f90d0 GIT binary patch literal 962 zcmV;z13mnSP)GCw$-M-i(|+lK{GaU6y6F0vKb)feB#XrH=Ngd;4O2U~uTP z0J=*`ijOtM>q8agWkgHD0Hm`yR`0AaGdrKpW}RN3zw_k|e`DagQ^Nu{6R(f8ZGSjH zBxDni64u`df$Mo>@`|gIQ_Rla8U@-9y|Ukz07~iZSY2&fOLG&Epv^x=`%tMAKHvlS z#YJxRyhX$=qNTZsSY2(KQo0*JeDT%EL^K-tt8MR|P&6E5`q1k{|M;8R)x{)!8UbUN z>NvmycMPePI1imVNjk3>z3@vuoz6TWl{Q^XiFha+w3#{b4v{NY*(Af%Cl!+~?qhP_ z0UA;+0MQo6$k;F4&E+z3j zxOw6PWz%y=t#EXKx#k2n8e=%RfYgeL`2}trKaTIg;!+Z&%(zs_42)fx$ZM@>=zWj7 zPwipZ7R*1ogPlJN(K0g3OjDc{%O~~tZnpJ(h}N31OA~pe%wXWkZx?S5{&+5{lzz4` z9;4>@7f899?Vo%~sJt9I5}~@iou#{L?CAd-WPl47FLV9I{E;vFKR7FV-{-YA-xorN zGmq`w+4kHsPZAD?u&e-*60 zY^prA_vt4>jSX9PaC0?QK(e&_AJel7ocsCLeDdE^FVH{m&By+I8rQS`)wee|7Z-07*qoM6N<$g1d?a(F4{?rs zPYnPIQPxzGWV^e`o#~}HNRoQ@p4^RV z|4xXT!xA`_Wjq$w8ayN9MoNrJzz-8r+OnCjTqbxl z2wJ5+USLV1C5)8Gf`cH$YSj@bct$WrSlZP^z8doL{vA4R^n*qW9X?2E_aW+c?jVX3 z1ws|5I>gjHdwR6DsbklsxG@3(OuLYTZxI0zP=!j>;rkZ-YjAI<682yG@I>HY4X}Ss hHJm{R+>-ge^B)Om?Vp`*NXq~K002ovPDHLkV1m`kGEo2k literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_repeat_album.png b/src/qprojectM/src/images/icons/hi16-action-projectm_repeat_album.png new file mode 100644 index 0000000000000000000000000000000000000000..87edba8dae2f03dce20ebd3530d6a9d0afdaa757 GIT binary patch literal 1008 zcmVy}z3-3v;pVp7?C$b3x6pYOT5S=y z+U}1?6Dmtv){s_N4I*1G4E--AE@nYOMlo>xkw$DT#r}v)rEqrD8gpyyu$6ZzW4XKS zzW4q4`M&!jSc{&&A6`5>4-X?EEEQ|_*KmgI%QU~$aM(sw^5-N@e>fh$YsI=DK^kxI;>_nYd{_)Yy=qd&YA05||>zIUK;mDk+! zJi=}Lp~XbYL%{aCeVD$66XPq;b*>gKZ@CqWhs-V7Q-%Ei!0^ayR97)|{!l>Q)gMMg zCG5V>!MQ0J$DT0}QV6DLVIt?DW1tEPHp7vYN$fecvSiqNqZF=tqi1)Mzv-7kM7lIB zVeq9A8deEhpEkv_-H!Xw8DYz^EH@{?8si4~(q$md5m$<0Dl2Dsz;`z_tSu>LCnU6P zcCe<>$9pGj@5pENaB1G#Ff-$(4u5K=kAE$R`nZh8>kWLLEk|>`r9~uX7k5h{%9w>~ za}w&RO7J{^zEh@S6x#C|2f8ik;k?Vv)}*p;F|Cw(7Z el4$yMssC>SX{574UMze70000w#0K~y-6g_BEYRA&^&|L4ryJGnQR#0Mm5-B~Pd#D%)a&P6~M zkyt^Iv1*fvCb~!zl7){TRJ+d&ic0bb9P!GZFr7ZVVSyYBuqyToqs^5&a?}UH!$vO8_`Cekmlv31-@zkHffJ z(NiK=&c@hohRjcDMr&n%?JE{`8Dn>AZ93{Q0Q46Nrmv^4UnzUHnrO|C7GrE**12?j zHp=E+%qk@!djMcy@2;`Azgbkh(Di@f;PB_Y0M0Vg*DXyUO68iWDf=_^4;;%g(?3gE8y8K@B#CqK zm57X-{_>CmfW3pCh0Ju`d)Z3B57~e>wk?d~$Iq(M-pfZMA}H<~S;I^dOWT^_nX*ch za*t9kqX6zR(|BVPtZ0gZs5Gl;Z42Xg@@XYWy>yJ9I{L@!RsN*+U?($uH!mMHSm&dc zRZ9TSx*)P2v^56a3!Xkt>~u*f@1^^~*zs$?oMYO$b12VDCq?8_5ri402O?M&HDuMi z<}hC>>oier7l3wVTF*oqQ}5M{%U`UlzkLN}V1d+f S^)BWB0000`OP%x=$JxHnk8XGWZw}K;i@8# zzA#E6C}`0p=uc?Tt~L=-n}Q%H+O%j@5q+VR2%!{aO=*6VCN?_eeBArHEhfTE5Om;h zHt!4PJcn1j_xw*806FEGflWZR^363{RD3W&Dps?P?*F`I2up`C02b-+rf< zn*iW@p@MhQX+ng-i9Ct?2$|VBo)08wt{7!eFatnz;UZ>pac}I*q-;-p;=sXXzRhU% zU9aWrj!C9VF-~mBk%%q;a$N5!a`jc33x_92Cmr{mzU9eugEGbz)Xt5|sZLgMxhu+s zhLDa;P@58<;?K^^Rf3rEO=Rl$5!ZTu2bnzrO%s2!m6ehHAlw9uM4qmUlNUW?l$9UI-le i#}Lgg2i%tbjq@*x0000 literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_repeat_track.png b/src/qprojectM/src/images/icons/hi16-action-projectm_repeat_track.png new file mode 100644 index 0000000000000000000000000000000000000000..f1dbb61c3e8dbd148f6019acb27ee526975e32e9 GIT binary patch literal 566 zcmV-60?GY}P)y{LSZAWV+|(J#7&Hp(c3b*gAFOS7B@m+5VEd`ss|6zk3D5H z6AF8AIm?Y!O~)5=W7Rod(qX$XjaS&5V?2qc%4i0%+(%rhnyz6~w@_a>ai*{y2Xkyq zxr<9LZ^|-W<3*?I9o*r75iFolXMaRtFQ}5HE5|+b z&~o)3F_<(Da@-r#&zRh3Za*Xjj0 zhO=d~m;~L3IDpeQq~+U488wz>Ar!Xb0@mRCu`=^(qdu^Vsu$Y>@&RpWw5YX}F!2`w%pp@PHcx`oiLwz0oJRh-P$diVN zc}ab(kG)U8&^1AGjh}}4I<(`o&&(#efiFCz<+YJOATZGKY@=73e2#qUa%INwLAy(Q z)({HiQCJ}Gcs-oCsCX{op`xsqoAbAyA03bPOJ(b>x=4+`Am7JFJ(@==1MCcY=^rJn zBfQfgS)9+1UzE>pe`!LYLWGb}uWf4_$0f7klC})%IU9jNDS;3IfxtKhDGZL~lC=fP zt2U0~!L~JWHIt1mEvIQ~a=DjSA&ZZRza4&=&`2o}QXr*ddDXD8?%__#rmjM>w47!& zlZ{KI^yFeP#m-WRe=Ua_F5;6jHYdJR438{A_g0E{u7uUJCR%1u7|>iAo3xbDeV!|q zNACCapU)~~x4qc%7*AChE?!9UAQ)mTrFDu3CktFZ@$IRTnod0>$O5IyJ4#axD`qXR@Y;fR>qnkMg n0{$pKE@y4#Jn-GAEjj-W9V3=W&g>K+00000NkvXXu0mjfnEb|> literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_rewind.png b/src/qprojectM/src/images/icons/hi16-action-projectm_rewind.png new file mode 100644 index 0000000000000000000000000000000000000000..676fa4d4ed5f2686fc7959b7e57217db61859243 GIT binary patch literal 962 zcmV;z13mnSP)gu`Ll?n;b2f9ynV zeBx@5FW6GD%i=hmIF2VJyDa&FE#nhcgBMg1j=-Uy+c0ArX z8?aOjasO6>vg0CX#G(eNWHRGeRw|Uv^!Fy)V@9`T5rSKnE*0z86-Bg72f$scBVr&Z1chmu zXd9D}>x)aCZ$#joms&a6=Q4YFj{HKv%Iq51P>GqJ7nxZS%BwZ14WZr$SX}n}OuG5H zW~EZ|Ww(+qdkum>cw(@HQ*X4Ao|$2BdWBb>GdX!IO6$}O7XEYy0w{Y8T(_D}Th^R@ z{P^**rt8*pzA|v{J#9+Upe3ercqmRP7SOk|g$?Z?jvR{9qU!YYG?TkjkgXk&k2h~J zzeGe>US7_AaAqp^?ZsJHSn{N_;>(&_lZxMvTD>6^zaeXGO-d`i#X*A^gk%O7{qD`SMfd3lY zQugw1#nFpbicdx&TEk}@P)&Fc}Cp0PIvE|bM85FNA(`~ z9o=Gh!YKadWUj&sBh|lOet$AFr+1%yAQnszr925nmEbQb0$q2oE?9pC+2EeniNBMaUfVHrw2MTu~ik3#T^PuliUS~K02YJmmjTWAEP znIcXb&@@%VX+xM~EDO{QJV`zmfU#AJI!+a1+Yn;Q;;we!(PCXSSDmDAm_Y8E`XFft zW4jzdtgDn-f4M^x4bd&m3{2GD(9vI?AIP#$ef(V1|J4hGF!~7^bN+%&hbMIa0000< KMNUMnLSTYZQ0|ui literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_scripts.png b/src/qprojectM/src/images/icons/hi16-action-projectm_scripts.png new file mode 100644 index 0000000000000000000000000000000000000000..92490a17f461b7381feafb521a03205f185fa38a GIT binary patch literal 638 zcmV-^0)hRBP)o2&+cPC109kvT>c+*`3+y@-Vt_U2{r7(@@p* z*7Fv$snu%AKEhdR3B!<5slPIhoc3j%8`-g}yOU3|VKeS0czAb-+PgXn_s-C074hPwpT z3Rh+W0G8{9smo*Crj59`SC$g)-2TY*n}-oOSnR+UgNTsldAH$W6`nrZWT-NT8iW4! z^zCcHrP)E|=L8YK7=y{OOxM@fNz=4vd0Sha)m7=qsVdd#06}0Vm&;Tt6-=Jz`})qm Y0Pq3*IK}^3p#T5?07*qoM6N<$g4fF)!~g&Q literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_search.png b/src/qprojectM/src/images/icons/hi16-action-projectm_search.png new file mode 100644 index 0000000000000000000000000000000000000000..9cd423ea099f05daaad8ff7c83ac481cce5ae45b GIT binary patch literal 646 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 literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_unlock.png b/src/qprojectM/src/images/icons/hi16-action-projectm_unlock.png new file mode 100644 index 0000000000000000000000000000000000000000..3a1a0d34efe6d96efb2438dbd7ede8b9871e3cef GIT binary patch literal 923 zcmV;M17!S(P)Z$z596S=g;4!{P^+X z>91eE7#JBD8RpKdWdH~u76vE)@)`d9`zOW2!#O`H%FRt(T@J|q4K(;40}~UI?2Q{w zE0!(Ww@9G!2QYmA0R%Sy=m4NX#-7APA2%5pVTR3{5B$Gy;r7)ZKYspGSC>`y z@GxgjNbs`g>svbU_iqM&kcA)s5I{^I0_ZG;4b( z4FCurumPD`hZ(j%Qr^e(=%N8AC`|a-ew#}?XVBz-$M6prh%wR|85Z4hV)*)-h2hov zKmVlIU;NA0y#h7>Ab`LI@Us1hPBXY|&cMw09T=Pp!0=)G@rRk^$3GshA{C*pUjrF0 zXbC*|#lZIcFLRF7{VYEAKO8`*H2?twHsCW0?;`z7CnhG=4-EhRGGGNtO#c`d{(NF! zU}a+b|5eNL@Pza3Kw)Np00JBE^22W?W{wNM(0mTGorwV_07-oVy70z(hL_J-!3qHa z2yDQ!SHBq;UIR^k{|A($&~zb1_%EO9gv*&9BvFhBr-4S4qn7jsHLxDE|d$_)B2ie+BxH`5(i(&;P(m00IbX!2dr$1#f_wKLHJ4WQJ(?15^MC zk3T@-7svo04N~{}AJ~BZ5d91Q0R&0PAl`pQh;6^28o(O=K{Y`Q1dD?r`Y$By0|7t) zferY_2&9fK$Nu~O xKSro#1}KKI|3M67ggB1%^>^lDAiV$q1^`WSZm7K{A*KKT002ovPDHLkV1mj`tF-_C literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi16-action-projectm_visualizations.png b/src/qprojectM/src/images/icons/hi16-action-projectm_visualizations.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b77dc098142e86303f4c57218d3b1b7fa1e7cc GIT binary patch literal 522 zcmV+l0`>igP)*fs`q% zYz6-+Ywc}q0~SIcLO|qf41q+r>cZuRyUE^u^I42L>k$@|O!E%U&b<4+!;BdW2Fe{q zY^^2BGLj_uuZ?9{G8&D%L6RhVKA8t#r(fP$d_1xopILexp_fVE)>`5?j!{*{xrffV zTLwiLG0vfw)9_tYiR0KOP*qkICjf{vfA~7|wI0n?tSl<`XNAL`7J$`<>JwONanAAS z#|!{#OGPlK+2*q2;B+P^z_ZMGgD8q{&V`LtRRx2ZJxD9omR!)fY7|9Hf{)+RKYf+G zqkHT;&DlHhte*ePwwAA&1XWdqL(Fd+_xK75-G+Qwc!zi1MO2)q3=0G=%5?Dk#IHYOs|3Eu8^0C=n(eD?b50hTB*PUi{LJ2 z$mJ}osTRbGheTgp72RCQfyh{Y-MOxYhF2jAj1i*q47L)Eu?Yiu77)O=r-JPT&{5EV z%O!8A@hHkzT13>ef!Sq*X8}>QA!^zXikNVz5(m1U8_BN;-n!Hh*{?sS_XRKeH>+nFSKBp_ zgV|Nt>I+hIdORs&IyD}Oa6f%p`>zWkT1?b@Snh24a=7te_`2F0-HlD(HJ2|m5a>6^ zdt|cbPwiq)q2gZxX~0(75`Eb_XqffKX6|D9q)-%qh#=Jl-M+KQ&(DGuc}^xDV_%}A zC;$;b*%m&2;6^_8Xqd=-D%)E$fQTSA&-9$QXPLKNn7ZS%-cCfnukgRY_Rn>@Hi_pUiV;RQK`_cR3{qf%SeD1yH-t+t2bI)Be4|wmAM5rJD0Frxl<9whN zy;rk3>W3Owkeinq0QV^3{8PdJ2!R8hz8=uHfPjFYprDYD5DW$r78Vu}5fK#? zg~Q=uVqypcLR?&2LPA1PQc_AvN?KYPiA17MC>a?USy@>*IXQWGc?AUpMMXs=B_(BL zWfc__RaI3rHMMQqwyCSDYiMYo(P&LgO$-L3rKP2Cc{uWw*rU}$J) zWMpJ)Y;0m;VrpuN#bV9O%*@Trw{PEWVPRouX=!C;Wo>P3V`F1$Yinm`XK!!s;Nals z=;-9+gwj^=I-w9v2)jM&;8zhcprSA->J|efl)`#T@DDniockQ4^PF1 zr{Nto&G(w_H{We-X>PmU z(%#nE+0oJ6-Tkol;p0cWPoDJk_dk91{MpNwF9u!>489p0dN(vYJpAFq?<0SVjD8yZ z^5>VY6XO#z(=&7IxdqO`(&7@A%U#_J53;hd3UwD3mpGgSHfxSG%lbF=EQ`%z&(F zyov@2gx-)#ufKM)KIdj#Hmxp;%E+YFlFMr|%I-kY%WBd~Ye*%K+iAtOQ;Q(gsW)z= zK(1FoQVT273MSdAnwm#VrIaUAsEHKn6$*`*caun=CFIgB=hEV@ zQ8(pKIP7KW!3hNTpQCKp^t%0HKw zA96J>_zESMm>ZOk6LdK{I6gZlJ}WQ|l6f{ZlMtJEIwtc}4Eba<`9xI4amc0gW04Tj zdF>sap*O&c^6~x!2nY(nghfQ*VhC{wNhxV0N=8;rUO`bwSw&TCo4N*C6QiZAqpPQH zU}$7)Vv030-)>=PWo=_?XYb(X;;bb4`RZT;t_udnm@&>8X8`26+t zwWawv&H{%86)1~b9)DwF>x0!r*4X=QDk*~Cx6i}X-paz<3~Od;VrZbNjX|rcsVXbT zN=t}|2ns-J{h5y=R%ieOefQwpd~H#}kM^C%`vLHUP3>IRs~e)r@RG2cZAP0uh-6D6 zZ47@S!QV1FYOzR-sDrTxmR!}~vC59fNe$$?8&i+>lzWyPaVR7lk7YUi$`X=3))W@m(Ub9)2dD;ezAF<=sbfQ3FTizG0tU@NuSECy8*D zh779w`;1nX=&yH9-kE3l!^8;WEMtue-f#EDe#2ZvVUiMKc;rKhn$l&_*#5xwFfW;; zp1vJ8T7i;fei_{q1XS)`ZuezbMDHKod8`b9{opC&-=dQjXxd?u}|4Gw}gIugb@V=OSO z1s*9N35HXctUo9vri=#UaYNZ160NYj7C5f!@CM#JjEuHaHHW(r#(3QJ2{>V@b>hyg zzz-jRF!SZtk^c_M3Bp(Nkzgk$=HMCY(iomZ>~$f5wOKm`~X>B*pc9?kSGdPqb8 zL~mF-cj)=ldV0xGPywd6uX(SRCx`r}P6#CZ5WsyDHW=`t7jNFQJs#e;M)#8`e*+dL BD@p(W literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-collection.png b/src/qprojectM/src/images/icons/hi32-action-collection.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bd3164370fdf5b1a5fccc8fcedf30d9721c143 GIT binary patch literal 1753 zcma)5XH=7i8cqm=5J?yTGT32dpeU#yWk{J(+2dGlsl;1qMJwR~9+t|!EEh5=wX}c; zgeyuF1uGXtK_H+k(J}%F7$79f4B-2|aO3sY{db@9yz`v*$GZxG0(>!O5*h}BVHkd1 zAxdke6cZFesZ+;9hAPx2QBVuQxV(L^AHelScIkGdTQ$u7OBLe@$CYqHQ3@5qI>A zK)e}5w17;g3Y)`^g;(BROX-&cHNB^vPomVrKQ^(7$7iKlCWj0E#G;CdJ0MZ-4w0bDzE|hu?O0S15 zH$s_gFpCXlHUc^S`pjH5kX;Yt)a~TfY!}pS7uCwI-Q6mwlUCeY{iQ)v)g-LGzgXM6 zQ2+2#W6M0dh2QiC@BU-ngQxt}we{8Y^|kel^^MIhnU+|@Tcxgb)`P$E+fPbQVgq*AG5Q?j+Ou_==& z9od)s=9);r9qDW;%P%M_D$Yq^ojVi5jEW3rczQAdBbXT#?0*k&1>#Mad}|v3Aqe`i z1V|>F=)4+4(m=rB%1*wZ>G@I;45re-@bU1&quelp8K2-JhHTXHVoj4Ifh;{GQ7@vxMwRHm{t1W72n!z~qoJ6Uff5pA? zZ8IE3qi=Pb_2C#u{tgR}zV{}g)=!L2^sKn$?7(40)vCQDZ>X~^9~DP8K2HBV-x-F(iq=aqVw1G`j*T=1deYj7 z(ZY7}okHO&q$88@W81H;inu}^!=gL+&om+?KrNz!5MP#U#lAl0h7;BW=6Pi$vLb`V`pb~kmeM>9!ikJ}^-mEc@aG%a^Zr{I@EUEg?8_9T!t|tC@ ziFGwFzZ;{nynA|)O}M@ddbCw9&-K*ZDTnsq%W^sSBG|aGi-Y8Qa@BB7p4OXF*JhJX z7N4tZ{i$m@_lU~!o7;&2Cp0)t@4fP_>>lh#kFS6m+KDAt{gRSM+pQk#P2K`*G4khW z?_ORJuy}HGz^*m2y0`(Eje5TxhVL{-&g|1h zqpGDh`!9BSGGyKBzL{87>e0$2fS|M37|`eTY&DH~Me#~sexr8@>mM|V_^q9D=K$3C zhc~R~-{D>%3}M?NG^&AL(>XWlTzKcJl>ofnI^`AFU=z4#p*zhPfK#kD zxDpYl!i~7se|v3#0M?_0C7A63C&e3Y#IWl~#HxEU!0*o+K7QFP2tb5fn)4-azPm&6 z8x_Wu!}FWwh9`$U^H_m}yfvL@u?P{5bzsW?JjAgwon-4`l|&3-P`IVgtScErD!#3O zk`j0iNlUm9XQxT(v0~5#w61tcO5oZWuq9pK6p}=kiU+c%NrY4)7BV`V11*|_h{uXz zeZY5T9q)f_!L-%ywVi<=3UZyGPT6}T#+VF2)v#r4#1mr~XbzxEgesoYwF7<`cZ}Ru zWn^jZO{Tg4){ph};I%2?=kb`$tBV1|%_l;k4PiYk(Zas}J8Q;mZKNgLX+=>f8bqR4 zF{A=E^)&6j1yI6NNK3@*+8O8tQ1Mu&SO?xJe_VA)5VRGppuj*SU{O7s+nme@X`DZ4 zrYS6;-O_~sq9r19p42Ld!07!ICMKr|CR<>@1fT+E#)StqES=kO?&R-0G!hVm*=!gD z);wAx5l|1G9-H9DQ`d=GLJ%3oCmed!j`jkGC!N*6vgK8FF0bau)6}#7?JK#mNFqGF zeTXRP9bTz}qX&QGqjxXm{Iy2peN;Kn1E3udO7SF2oWZ3&*99&XoHzJ_J;{vl#fO)3 zzQIPQ^?PauT4%?O6=%RgQc}CbDmKjv(1{*x6~p1paS(;P zw0~8PJGR9D>8yX~?uuN#oUYS&)1O6gxsOv*|7u@Y3HPksF*>+pSslXcO{b7u&(4L; zHC-_s-}!GQxp3m5Z#Cs9wVOXE#=HptzyzOfp%U%JnAJc*D*mCVHV}VE?dCV;3;PR} WFy*lRFZcKW0000N literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_add_playlist.png b/src/qprojectM/src/images/icons/hi32-action-projectm_add_playlist.png new file mode 100644 index 0000000000000000000000000000000000000000..d07751703aaa822fe03d9e867af686cbd9bbe921 GIT binary patch literal 1210 zcmV;r1V#IaP)eRkqU1mZJX`2-s{Q&uayEuy-3{B}>=M0BgrA z%|#pse$Wr42_QTdZy)I4*lj(sXWyMvM|MiB6xQy#_obD@jRv-4&rNS`gBz_KV*@KmJZfF+%4aU$;BNoW zTN~<}9HE}~; zefTe)ec~|It}OrY$vN)X)w>}Azfa7v`>xuWK5?Az(PuyM=2!hUCaPJ+;O9y=?fBTr*)Ovux1O#HR0fI3byb{EN2S#WuCDa?9c+yOeRCyvP z!*w(p1OWl!35W?ul2ulS-z#c^bBa^JDKr}~^+p+h_EOAT!@Dnp!rUV4=<*ez=!#@S zOiDn76Q=}Ck`==hV7^i2@LLhXyGn=%BCzXrOFaec>k*C|^(E|FH|H)idFL6M1MBiH z0AdXYRJ;a6jAwccaP|l=*b8F^b}XZq5f~n>GCbUQAAUW9AZXeLZ@O z;-v;}yxa#UvkNV1J!RjL)3qvT^hk$3)eAj3?NKyi|Zee@HpG&6l&It31(0_|b$qDVY z;#wU7JDM>Aw;EKTJ`ephK@kt8ifVE0M;n?B0myE!PBSTHLefLY2%!+3pQXEb8i3|( zSnx};mz7<%Agct;aP%4iIbf;*DIQ4&TtwJb70&;Jaw!zHfB)3p`)lt%{lZ{vXRVmNPFc2^Z7P-0@($TaQYT6v zids~*m9J~V#p~eWjPmIRlUGiixca21DiVD20F~0?dE2|$=CnoB{#fpF literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_album.png b/src/qprojectM/src/images/icons/hi32-action-projectm_album.png new file mode 100644 index 0000000000000000000000000000000000000000..b8cca19bf362b9934e61abbecafe04a1f2bffed6 GIT binary patch literal 1689 zcmZ|OX;jl!769-B2w}-ifPi|mIId+X#iL?WMlh&|1P)7;offbxAt8_r2n0ePKp-sD zqEetNw)R-442~T;%?KiEgs?-x9#kL@lAsbHH&HkkW>jI+|++5)JGR=f6m(q%hX-YSEYXU>>1cjG}MhYUMc+of5v2ipKiIkX_ zNG6jh6iQN35|v6#PEJlqNukkbbUK~EU@)0X7K@ddnwplDmY$x@X0tOgGBPtWIUG(_ zR#tX)HkZrI$;sjIc)7W`d3kw!K0iM{zo4L?u&_`d5EK;^6&Du^g~F1OlG4)Bva+($ z^4rCw4f)0YU=gP?(WkTk9Y{t7d&PIH;Hi5rMDcYoetz%c~c=hiK z?`@R*pt;kes%lo&K2kJ1UcCSFLenpEEh5?D)|p@0XGERT8uj|RX8rA(w_BT=dc7V1 zfDga>@P9+2))=VO8r2T9N~PYZfB0>vQm?60%C$A6a&1+qTv;_(HBhV=tSA&K%Ziny zUo9=XT$C@oo|nIxn}0bszc4#zAUBwvl~2#iPfg8DPR_|>GZWJ3 zap~09xNLN6Vq|oDcyw%NWNdJFbYN&iGC0&H84&kNdSCSQh+lN~zUb-^cXanY?-I9n z^|y76w02G0e8Si^{DC%_AJHEKHZnGWm_p6WEi7Sh1QLbDSYfSgY;kt>A07JS_^H$Q zb7x)MTrc{BQ)sD~xka~Xer*2vdB1dOdTMfXK-?`BJ$g`GmdRq#Y02?1(P1G$*ZjOZ z+|Hdo<#N{5DH7~gnU)K{^rda!)D%TH@CKQy6v6C0D5&#>;V|qaQ#1`$FrOP0vYi= z32p%{;+SD?f7y8)RL#EI+9um@sIMaIBa>@Mg$e@>KA}pQ?mpNh|R!)FBYv6wpYy zeZku%;F?S1A?M}&G&jQ2@%VKJZkpOgeyNj6r2!+A@!vOwdo4mfqCfI#y#af6=Y1IE zXtKZD3ob4s;UkYZKKtGsyTZ29Hd0y0oMJ4`r^DmbuZ{?BNBOSZ9S@bg`>B7gt3g$* zS5@zKcD#^*_apc;To0AH*G~8bpW7o)yZ)wnN|Tci+#&4CW(?oIwJ*BLwL+}qqmQ1BQYny*5FqHgH47u+`XSii z^2nxOSvPn?^aFGBVk7J}d*(?FINa&rx92+<9xeUQ0S3Khw*J{mTBGiQ5(K=n2%Z{?7ibBWVXNWF0xt6dgpO z?}gSk4PmugS#Ke~LW3{a?1koh@v)0HKL01DRJTD>j&6^~kI&5AmJVJ%V|g4(Y6-nH z@{iY5gIX@tH2aq~vVUMcfCTbK=%4Gs#%->=YEc8Zkwo=&KP70b)AVXuf? z?;*~maZXN82ohI>sC!1i+#t*~kK(*!D3VZ literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_artist.png b/src/qprojectM/src/images/icons/hi32-action-projectm_artist.png new file mode 100644 index 0000000000000000000000000000000000000000..87b4681fb019481848f0feff67c76fb0aea58f39 GIT binary patch literal 1474 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U}gyL32|lSl!qY&W=;r_XXcP+ z!i^xZK$4kLiJ4Q4mDi9%(4Je=hfgwENIqLcxm;AWQ9`3bLbF#!Z<@T(JVn!`il)nD z4HigfO%+k;5|D2YkgMaDt>u-j;gc@slP=+tD&UjK=99|flLn$feh@0*mo62QEfJC{ z5t1(vlq=(tt>%_$J?V)6V;d?u02^&Z<>tJOnLL! zO4jpK9TuxPE>m||rQx|r%V(#y|9j0sbs!U$@x&zIH9V(zpSRGxU#FDtUa%!H8Z~{yRa#zsJXnhx4C25v-RluohLW# zIlcA3`F$sE>^bvv^Qkw>4u71t|LgQU-zM$+-o5o_^M;?btACU(|CzVwd)BEiT{ae(u?_pDZ1Wo$sH{q9O-*4BR-ws`WtlIyWHvcth_@h_*TdVS?TFG~ng3s!P z&Z599akV7KFE}7LG%PG6z{lOy$-&mjSXW&^MoL;vNmWbNz|hFd(#FQ#)h{SKIxaCa zr?{rId+OY!YquXfdEv&rXRkke_y`7{KD~SO^7XsdPwwBodHwp0TlXHl{QUdRUtl`< z_wVnY-@m^+IJG)gpNEMNXeWJuUtX&@0|Vn6PZ!4!i_@hSBE1hgh_ofL>hD<{;dqf_ zSx1oQb)_2*n3T$d_ZoUGUeRp-=Fh50X|IhA-ZCrAyt?b^3!gn_PBz}Lo$!9HVuHB* zIpIyVGVD*&iuOfe(Ix@ z5^M~YH5WhnU$f7)dTrY*2Zl3p&$rw^`24l=?w51BIT$qNWc+*Z`02u0{rO!I4aSk5 z_usFcTef+E1EWgF+5fM;Tj}asw=)T(etq7(yriE+q@iNnzvWN17ceCGN!Dzb@-0z_ zT_J6%!c$M70)|d!RS!jLCccD!4xB+ovjrK%R9cr;{65LS;OY5P^S`kH!|9-j%SC?j zh#crz@=?T&nSF!S-%V4Fe{m9N*c!Y4{^?~c9t^K{pNg|8Vzy4S-Frg&AH(d`Y%Q~loCIGs-1K|Jw literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_audioscrobbler.png b/src/qprojectM/src/images/icons/hi32-action-projectm_audioscrobbler.png new file mode 100644 index 0000000000000000000000000000000000000000..42351fa6300937018177ec50b9c0c1bd522d3add GIT binary patch literal 1600 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U}gyL32_B-85tRwn3$NEnORs^ zSXo)w*x1A!@t ze~aY)ktqBtSMo=-;*WOCU;X;O#!Y|CTK-zJ{tBneKPGj*jjDba zlzrDL`l_4vSugjKcIF4|^!J*n?=@21sVBWtOL(iA@K!nQtzyg@xro=&!7n8OUWoZU z7x8>5==wy!`7s~R!S;{1Z69*kJ>s-|1avTm!xIjBkh3`)pKyA<{BB*-tA zfsu)sg_Vt+gOiJ!hnJ6EKw8JjFE+Qnf7XI!t2XY~d*H~)^OtYjdHC|(r?20>eFcH< z-+%o2{pT+b{DXkMzrMbGdi&C`ecLy$U%hbnJ>5funGxtTdH^35@vXpu;H#&L zV~EA+tCMq!FF6Pt|7^)|Fey~0&slN846}(J)7EJ6yLR(TojIfNqn73r_24Eohe@99 zvma*PU0!tQ<2$82SFZovf8y@De|hEkn~pE|-%)ANU}&~>YN@el*}s#2)_XRd{61gs zYL=Mtu|MM5-mT5%l1LNCElub3todl&b!hjCeOUqr?zAk-KfCPmPc5Fqtmh2*oc`ag z*tTh%M_cFin>ucVX_s%`sZ(&zn|(v(TPAs{+Pqj*lizw1&a3F4_Vi~ z;^nUN4exfn`}C#fO5!T-X!p4#Cp9~g{%vU8rG7fNB69omh%#BFWzQIFD}N|;KTg`$ z+#ezO6NTXI2QSw&9xIObxHv7>`~;VEudwu%nQ9EZ&2LUGQs9z&^zQ3D zM$u#D8H^w1y8p*?;6bQYfvo-I4B>s*?$>DE$* zaJ~1&9{QSI`xLmAGOaG&bV%ukN8q>2iAxqO`EdSHMdY-inK92cYMkEFHz97yQ}s2= zHa6AFQTV(-v~SxZ(=DZYCVfcfztni~X8Ix(&m^^#NAK1y+orPQL77@&6URF>zT264 f6DuP4pUeMZ=9G(Zm+OnW0ZM3|u6{1-oD!M<)aZ9* literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_back.png b/src/qprojectM/src/images/icons/hi32-action-projectm_back.png new file mode 100644 index 0000000000000000000000000000000000000000..e0f1204406299503aa84f7d6353e0d61eadf7878 GIT binary patch literal 1693 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 cDipc}SI)-7Eo`l(xv3Sj%)}$*UrAw(sQ>@~ literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_change_language.png b/src/qprojectM/src/images/icons/hi32-action-projectm_change_language.png new file mode 100644 index 0000000000000000000000000000000000000000..ec19880d598cac36661e6c53c012f2cfb65ec1b8 GIT binary patch literal 1740 zcmZvbdo>Sg z5Y0dw=8(L%*lKD@@`$M`e+7XkK|+JWvGVEvr0@?ZDk>@~E32reK%r1oRaG@LHFb4$ z4Gj$~EiG+rZ5u$%9{JkTLNSiB!DJRtZ;F#Z@m zB03@}F7ia;v6$rOxYW3W^u!cGdRESvAM%TeE|!&*lSq{{HMi^Q$qkK-6bhxKrM0=4 z+DvVc(@1F{H&P#xTkh4j);?^zb+7%#-KUjzI_R{xkLC-AA7uv@_~|og+V)ZS0t(bj^yyGC80~27pp7U;KqFT3it_7Wniz-XAku z`Yey}nLob-Fj>N-FW?GW#O8|mfKm9(6oACN4hV`=r#&Q`xy^^NGZ~GdY>b3ExG>C&b4dKO7Pe;P3B`#bB@jxR9`8 zC)09^uH5{EOzj>TrAV;yzeR?%1)B6e9ElOdUhZ!s=yzT5<7N6gp2;*JcZ!R{CL+uQGZn`tnn{W=q-FDnpuU8Zb|#xD0~ z+xxp|T>}aSv`K1cN7a%pnidTr8~V+(y`RGbJP?4=+X3$@ALo7PnmR7`TVuW=G%9kZf*Cswh>*KmNCvub5m;mREDt4Jua zNPCkw|CoTcHjLjMA5kEHD zL5bY8@_>kAj$z8uE+lt;KsPp-U5vW>q{8p2r@`w}%sMzuZ}o1eH)`%lQzXHO92cR| zFbucZhDGn_(`(ND$c4Rom`|tz{?i1DgH81v-S@+Tz3K}=FX6AiP_H`IENa0yZxe@z z*Q%n}uC$6hyrXpdaLvA7@1Ru>p3Qs5#*zIeX;~=KH@F)IhilgJhIokE<2PZ`|Amx| z4BS8L{C<9r`t*1_NV~>jeB?a)1`R)a=u>p-gmakcG7 zuw;|0sP)acn9-oMp@O!>=%`m~k6;~4^!DYf(EJ14g?W>0tqa3Mm^EwW+O@OREP<#^ pmEKYbyw`s;GJoReiIKI8O@%`(kI!0PiOk)q@<40|rqwT|=uaH|gu?&; literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_circle.png b/src/qprojectM/src/images/icons/hi32-action-projectm_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..b26d84547cf276dd4dc93978a49dc7e97d2446a8 GIT binary patch literal 1586 zcmZwHc`(#{90%~V*3t^=Sm$E5u#S|ROIo|Gb>$Y;eI=V?v38eTW0V+5$3vc{gCbK? z2q|)3AxTY*MzZwCq$KCs!?HX-_0;r7?|FSczt8ud@67KvpYN~G+mk2*Q-^^-AQ@K| zM_=HH+FerOKy|Dx8U%sFLEawzPQdn8#C{7H42D1;5)u+nC{$8XQc6k+27~S0yH{3L z77mBY%gZY&Dk>={ArJ^<%Wa^k7P?Qgns&O`k8BtvlW>IRm`G$*~N7^mmcPp zH0PDI6%qN8`TtN&GJ|Ld-SvF^c%?jd&9&{W63)RVrcN8RkkuBrM?c3nHWwr#Se zZSr30d!W{~v1{Ae^_|mAJs&oNB7k6Hi!a#X@;5nL;oAEDfPS5~$rEhx_(HxwDA*8g z{ESd26p2LJ+uJ*Tia@ya{lHDWV3Wra^0*s3u7J1B|Ao8G=W_TQ4u6d!SXmNR?P0p;m`>_0WYU$}(b@E0dm)mU8N3Tr@CI$9=qx`S|$< zhDJoiL`8%J2l)CQ2L>)AgajlQNYIY}9f=eY8WtXVDwW18yi!qJ)7bfR`1RPt`*&|g z+iPx=p3h;@QYn;_qy%zGMoxb5jfR0YQ=gZ)n_IgdcU#0?`uF9dQku6j&QuSn0E3E) ziGhI247^zB)Hiz&2rT33NbtvwWRx_LC-KMvFGh-4H8r`{fdg5EuPDYoyENcF@31am zFW$QcF>mc4ZUB{2jvbyTvvmuQ8rGA07-y?QHvtFZsPTc8l9hB!2yN<%21K}n6H#60 zw@Rw?Tgye!sX3Ut`U?gwv+UlhMe6yl@n0tho)ZeCp{w@sI;v^lzV&k--CQAYE$ku@ zp-8*sdHZvcH_T8Px&t?Pyh7IPIM}m6X&9i$N~b8yB!!FYRPu#0?J)InEndOZdXRYn}%8s3?U(cD8&T4#ohXSB0jrgI+=8>5zt zSO~~PVn%VhGaS#5BMK@EFElN;N67Vbz0K^d6@<40UA>td#j6?(6nHafdeK4071 z8DrmUY@*Nk)SFrh6E+#VxP};+u+6$qN64PhwWn7)jMAEA>tn`K&}5ul3%sMQ{-aE; lkz8{e`C7t++{-MXilUSCVz=L{_wJwH)ydQGfqmrZ{{WP`^8Ww; literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_clock.png b/src/qprojectM/src/images/icons/hi32-action-projectm_clock.png new file mode 100644 index 0000000000000000000000000000000000000000..fe64b140c9421f9323cfb67f6abf58e5221d8773 GIT binary patch literal 1734 zcmaLWc{Cf?9tZG*#J&b4)*uo~kj1VvC5VnSsJ-^7RF&95A}Ogp!fQv>OqpZaj!qXk zN-d>xYT6lXb)Jqcv37~Agb=YrYWI@P+x~jr^SQr!?!D*!aqqd89TMcHs-&+30030| zi3F0Qhe?})tfUfts(cOr$O1wF!hIw|AP^`cBO@y-3j%?_V6dE=oV>ief`WpgqN0+L zlCrY0ii(P=s;Zirn!38WhK7cwrX~ae(bCe=*4Eb1(K&SJkgl$-o}L~Q3f0%wH!v_T zG&D3aGBP$cHZd`Q!CNF`jGc5W{SWH$}Otw@kMIu}(M=CBS zB0e|rL|#-vesp4iL`)JjHklfmQW%#~7@u00kVZ>9Nl!{IP9`%_$P7u9N-vho{IBHn ze=Vh)Vy0#=(@vlLqU7t$lJqRrDayIb-1AulMg^V8E@oB~ zGcOb~FEW^w3`QxP&ZN;8g@yEj0$N^vQ8tA}K21ycni`vs8xcb}7Lsw4nC^y8K)c3b zj%3?;S6O)9HVF7=NSZQ={A3nAjXJ?~OCR+)^CmQJAc6igtLzcIvYYiyXXUr|tLt08 zZD_gj!`-^8%?&@^ZM@ZTtGTVYrQ_$;u6y^pTibhD+aI=dJZ$THbieaSd)JGO?w1dK zdHb;U?c=_YzW(w4fe-%}gw9c%9?Oxb$NM3u)MM)5H2kV7nhd#i-HBd zU}0fteqoU}zc|O^|J%asoYbe;`I%4iQ#11uQ@jsc-uQ>vk@1<~(P_@`>9+*CH8M#$?0|SpO=A<_bD9Ryq`KwHSP^ z9Lhb{t5^ad_*c$;2VqRi9OpyZ%1RqYak!zyx47bK(Zi-2g03;(&ADpc7WnZ{mGEF| z>_HPQcMMfZQf6n^7GFCdKsHvyScEieI1Mq^7cSgzuwl&;-)USZ{j`)I zHgeSnT_U{h30J2+RuKllfxJ5tr`Qa2gqiz6AoX@fua0T37CQ{v-ql-h0HoYSVul+g QilndC-zSK0&nuDjPnru!ga7~l literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_collection.png b/src/qprojectM/src/images/icons/hi32-action-projectm_collection.png new file mode 100644 index 0000000000000000000000000000000000000000..e0e4d07189e26f8880b3c2b48847ee7c04e44d8e GIT binary patch literal 1773 zcma)*c|6n!AIE2mn{gjAX2y&`D@3$}N2|m-LXrnr6fH#-SyYQD387@JIeyRdyq@FV{k-1a>#y(kkME~2Fu)70YNQH*K;S;!9zn8- zlZCM|OqPF|=As}F7$ndy*i$w_p-?$FIT#EkFE6j4prELzsHCK%tgNh}qN1v*s-~u< zuC5M;!!SR4*#Vq${F<4sLX&CJZq&CPdP?c3|%=X^NPE3`H^VdzvQGcI@Y+;w3}3GgEk zNG}D_Z|tNM0_XF9L;?_hNp$9d==*e0)Om4uvN$AB9CTKEG*;plE%7}m@s5yqhDkg^ zB<{gtw?Od$f3d5t$i-Xa{H@5z18_J5*dG9Foq;`$fTbORDMeAF|6Q3AcK4iXUAoZYj9gR8(^R zCb9EY`9NtUiC8s5teP*Y{!ms;E2~)|*3yY}Ok({?*`1ZLyWHE&yxXm7w;u>99||gd zU$1Q&aZpQ{iS22v4h^yNqhL>qAwtNE_}cRd4?3CiNw6myKi zo|tBn-?G;P>-@EK9)E+w-C(b7GFYFMS=-Aj;Sv*AWQu4E35_A8v!yFMaN`rW1At-) zD3yYLM*_k6|B!9@F9QCWfX83s^7vdHkHg`va=0t29QF!_#a>}D*$f7YE`!coUS=#U zF=&hQ4%|=<$c7*-#;)oA|@p(FTbF$u&Ai8 zAop_Sg|w8koQmdd3T<_LO9+TWVv$G$0Dw>^1inlXiS+*hwzvz!P5BAOobiSlN-!u? z=4P3h{*?&EPN*n%8Oi99+Nh)@y`u+43HlXmhLm;Dn>HSD^d+h5`_GB-gF)dk#OdD`u!zVSm@juCR7gd&;s(rQxOBPbYmR@ff-IG*)>c?7)R)$vqZW z$J%X>5cY>TtCI2}@myBELl;3bqVLpWcHq04bhpQ&5!#j`^t|wRa`ay+))%i_wR%NA zf`)$+o^&O|Q2CvwjV}4+yuqWKOL*uizTrCKK3>W+I{Q8!at)SR=jxs6K1fZ4w~R#S zK!Sd7e6|yV40t{@?wA|U)7x}q0S!E9DfEp0<8DK|-0y$dJ_tN(K*(=;siRjB*GZW; zIhpBc;h0?GNB*aUCG|{#;^}jZVOEnKC&^U2W&YX^>hWkSl5a4mmd{XyhNT=Lyw5pIukw-Dn@vM-4cqVoL9}SnS}+NTGwN(onrC*DAH-`D#g?y~68W zt&JJ6$Fw{xsu3TXN9$AktP8%wA!bW8?pb8^Ocl%fsL!=J`D4u=@MjbfgKROr>w|~G zqxZVoAAkM~nnlYa=q`Rme^df`6r|_o)OrOEP<)x&zpxUCY0BuQ<>8YE4~Om*P6f~MN?LdSh2?d9e(a2{tZaro z??c_Lz0+nl{%3%0X~HwNex`nCGAQ4xcY|LC^r8Ot$BL}P;6F1>cBj~*8$Hztl**%u_f4*|dWYWQ1t fezWb3DW>K#!zLTR_d~hty&*oH0UnRsPhI^NU%9a@ literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_configure.png b/src/qprojectM/src/images/icons/hi32-action-projectm_configure.png new file mode 100644 index 0000000000000000000000000000000000000000..4a2117b03ee2d69d6cb7af3ff5a17daa9a14a262 GIT binary patch literal 1748 zcmdUuSvVV56vuA_t*z3c3}0z1t=7I&)mmE>)!M&SVu^?#K}2GUEr=z=5_Hj3r=3JBIS==qhkFXW&b!Jztnp#Fs6?@89^c#e6oP-s=+HYmygM_INH!c`VAfeUUpm zFXJ+|*I`z|{bw(!4@1-jAjIGprD}O;NXyu zkkHUj6bcm<7KTQn!^6Wd7)(S&1Qv^pjEszmii(bo#^G>yJU%8SCN?%UE-sEhAjHSV z6N$uxgai_aL?)9H6BCn?l9H2?Q&Lh=Q&TAvN?KZ4dU|?BMn-04W>!`fl}gRd&d$ln z$<58B(P(*jdHMPI1qB6#g@trFy{M?DxVV_XV3d@Ul$Ms3m6es3mou5nlFHkKmw%*G zw8fS8qZwlX`Jd0_d_9x3>X5!}Phs1pvTah>R!QtriR^ dz|h!aZK`bAD|Xzhzi3 zJR_J}-TlV-Yj^jr|BHM|xn2zJ`68}+A=f33>qz6;=WwmFxF^%O<`j-eGDn}dbv*W) zE{?4exuK0&*FvvqqE_L-%W&ip9I>PoymSP$tczYbj#)K`S~JG4o5gKdlGu9VTU6mn zut+}VeW#|TS#t}^Y|ajk#~1t~K7WVH+1cUoMfL9Pu0X)&akrOQABOunU$!>X-M>*; z#-QhCrzH{NW3howCoC+COiwzxxZ0TN>uSL@b&eUIa`E&JL?DBLLqbtu=x|H~HZm$2 zhmVPkBg7LENaVz%b=!y*n1s<@~Tml zg*+KCZFnz8N8G5~H4wNeR_#X;nAb~s_7T*2n>|+Qns_fpx7)VWr>EncnR(a|xdAL} z7*l%JUDD0Fs|_^hdD}+Q92`RA&k$&`#w*I7?_?W!J-9ZssI90^V(T( zRq7hXy7}I-C51p1w_*Wx^KQ4j$yLajidn0IUE(2+$osX&PAy41;E@jeAUW!FFjMLM z!;77@WqA(I4@u9rwiHW=5g!&=Ji4rN=6hm73aMjIk=0B(eA-0zNP(jb90V}K)h7z+ z2Z>e{h%WL#z_q%1I{JwIXt%uQu@K%a+Z}?n^EGQD)RPFIdQ8xT}75?1B_^m5P;rIza*J3)7x^X*;c0C@wL{QhHT!Ysi<8RZnusKS^Rk9Uf5Vy=x2rx% zyA1ce>w2&yKJs%@<1GQx31NW9tm=F3J7o!LZoBFX>Ah87#v+uY_@8CzAsXk~BgOBI z;)l#pON$DP-ksI=eRjgeuDfhO!aAb)Ch&7+^@yrri7D7C4Fz?zMNQ@-yL9h4lsKg3 z>Xl#Z+PQNfzop*nrRyH)&blH&9^b;*dYma2cZ{~HhfQb>`e`f4R9J1|$CU>w5K2gs lW4z3Xn8rX$9%)jZBV`b_McGbt*rLzX5RrcP0P; literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_covermanager.png b/src/qprojectM/src/images/icons/hi32-action-projectm_covermanager.png new file mode 100644 index 0000000000000000000000000000000000000000..befe014250b1146a3802e79ae925fe9e3d339ef4 GIT binary patch literal 1683 zcmbW1`BRfu7ssFENkAabKuDs14uv{U2C8U_c495nP)Mo)HA2V&DPR-@g{Xi?gd(C) zSw(yU!c-9ov_)_O7bK8csUhqLh%5mDMn#saPu7Nx{RiI9eD1k-zH`oRXKqdiCD7K| z$r=CvTT&2lzxj4uJ!?R7CEm*Y3jjbMWDhj}<{1t5O##3D8QgsnB;QBue~zFHAz0H0 z_B$|o8H`bZ90=s-z{7g*u;E|L4;_M|MI6!~Vw8yJ6-3kmlKmDLDMd0TE$E{bw81r@ zFRTv;P$3WOC=H+Nsr%%ITWInPG^x^oRPGSOwr|BQQESgIOIIQizXfjR z3b(?-EYUC|3Wit%11$g;2*BU~3DvBr26kr_&h>29wETu~-pi*wGPDha+R+A~*@m!%6fbX|&jk(AW#1 z$8tjB^Jpgu!xOHAbFYSTOT)SUqjCAPll(AlStz%Rnpl1yp<-XcjgS-7dyoGfbgX$N zNBCu=*eiU<{ovU8eUs~gXK;I@SjrrhGVc-f0TXXD+zUO>NeXe-;b6#{M9Q|MYNboB{z z7R93GEfyUIG}^{(z7-oD$u2_PSg zj7>~Bo1S^$Qf^+!_3FmQe|7i2937jOl1Qe;$3_Oagsm<2n`$esUd}$Bp2CfbX407q zW&}Gb<`9R?q%)YTh$v2MJU1zo_fuAST3UKmUS3{)LD9AAH4i$6r5_ZK!MKXSpx5iP zT1cgktJIKA|1mXZI&-Z1w?zkO^+srMRB-(?mEh@&L0KZ;=3U=Yev%FV@be_%chv2o z3j@KyuM%9IC*HAa3~c%)o0a@Z9C$}qybvKf^*7F*NGv&2+eEuZSZwigZ7S()(|_LU z*}n^>!&gu$S|%5VyT=tg{kez`hyKnUkK8V?xYe*6R1|i5@(JNw&^zbv+dV@}o7O0V z78gMBvAPP(ixE@uZvVh_nEH(+alU{6pIIK^Q)A0MZ}PSQdTdR(yk>1p$#BihrNrJ0 z!5ymZi;Ml!4*odHVTXSqszYrRSS*-0QWw7spW$MYyo8+1|H>&(%?zm9cJTgq;#0T6 z@o2Kt+T#+}uh~X)z0PL|q6~MrHA=7|=HB|`&RGub!2{C1)VAS)E*nJuxjL_*p$|Fy z*CSbfR9&wNkOv z;sWj>ML7trfdEl#u~Za_ic|!}ih>4`5RiLm^bhD;e`n^Kd6#Jlc+mnTfRF)*uFus8Afy0N2I%(yMm>OOF9O?*FzZBM zZz9Y(R+(H`g}I=EKCycBVO`w=dU|`1$ek!uIS77(MsL#B7h^ElhK4D|#_^`6kyvb) zrKP`>m8Xpj!OqSOhr`+1+dDWo;PH4zM@J_oCue780)apz5?x$eNF)-OOm=m3b#rrb zcX#*j@bL8Xq);ecUS8hb-abA)zP`SGetuLc)!*MgARvH7qXh;A1_cEL2M33QgwW~q z(9qDZu(0s(a0Y|HWHMPS7MsnEh=|~DIFXT&QBhIR(a|w6FWfmkdqEG#T4D$2{-oRw875Nv0$s%f+%o}R~?31@9_&1=7CHNkcm7~KT* zrN}j1dTYA%40@4WP(C3Rf!a8Q28Ix;$=)RWU>ji_zJcvfo)1*+*TO>Elj9@N!#H? z^}>>RL8}_ITBF@Hi_r2i48tq`KN^)%uW)-vV6mO^JUjL(fHKm$( zseJxo?#Y;9=!s(RulEDPANq$BeM3t5BbDr-TKZt&+I>yiJ=Nu&`R1 zJ`We4feTK-xhG-aaVVo6O8yy+tA(R#VAer6v>FcB1N-b+p;WE7?_6143ZK`$guEo4 z%O{at$s}jIt+j>mXH2x1nwnv;<`$M#);8 zt6tD+Uv6&Hzcbh9Yijb~ouVvoh-uThzuEvbadr6(b)bGtYR=JTBa?vK^2C6sjffT6 zo3nrI!#9*ms?TNg*LU>b9-qF@svfPjn)sH&J2u)?%+$Mutx_%yH@O?&I&UF(v(Qpl z?F><@!^qfSBsz{skRD+p_H4%AaR7?XuJh&*+jV87)T=t^UDxXTx-OAETF5ze%1`NW Lm|R9nm~iL6m{Y7G literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_download.png b/src/qprojectM/src/images/icons/hi32-action-projectm_download.png new file mode 100644 index 0000000000000000000000000000000000000000..15c8b001dc723e654cd732c12154e299e4563cb0 GIT binary patch literal 1688 zcmbW0c{tR09LIk%v`QXMeyUDfm7YHJT*jYK6DwE+4F;I~N<%v)>3hcm(q=Q$ad>6mNKMq}azqhdNk;#&RUdwRt&UFaX)pcP)B<$gu&=tOj_%%HCp*M zv`QCBwFiaiM$~!{)gDBp8&U2;l-?jJUC4T<-iPe#M-B`i$3~EoV~EKlVlj=Jn?_ko zp-euZPka#58xYs&mN?ihsnsmA|Bk#?h5CNRA>EjhMqXxTv6hyWR#sNl*48#QHnz65 zc6N65_V!pT*1^HS(b3V#$;sK-`TY6wE-o&vuC8uwZtm{x9v&W^o}M@y&dbZo+uPg6 z$H&*#*U!(--`_tVARsU>FeoS}I5_yig$p4eA)%q6VPRq6;o%Vx5qLa4GBT1tAVft) zMMp;yi9`~K6cZB@8yia|ljGvz;^X5lUc8u)kdT;|NTE7r2!I&obaw4kB-Wq+6imDQNBo!&6{+6^a1-A961RI3Do141%tKuu2el zT@+OXh}D2p17d4LcCgR&NIV+c$tiROGc_$eBQuMYos*l#&gT>q z78RFpOUroG4J|#RUxX_nu%WfDAKR}6>2BF*@PFlZd+0HOptCJZj2-nm6WP$ABvQVO z@ZOACUf1Q!?F&nMS9#BAtzp(s5UOclY1gW2AzLY%XTH~PI-M9|c3;}Xx@iz+*gP~I zck&DKC!Vy4tqgrQGwlWMb$R>YF!e_M>~1#STYm+c`jpQxyz5=5272nIT;*BTTk4C8 zld<*E;~m%EQoZy@AsPm%tujUXWtkE71$DcO-yTJ!ft@lbKN$?1=|6p?|1MqW(NG^* zU8sJuT$ner)~jbnxNA zPPM>eT%2;>us}wR z)XQbJS$hO(GKp8Wyf$!c)g;b!OdaV>EPRIpa5GwlDB7c1?IAWQC>b zRD*p*>Ez(#CF5qa_bvl)@1EhUcbu_@M{k+sC5#SIk3DK>3*OrD&9#U*h#w`O_pdokO}( zho2bW9+bI?wUXXf%xLnP=eoNn7=yBH271i*GiMlsqK<>R!H1Rk0sJ=}44tON?do~- za}N$Es}My=GRFx7S%O?6{|sBD5N&*Dge!fJ(Oy-vs40l=Q#i}!PSu1e{n4685|4VS pRCMB+mn2bNrV{SY`2uztL6n9$E%k{a>(<7zTA13H)SdRG{RJ+Kee3`L literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_dynamic.png b/src/qprojectM/src/images/icons/hi32-action-projectm_dynamic.png new file mode 100644 index 0000000000000000000000000000000000000000..2838d50ad4f2ed6f73460b8fa4c017f3b1e25ea1 GIT binary patch literal 1683 zcmZvbc~Db_7RK+r35#J!-oO!0;m+l)66O>B3WZ1y(6`x)VBhIXMi zf1)|dJB-oft_Q3(=cE^ z1QG^7yMEBN547$Dt$IMq$I!+u$h;F{eqYD@mY!L=f$1e9^QQF{^=4M5ENqThzCa)l3WdqZ$tfu*si~=HX=x&nC_OzrBO@a-GgB-UXJut&XJ<P{QDrQWFja#FhEQ9wu|jeb^OVkyX3Hsyyh&cLvsM_4*#~cEQr&ijnoNIvYA5 zqfWrE3ov>F7(W6`9s?V?0kbE-#$LeUDPYwH*!BbXKfx`7p#5{u=>@p`B}jY)dAx@H zHG%Pd2azWs|7no&9-@AL=ra&w7K)gM*o#oC9Ex9o5|to#^&jz6AYTOvVNd{r$uO9r z0n-prgo5cPl!0P1k#%C&M4~d=quQ9Ow)zIP-mAv%g9!!dZAEIQV%Vhw-hM!{;}AkD zL*2^J-Ia)E72h(#qNfPjGZ{ zcHK^N^Vsd>L-zIa51<56X+iYh5JqTNcmy+&6~&I`#KgwMCnP3ud3=E|IVCksl%A0( z&dQcZ3(I7un_7PD=y^WzVQx{bSXHTEjYfkYYX+-Ul`Hb4#knQ9LaA6;T3no6T3(hf z$rtBmK7O42^#0wO*P|~6pAC;s&Md-w<;PTx3R4;yLS7*1)Cyxx-De=gb4$))d`9p_o8r-{XKm6wA?_s#&b0mXT6?bHL zfBomm7$Did;&x>568Vo6ER*l}%t_SgHgiMqb`?V&nC5E&~f+V;=Zx2=s(aFX>*`w=B{D4+5y#_ zMECi(?Xhjm4t2HH^eYE+48mSs?yEljq{-a5vi9=AiTYtTL)7#B)2*GEoG>1nQ5WLk zt9b76EwEnT+O)!OU=h%{db{RZ{I7lPI-Ci(z8XjJj+m4ZTO-L;gzGykm^k2kqx@J9 z%RXyk4G-A7vijkN4JXg%rX5{cd`n0w9BKx34mo;KT^vm57yh=W3we2S@Ca zl1^~1UCamS%IsRzZxUWC+|U!gQMM7H>UIR~xxZX__o@@2$w{}j`f|(Yc_%e%@Me3v z>3-6B-OaGAgAG#==W~~zli%r*Hff))I8^ffhxZp9?{#B``*<>JDsylmyoR`=#NOo; zU)ow+-#~X{ekj{#(RZDx2yNTHT{yl-(Qo4 Zr|c$FipotgpQoR1j1k17T?-VJ{||<46Bz&i literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_edit.png b/src/qprojectM/src/images/icons/hi32-action-projectm_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..7547a5155d33b7ded025ab163292554a680aa36a GIT binary patch literal 1458 zcmZvbcT|%H6veYAVb2gC5N6nWk3a?qAwYlx2oO-giCRao9%&g>L|etU>HbcdhgxAUBrKMnz*;%sa5w^iKq8SS6bg+-V=x#j7K_8-@OV6dKp+x{8X6iT5=m22 zQ%g%rTU%R4M@LszS5Hq*UtizAz`)SZ(8$Qh*x1;_#Dq*Ho0^(ZC=@d@Gjnru3kwS> zm1=2eX=PB>fm$$dKkB^V9udkn*CP;hW?NJvO%XlPhi7=ytG4-b!s zh+s0AEEbE+W^*{4$jC@8m&@bvqN1Yse13Fvv_K$;iHV7gjg535kh` zB9TZe7AGYoB_}7Rq@+kBlGN1Hw6wJJ^mM6Inv#;8D9VY8+ZoBt3koTrJD)SPxTb4( zhp6=cOKe2qnh==g72wzwIPNK&@C;6Tz6z-ot|>>X(u&Y(MQFclQ@qNf5D_I z;-pLXOcil0ppgxdHbA8HpymchGaJxeyQCvk>PhAeM4wEA3bW`*EAE&rXN=Asb!3mZ zu*cmvlc-BK{Y?8n*FT$_z9Sv0VY2H zV+vqo8W^4g1}A_w<3QgS*gFEgeh+pJfn7sj=R2@t5Nv-7$p@fk{m|1ssHqofd<`}9 zfcLtfx=yIJ1FU%g-fV}iw?S9s(3MuG>N#}rDOA=1oo|NDHi5r20;e7VCmH}*16cY1 z{PiAq=q^}X5B*%XTvWSUaBDg52DG;t%&h`{1}(7a+AnCEBkN7JU`u zFY@;(`Fj?4I~RCcXSti^I9ao-3`Ioh2ZlruCY}x!D*OcspQ!0IzT~u(4%F`w3gTgK z1QLbDU~zZ?QG=wZrLCi@r*B|rWNbnKSs&5I|GU%36ay|e3e@4)cX%$!mM zK+CI9snx*v{d6*XtgpHsiV(JHUH$O_Xxk~}Ia zZ|MA`_}=JPihibunU!o?*imV}J8-Mx;M*;(Ig|eDrza*`hu*8K();8MBbz0eriVND zCq{urP&7x^+i{=vqR#K&wsMOv`2z-~k1bu452XQXj+cyPEN3+p4_%q^qV{!|A2>O4 zsNnhy?I6nj^M0}|mp56r*@SyN%3i=1pkn^4pg3M-dpLyOmc^hc=Xe)hRta&1<1OF8 z?u0~-<;g1c^f=c^#5dz}E6^0DlY&1?&JOE0#uaBA3;oa%c=yzi)6By8AFAt}|LHdk z8aGC5n-;uWJiR}IZoQ{zs&p;uc}KIltay0zVbL{$Q_P|ks%VN=`C$ubw5%bw5^Nsmsc(q%9PsT*| zt&JXf*7n*hi~;+Wb+j7BlK3c(g&2>;_r9sfEgzwlMxlD9gpWW!?31KXZ)R?h+8%Fv z=IB={P1mG3*Y%(#x151d7g%p6j#f*GF6L6Ucb6Q?&)hqyhG~VXiu4UB%c}u$SpsHF Hct+uWNHvJs literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_editcopy.png b/src/qprojectM/src/images/icons/hi32-action-projectm_editcopy.png new file mode 100644 index 0000000000000000000000000000000000000000..d5769264c5b7260d697fd4dc592c97518d939ae4 GIT binary patch literal 1409 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 XS9+nA#^sZvU%r6o=0m7De39`N$I7ai literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_fastforward.png b/src/qprojectM/src/images/icons/hi32-action-projectm_fastforward.png new file mode 100644 index 0000000000000000000000000000000000000000..0e3c7c66c18d8e45135867977bdc483d39ca355d GIT binary patch literal 1684 zcmZXV2T;>j9LLj$NFyQ`!XAkWi-SF62NEy?hzPQjMus6&rb3~B0Syk^HZD*qvK=5q z5m2j$7%M|o1*Jql4G1A*uYVF6xNGZOzxR3H_ul>9{qEko-|yZ@LQudehzSG)0bq|Q27@&;G?p)4uBoZHV#NwAEiDKHqOGm1 zqobp%tE;D{2ZciQ_4Q#en1O+Tp`oFXk&&^nv5AR^si~=%nVGq{xrK#=rKKet4o4sm z>(;N|u+hqDll2eQTdlX)Y}sbN)y8p~owKdItF42Zouj+Glc&A2mxGJ9gNu)&E7H-` z*Kxa_lNvXalN)*oe@C|fXHV=BIA>3six>V|T)ptF-ivJa#<}_6+C8lRyXw*%cZZ78V{J9uW}{85tQJ9UT)BLnIRS?Td|#i;s;b z#U&)hB_zd@QsNTR6Os;*4*Z;$@(VdF|3F4zYF1Ht&Z&%iTH4{#RLad1N@ePix-{y& zw4#ReV-He}wUVjN_Z9xJJ7*A^KIXaq)Asl;F0m{pHF48U`)6)Ho~UaZuYSZVr;psI z|MS|N{>ycJwCX-u&A_Fa!ArG6SL+5!Z}C>?zg?A z|NgG!<=A7!__H^Y9X+2JeXOpb>E7X)zLDAf_w0cW?7Tia-Kk@c7aeX6azw$OdXX2N&rv*03eskW&cRMRwxuIm1^OClFAi}ITzCc5{XL>s9K&}0VGza;>%UUGS!|^W#m<5*d+zwq5^joz?_hws8XK-iAS!;?GVp7W!{m@ z=5A?eP&dGnLm@%C;FgFDYY_;zxtXycOkLkly){rHn1P{@v5BdfxrHShVYSu4#RG}P z;CF_GN9~Cr#>OX*k`AOD%*xKm&CAcv%l#$i=gf@MpAr*dW1{x#-l?v&;NU zv`cr}KTL5&GGOtLg!_5uS@khe7}|a7Iun@A_Zr}(mQ`P%Df<3b5D0u6gF=S7b|wGX z9{hn|#u!ce=+VM{vcZD&BYXu^1zuhDWXrYpm%C9%J$-61g_YwwSlyS?4}a41J>9>{ zv*3JU)~3qlYQip*k=!0#vF=v;kx}5Owd>Rre-`*Xm@;3Le=c&qz3FVB-j$!?pSL$D zX55)J47Y~c)N%*T4BZPLT*%d;mSd0$yiIMk z+ws(W_14hdMtrMJ#yM-3=HAm!JKeOSdJJF<+e|%?jCsa2o^j=iaei(37@@rEA%zLC zF1beBh~g`?=KL%AALtH2XLr!;I)}SUZ@*LB-yu%W>$;^H>INS}_ds$2_`Qq7-5P6VUGD*LyLrJ>&#s1{x$+dJNWNyJD z!SRJEeMlau_jqyDUZ}5rWc)j?mD~t1udF!a^;EVBzf-t|j0~CRGNG4g5BqS(Z-u;0 zpj*&-3~9F-anvYRjEXfA?yZNfsN5`L`)|DQ{xu7;GNNN48K#5huLGC21e#RFHAZYK z-F(1s)xp(0R$os>;ix*u0!=$mlp|5X@hyRn zM>HUv;c~+OZ1+k)QdDfaS_y;)W6>Q_Tary|jj* literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_favourite_genres.png b/src/qprojectM/src/images/icons/hi32-action-projectm_favourite_genres.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b095bfcf7f41b1898493c973e34acf55de3c57 GIT binary patch literal 894 zcmV-^1A+XBP)O^VwZ4+pexIx!vj1%a<&1i28@2^G37RumN2Jg)h+je&q+ zGYm6PP?-6+p|0IhBnjj|&ila{^0wG3xB*lH9X;o`K2!sOeQGaoIX$@6a*y_?jaSw+XecD&cljo8LwVUf z90U143w)%g-{B^(W2E7b){2FPmB1s?N|9Fo{mRRwk%sp( zl2Trt0Ly{eR7@fQz^c)L!!Ir);lT>z(tqq>t9VB8IS1-7d! U10<`R=Kufz07*qoM6N<$g3#fKU;qFB literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_files.png b/src/qprojectM/src/images/icons/hi32-action-projectm_files.png new file mode 100644 index 0000000000000000000000000000000000000000..a5e397e8549bc533e8caaa0061d1986a028a4616 GIT binary patch literal 740 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 P%MSVb1W=p2!+8GzirD?} literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_lyrics.png b/src/qprojectM/src/images/icons/hi32-action-projectm_lyrics.png new file mode 100644 index 0000000000000000000000000000000000000000..98fd6f5ee13dee6890678f8bb376804461b0323d GIT binary patch literal 846 zcmV-U1F`&xP)X zgHZ4ySOm|#R`8$~6+Box)r<7(#Ug@OK|v9f;zf#Bkb?G4QmAb)NwYKWJr8k{tl9Kn zcl#jh?99u~Z@>4=gH<8|Kh!n0lP+#r3ZrEYS)~wFaLUEEVg)zok@d83K{W!TubY>r za~PPojMTxsf~fY_49qPlj7*}mUcz{J(s|GXpsskAvisEIueT+WNl43w?Ih;%Hu`UI zv7*rYVSpH&Wk6axaQkj%1U_mUuTsz_9VI?3Q^7pL)h~Xory5rlN1+Z;k_$V?7 zi;w&JI{ttSCtM3)iOzXpkxl@PNV*9C#4ubXjWY}hgt&Ge1R$VcEtX&sz;I3G8i4GY z0@y|YQ7|zB5Hmnw3K)hl5_<`Z*-inD-vfq$Mw#mXMxa^2#B2hi84_B8zo)=Ztowrq z0hxm(Fx+@TVhKYMZbA@48$iblpiPTLB*aw@#9abLixQZs2lQ?n!>~>WVrUX*wnG0H z89*x&3Nbvh3#Y(rXF>uz6EA=!flyc@B7r6aFJ=WyRe@#zA%->r9kT+4q=g9$!_$IF zgbD})Gt(>hGP{AT62Wp5ey$kEn$9%?5W|bu15*><@#4vHU@n<)m>u_C6M*<8q-Z)} zrA&D9ybzd6XKZQfOx`Wc_f0nefEbFpY}O7(g=jzYR4Ig_978*j|31F-yF zUFXOEHaCM0YR@JY3aj4vfAi`k(DZrs<3`V!-mXY$(Adzr4zv{udGCZ22bx~54p7$j z7hf%0m>cd$b!Y7z19-Z6?dWu=u%_{##+ z$5Orb$7sm$=YD+1WAXhGmx^>z^x(5rpaB2?P}b{naGg;obqv7&OCgd0@k7yrceYFW Y1CtsBG6m#zHvj+t07*qoM6N<$g8a^E;s5{u literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_mostplayed.png b/src/qprojectM/src/images/icons/hi32-action-projectm_mostplayed.png new file mode 100644 index 0000000000000000000000000000000000000000..a20be4475e4cdf14ad67691164c765643693b8a4 GIT binary patch literal 1646 zcmZ|OdsNa_8~|_>O#$&0zTb+7h>C9nOD#>&G;(06Xg*t(Hbo6BHFK6SU61+5X9_+8 zv(`@KR&y_fs;XcxSWQh$U0r?0jvX2r8k(A#5C{Yc zg~DJkEiElL9Imact)ru(tE;Q0r>C#4zjNnK1Oj1TU|?uyXk=t$Y;0^|Vq$7)YG!6; zZfRdAj7%w-vROmz%1uvYJ}Eud%PU zb#Pgoz3pAS?cFyz06l#Gpk{aVwzhLxSUru`x*A$K>l!<18rZcB?LXA9F4wePtiD!x zxtV#fsl2N3LS;i4v%a+A>bVPbg{8Im#nq>Zs&h`)WHIV8bL)?uY)L%Ej!Ev0it7!d z+zuw+_1}M=Kziu4kLMit1W6pW!v9sv{m{f2Y2!Za=;ihF{lU5UsPFdB?K^+o>3`aP zfB3;~FCOtmo;({Felhyutri@#V~6|b(Y0ajMlmX}wTmR3Zf<;BJ2g~cV|f@oeSnx9`3%r6K8 z3v&V?e{NxRPB_aK&hY1FW(A)BGl042kF%3gGZP=CuW$vG98o!E^<39lVV8u_xj|=1 zGuX0YZL-u>d18wqzF8U5sH9$1l53QtONzZrIk8OUQM~0*xanT7fn!KkKdIm-Lgo^s;K%PQ}PoVaVSp~eY^c{KrjMNGIfuC}tBEJHusDjnh zcW7urpfD}CwvMiz{!WB}p^>qPshPQjrIodftsT-H<$!j?IANV#Tybvh9-dy_K6qaO z(U0KkOiu~hs+?&xVhW;Zw7~K(m4h< zviQ@c?2NFNV(?qlhy1zlalB)CEM)ou(<@nYy zUCG7Jp~oxmVSTj$n%>3!@A2zlZOIwjsJA8u^BJlLlw$1fwCpQlOlP^X+}@mC>-`UTo>{6-F>Q+x^!fAiUDgO^iAW6a`skP+FVQx z6}goC2}>BwwZ#UG<6iYh>@YUSj^+ProaHT!%# zjm7bLV__dZzk$^^?onua6WQ8PvBYvGgB5u_N&S literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_music.png b/src/qprojectM/src/images/icons/hi32-action-projectm_music.png new file mode 100644 index 0000000000000000000000000000000000000000..c212a4d99925be4bb7f2e6a3210e1340903d972e GIT binary patch literal 1349 zcmV-L1-kl)P)o+RNQ_YuB|s}iy4BK@Zd=;!&d%lY zVPZtrbHF)s zR7wECfk4+dobW?-wASPGc8jXl8L)rTX37LV4x3Y@e?ZoPSD933yw*}8CbF0^i9YL*Ya{G8w1oe(4pcr&ADtBcX8 z7CP=~rLA%PMmImnvhLi102W+lzz+?5Cx;S4M;v z-u0RFm^XJzE<$szfl^>Y5MmKTC`aQL102_8(A?~>`o0zp9WHU^ z2Oklsa**oF{*5_G=Xvi7nmu7G?(S^^ zpglBLwlJMk>5>g?^k1IjbYFpIA8SB4@wKO>HJ9^YOgEKBj50B;T^z>&KVd*?jcqIT z?Wkk;+Y!dbd}ci6crlQ9W4Wa{=x*h$|l-6{Vp{6?|4>q4xHMD;0<^uxAnwBuxrsM;DEZC-i0nPVRh zQD|$TaaH?YiYb^4xbfXE_peesvZpn!N0 zatHlqr|AD`06$lc)zga8oOL+w=P~L>3-s-8r>j#Z`8GHTbfO1S(SZS^^4+qMmzaSV zz^WdL&YXoHh!yAYp)Ku*2p29CInX!2#HKYEKceZo|64C5?vWXQv%~{t&GBIVLD)V#41&m4WnE_83CaFA{ zse%kdKskul#R80lNZPJ}8P9O)lEdY5V+JF?2=at4F=00000NkvXX Hu0mjf9rAJF literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_next.png b/src/qprojectM/src/images/icons/hi32-action-projectm_next.png new file mode 100644 index 0000000000000000000000000000000000000000..7935dec95f1b0ba787727fee09db99a2237f7bb4 GIT binary patch literal 1691 zcmY+F3sjP47{{4r8m7}!6h(xl)jDd4_Y2|;m5WZ3(AZMa%uAZg%rIV(om!Wz@{+gA$WQ^r4-jad?sB&O`MuZYyzlv+^SsY_3nIcp44{@! z2n1q42o2f?j;Qsfrw#T&&4oh{h&CjGOu>W8fAz_Kq@|^`Y11Yh9i7daH|y%^>gnl0 zq0p^cw;CE68W|ZG8ylOLn3$THnwgowU@&uYa|;U#I2>+iX=!C;g+L&zt*wzrq>YUY z3WY+W(VyAc+U?l6bJyf1+;y z5f?}d3?>JMh7rk;VP8-p_C-fgY1Ej5F*G_Y_HgW>Bzi(heB#j~$?2(S84N}ylgZ4> zV;2?{m6es()YR42H#9UhH8pcME!VGKZ*6O9Z|8D5I(QrE{7Za(cV}l82yY#J2d}HO zy{oyEU(e~TZs@*J|6_Tbprl4{>FQ4xs(T8q^qjkVlU>$xru62wCB5I2^yL=!Gk+L3 zUNDrxeiC=;RZP|dg)teCHbqRH4oRB9C(i~YzYR!w8;~k2`%zla{h_k!O%->%vV8=k zx?`lCKgtn|b8k)X`zHkh({iN>1dy+-tgcCx6(1IXcOO<~g|fMM*?ZCIqC_ECR)QfJ zpakSfg#zSnDV0ieAge2YY#CTt29~9ObOVW0{?7yu zOXN!uU{Nez5CftmK(q*ePUaT?p=kBp{3>W>_WjEAoOI%iWNbz}GPU$_V(IzV!n0A) z!{6ucJ({~cJli`sQ_>?Z6s(=Sp<;DuvbmbCTh-|;>NJizwOO6gq)xiFcBEFBa8(&! zt)N#bVk?ygD%L3FsxL}aI%pPXBif$3AL!8~YGa_Qp2 zf^>aDqXC4^1Xs^xrG6Ra=VS{v-lC(ewO+2EcWTaY2t=!#5adtsc$i)`KpKlc+&4Kj z>En?-@#{U6zQ|vQLs@O_b=uRnFqLu*X>SMRrZhZxY7{5p9c(*aw|yX@`~~c&YkGAD zmC(`_e!u<5v8d=14kN5Rqv5aL6$7kE;K8Q>6PGG80!lCTI9}m$ANiN^%9D}aw_cm- zx3oY=KlfSBTIXf;4tYA%hxy;gxnOnj^{yVj9+qE9V)p~$7Ut-K3O}#Uv3<;3mU-_WjMB`bu z4(IiU@5ALWbYR4{%)@Ew2)r!l|0`=nWLQBtS5TSF61 zKbj_2BeqZQF^-8#OU~b!>DAQNvX4Yb=h!bW4068yl5}A z%0He#i8960% z8GMDBv4v}S_O~wG{7X(#&+o9IjE^sblIOT_* no*P`QV%l341SLq|{g*X5H6?$b^UWDC>t753A0E^hKxh96sHjiO literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_pause.png b/src/qprojectM/src/images/icons/hi32-action-projectm_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..a5e3f159d213e0c3741b7c6856281856a3479f66 GIT binary patch literal 1670 zcmZXT2~^VA9>+ijr)9kiRzAdFP!u=Y7xTe($;WoZr3oocsG;*cm}x z2epPmAdq#mu;AVL8M8c$4fP&ebMY|*VhGvEWQFLL|I>=U$-uy1<;s;tMn;5JV3OWrl`@)0w-%cd&Nuj){zpjb`s<$8uvi`#A9_+{Dy`qyx$OGtx8u!RKe5 zIC1jaxxD=RE5*en<>eKXRn^rswY7D(Z{MzOXlQI~5;O|#Gz#uE2%75!EwzoU6?Lt* z>e_DBbd*+il~f6ft9ptm`wA&bvcY$<7bA21uV)@Tm)w8)slD$%_a6T7lW;=NJ>JkM zu4@42E9R1zi9G&x8JXpzk@*^9PW48uU1+bI)1u z$O4F&Dz`&Qx9{YeQ)Eu@vyOWt_Nc-4T%(J1lM^7K=gI zS|Q;2{)U;E!;o-G1k%dd#ukOP!(g2V9-bs}2#vXm6%!lB;U?@$N=ZxSeV=(W>sZe5 z<2lE&vyL1-bnw9bBrYpDIyx#QHlDLLjvdLQ(di5ZgH8*hQo|$JdsBGX=L&wTxcBJ! zt2b{42VXoLc>a29YFe(=>hyo8Q%Xc#H;<=%L-lsSTC6oPG|&fgIi-_NbtnkL;2JHM z%<>w@D0il}wKAX$Vo8uU}_G zSVK!2!C9~ffi*rueg;8$hu_ffI`9f^T zf%=!^tDb~czL_R3-(_pdNyYej`mqJidUg24`n%T&Cu%yjlP?;Yd2VwULcUlhR(Kr!R)_h z=xlN+s%ZXb+*A8Fl2CX#opN1}zwV5iX3NVJDb$|SvdL+&>1hwCT=@jL)ty6=_oSk{ z>J_B8Q<2iE*XI$v3K43>L4j)z7MfS;B0XF7UrYRMr{5L04h)v;hoe8wM5=XSOXT=Ea;eg*e!I{`r?}^|1aV#58OeZ2uLPf~(uoR2KBZ#|BY2HlukPFnsCYWuRn_dX@D634O zuWUq1wErI AnE(I) literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_play.png b/src/qprojectM/src/images/icons/hi32-action-projectm_play.png new file mode 100644 index 0000000000000000000000000000000000000000..a343ba8a83f298c7ad239893e7eb6d7f480608be GIT binary patch literal 1644 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 literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_playlist_clear.png b/src/qprojectM/src/images/icons/hi32-action-projectm_playlist_clear.png new file mode 100644 index 0000000000000000000000000000000000000000..3bfea9c5ce1c9ab9fe14115d558574cc201ca6f6 GIT binary patch literal 992 zcmV<610Vc}P)a4GMA;5g|LlF}7oSZSUH?Gl$|nch}ySShguR z(%m~dbLM>Cc}iDi#z~4hQS|=;flw~=o{a(5$4>LwDbLxX0NaUdt#|nr_{wf*9YDO3 zO-_z-YhqNRFI+;;UyxeZYcjINogBzMuH= zhxAuaOcTzx_+#nc88~e3$a@sCiIB47ZY>_t+9OKJk_+8V;`fDTpqT%H0CIEmEnoyx!J-G8X$H%y?S8%#L^S2)JDNT?uFO~({*OY>cuTQR&-ez6KO15t3wXND6vmyg`uH+dbEQER5I z^r^5hw_+^Kb(1*v<7Zc1dhEkD-=ETj^Ud(pE!1vz7#lsaXIu7o39PlZ7#lr1F#Vd7 z_};Sd_2={H<}VLEl9?g@{dGoK?;dc}9bS^{(%t>U?A4$2|HtV`6Zi)jvqj3A!F@9T O00006ciK{6%`g178e&67#J8C85tTH8XFrM92^`S9UUGX9v>ecARr(iAt53nA|oRs zBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7EiEoCE-x=HFfcGNF)=bSGBYzXG&D3d zH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}?K0iM{KtMo2K|w-7LPJACL_|bIMMXwN zMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuyP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7 zSXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?WjVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@ zX=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2Ta&vQYbaZreb#-=jc6WDoczAeud3kzz zdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyDgoK2Jg@uNOhKGlTh=_=ZiHVAeii?Yj zjEszpjg5|uj*pLzhlrDaftPuEn{suYU}L3FRjWKhvnw;XA1J*QAHWS4!Uz(?1rNjn z4a5Tu#RL$>1{KH&9m@+O&I~Eh4KLIXHP#Y3*b+Y35JB4#LfjQZ-5EyT8cE?EOWq+( z+#^oeB~aKWQq(9^*(X-qC0O7hTIL;H?iyh67-I7kW%dzh`4MdV5^ntxZu}E&{1tBe z7;yX>ar_~3`y_SyD|`DaeEab8`S0@i@ACQa^!fJq`}+I+{{H^||NsC0|NsC0|NsC0 z|NsC0|NsC0@bmfc^ZM}e`Rwrb>F)OE?DgjB_2lXF-sJPy;Pcen^3mDx%GB_}&hfm; z@wLVAtiST7yYr*D^P#o!ptSO!wDO*`@|?Bwn7H_ryZe&5{EWE$h_?QOv;BUs{d%qa zdaL_+ruKQE@pGE(Y?SF^kLOm0=1ha>M1AHvdEz&E?=ye-wF~Lq0002gbW%=J009C6 z1O)~M2nh-c3=Iws5D^j+6crX17#SKH9337XAR!_nBqb&%C@Cr{EG;fCFflSSG&MFi zI5|2yJUu=?KtV!7L`6nNNJ&adOifNtP*GA-R8>}2SXo+ITwPvYU}0ioWMyV&XlZI| zY;A6DaB*^Tbai%jczJqze0_d@fPsR8goTEOh>41ejE#e#`pn~r#bhmV}9ywB$I{Qmy<>cV+630Q^!`~DQz==%PIuzirPGnXPLOhH|;#`Tj)CBblZk#4E{r`Itzc%z8)z?A@zWqE=yD^9wP~_Iu*F>(Btg*BQiv|mf@VOe)C?9% zGe#+88B-b&XKVoi11g*eq0(i}n5kA`VIZhN$f^dmjb@saoM&>4Ns*~?f;{z(dEaSp zL)l`^+u;V7fGPWE1DdL;I#gI5f*d0yiGT#V{TX_>0Yt8#Sr`Pq?FsKeinW`hy{aX($GGgjCoOEL1&?g+RoJa5@UGk8A8;L$5c4L}W0eaFGrJ zNKEQ!J#;<<&rdJVL@C6J!TZvkS?(lkN5z9PR?a5qVe&0M^KX97Kh1<=NdfLGod5s; M07*qoM6N<$f?b-AY5)KL literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_podcast.png b/src/qprojectM/src/images/icons/hi32-action-projectm_podcast.png new file mode 100644 index 0000000000000000000000000000000000000000..8351af260b48beec1f49926b8122dd5c6d2fb051 GIT binary patch literal 1178 zcmV;L1ZDe)P)$2K`|-(ETfdZatD8vzf^7=|Zx{)Y*wQxzSVuJDj_J=-{c z=D2zIK#y_jyZGm1WHR{oE`^Vr#9_#~$o)L?*BspH*)h&KiT#iZK9q*1ZqeJ{l;A_j z)v7_ROl}T=S~ZAk)B}^F-!teg)79bEGz>Fr|5VNp&!FmOZgjS%N7 zr|uu192Uh{g(z~MH;GQA^;u8;q+L{USZ!jg7_9mCqR+${ixq>j2xh&m$waa?OunyO zod94@@7|V)q|57E6xLcSk`Pd_`1l4p1Qa1CNN9n){_4wo_2uUPJb2vlz|B8iQNfPzZ0F51du zMnsHY#b7LwY(Uz<^Pf3`OvOC|hw0yUh}buYy{EVTUIqq_<^3VF_DW%6?l;w21cMJN zv)*Pz8d33JiNKlXUSUt)03DsTarXJw(#YFftq7t$I6=S%Ox`i8zzezpa0U{UIxxoK zeG}(Od98{z0xSHi$Z!Za;=rK;jxDZG=Pc@U9J^MhuP4G8(?;t3&IZ$Qg~JD%?AWm# zfM2fF>F+6{XnG1jHJzslRjAYg#3_Moox;|#U{(NU(abL>JG%_dWc`xpL#R`&F5zT} zUERA;g}DXT*(E5FgQ^zi$!H=2aljCV++kZ9^K@nvl$?~2WL~e;@ZK{sJ%xxQda^x* zdBIm@BBl6P@?Hi`~w^*SNMOifK;(nmnHo&#xm1|`XaNa0pW2qXsC(>?>G zkm}Xo$ylpa@!m5(KbxQZtbdA^PQpPD&9Ktuh!rz4QLT;5DmJTc29}qil?9Wg-=sFR zT9szA$zr8~G1)qWGPKC%B}jdY%_=kF%T;0P*N+b#>3-vhXL`GPx{K*+9hXMKQ;IBN zTK7Q+F`s?>4sq<+KX{b84;}%aUT;z=N2{*k;^W}z@5%>nj!*yi-P~iMs)+sKDCOwU s*0s0660||B`L628U*-Qlr<+aS56ZTmDGJdGtpET307*qoM6N<$f@RY){{R30 literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_podcast2.png b/src/qprojectM/src/images/icons/hi32-action-projectm_podcast2.png new file mode 100644 index 0000000000000000000000000000000000000000..a54eba82b83c5f792eb4e7a16b14a9ccd2779d75 GIT binary patch literal 1482 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 Zr|c$FipotgpQoR1j1k17T?-VJ{||<46Bz&i literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_random_album.png b/src/qprojectM/src/images/icons/hi32-action-projectm_random_album.png new file mode 100644 index 0000000000000000000000000000000000000000..df41473410cf9a35c9cc7177ebccbbcb6742ec27 GIT binary patch literal 1731 zcmbtTc~H}b5>CiP4#Jg$L?}cK0S!KhLTE(+3nD%XiWKpQ!b3#{P^iVW!b2_r@rgvJ zN0CAgpdN)H$ZaTK2;nk5E7DKlE(4B_wW1W+uhmOot@p8{YnmphgzUE zp+F#zMc9GhNK+(#Fms5>2iIO_fj|(@;X_d&rW6bYo0*wGAP^`N3WLGma5w^iFgG_x zB9SN*3XMi%Fc=F93oI6EX=!O?Wo2z`ZDV6&Yio|qIBPe2|mlWkKL+?_ceU)gM5=B#>XmXUV6zL;2r-=}sE+h7e;k!k!z-4HN3>Kk; z#jGJtsu2lV_!$6k7BElLqtEHBlJvL~Jt?_HA%nyEZ}__@JRst z&ggb00|9Bko(y2mWgy@R5LloOD%1xT>-S#=4wmS`OSF;KHlj;3$N#H7S*DJ^wSM+{ z)wzn*qz_akmCMhT3KOo)pDLOGb*$F=r@g#U)M)|RdY1$hsflzm<#mS zw9>e*ZYE@uC4EOv&7`Mi(=X-HbBZg9Z{DNdsjm9zx7r7PG(2f*?O=2<`WU^;-u}UU z=FoH2FmrI2#U33T8erJ}S z79G6eMs=+mUDt$`F{$mH+F-s>5B;^qc`JK8yCjtACJ^O*L*AW+NH*D?){*apU=ad_4^BQP$>jB6UBMr+gpM!msk zFc|-T$m9x{T>g<#ncPH)R4NurL?ZF>ifCzhMJQYn2$mKXg*={s%jLi4@)zFo=N9;H z=N6~u1U>z)`Ul1b*e?f%IqVTmHRnx{Ndtn6$nc{euo(mjgCoq5C^W_bYiVU|V~fKR z?1&`K&rhTmRMfXIUrfz$1_!)bht<##K!w++hw;93NL+ zd+`g7ORfF=!tPucKCFw-6>UQ+dz;r3Ll`LX__8&*?mO!fxEWBl%XQj5&k?&Ld;8k* zPuEj?uL9kauz}{hUoO?xL49v`(7l=l4;ANaeN>ruh0>7~+fIJ^^D$1y5v)4UPWR7p zFY6kjYR|WGxx|UbZr=9!^0hM;Bg(f`K4Ash{LbOEVfGt$ImK;ri>vBCO8nPd*W;Zx z3eP|8OwG)krWA~)`0r!!YldviPd-iTse8Z-*q_iD>#r=$mh}0L_~#U2eDD|5hp44* zs_UXtW4E^_^O_N#Pw%W0ZaiothE?9QyASzy;ERLn@!#HM#_}#zhd!!L89x3sdBXAh zb0xsi@2qwA!bI(aQKSJj;7}Pse7@&$wv=+V0LzLE@T< zp~a~?$aq@ABREyJcWfB_iiS-`W1Nr2zi}#v&t|4PZB)BkIj+aTIpEown zZ~sTgk+kAbj`$fq%YMh|q^>AAQNXxOroF8bLT(=Ww4x$3fKE9q_3r&4OJ)Ra*lw=X27SR=+G{Ho+Z@zz3y=!!=USjQTB U)qM39_QS7+g@gw;?u*a=8{@E-1^@s6 literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_random_no.png b/src/qprojectM/src/images/icons/hi32-action-projectm_random_no.png new file mode 100644 index 0000000000000000000000000000000000000000..7fb63dde676781cf533e7b2ffb350709439f4411 GIT binary patch literal 1661 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U}gyL32_B-85tRwn3$NEnORs^ zSXo)w*x1{g)YR0~ z)ipFUG&MD~w6wIfwRLoKbai$0^z`)g^^J{RZBr=B@iuHwrUBG zy<+w9m1|e5TDNlb`c-SzuUWTY^;!f1a@VcjxPHUN4I4LY-MVe(&Yinp0LTJzAz=6J z-TU|NKYsl9?c2BCy?gib=g+@?|Ni^;?>}y^W9QCo+qZAtvSrhz&2#3=ojqsHtl6_? z&6+h63}%1<&__TpZQ8Wnz6rg({XM@bIv( zuuw2SPDQI%$TtG>z}=D{zhDMNCT12^Hg*n9E^Z!PK7Ii~Az=|wF>wh=DQOv5Ie7&| zC1n*=HFXV5Eo~iLJ$;+d?7nr!u0MVM?Kj9f2mtgR*n?n^zkhywe)I79>Ah>`PH4=J z^L4g1H8M7}_Kqu^yz$7T`_JEf{{Hj#pFh8U{{d?H^ZVD&A3*R6W+L1mWFsNw{{8*s z?ZcaAPwc(?;N6GMU%vl>IRa$Jr$7%f)uPrQv-AVWU%3=j zv^hMD1jGAhdOGY;QJa)^(dd}>i?B=c^<0$|x?CMKJb)20b-n=KY?qLwO$s7k%^Y-| z7VUgpw0dDs)Y+3Ox8$8#5+LNL7Ca@Stmk-Q((|gAP~I#C?7oo4&jeXOh_5DzJ@% z)k%fpkK!wPf!SSqj%4SuhkPh@V-&zUWDd~@FBo6J=X^4Fx>&u)A7GySVgHcv7?fBX0E?`3#4 zKa1QjJ9;(GV=JpN!!xh09eTRzopr090EZy8r+H literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_random_track.png b/src/qprojectM/src/images/icons/hi32-action-projectm_random_track.png new file mode 100644 index 0000000000000000000000000000000000000000..673466eee770da05972c6ecf6d94b65d323bb7dc GIT binary patch literal 1666 zcmb`GX;hQv631T>kR@SBg2+_LB}i!Rs0`HA-@I3FJ$ zUteE8KR@%^5D*X;7)T%xh(uygP*8AiFo{G82?-&S$)Ta4VPRq6;o%etg-WGH zd>R=^qtocIQ8DrK*re#=$uaS%F$s*=#EiHkX543)amlRM6n1nFnYR_9-U2Fq6$?vGcRC zIqV!xP98UpQ@|}KKscC3zY;I|3@94PGefNIvg9ncU4+VpQ{=vS1p}xVP zfyX0{hewA;p9t3^bIa1HdGN_A+2FKX@Ivw6_w9R=+g)Rd_F-9T-&XSj@vZyoO?THD z?`+n0Y}R#xHNQX=KZ9kh@}d?+-oF&tH{`4Eu~(9$QPmD8hKzfL`I+wh2EK*q)sLb=!m>jhcTWye~)@AL&Gk0N3H7r97OHsn(WN^}&Hf~PW zZwV17Gz<_L5kiprLq zhHmA(G3A^{wJB5Yyi=>xyXxKlgVx2H8{$pzUuYg18{)O~b&*IU6s|5WuPiMszkRzn zzp(J;&HU@RxtFuArlx0}znGf*{rULBvnNl-@ziHini~-1M^b12!qUOzkn7nyhNhPPc0L-JoPNEyvMO2?E-w5r^J4Ppa9h7NjW<`000XLA>gAtM=B;0 zPs~J^>u%0gCbm|Xaj&%_RMFgcJEh4>e{wD7nZoU8FP7ih_{EgvRS?NP17^4@4S0ah znEADVt~+@*xdUx$#$^w;CAekBWxKn(`t3#IrML1EOAS_97!2=)a((R##A8Vi-nt1lt266O1g2h?PP-7H0R(bU5j8?xWjb0xy#u zTg01Xx8p>Y@8D^}ze*r90n2*maO!K^Svl=oy3gD`REoe}5;cGSG%oxCZAR z4+oV$#;8k@v@d*EFo`aYbv*A>ar23Y)1G~wx{bj0JFV2taPGZg@#?KE?)zpUv%&Pj zt=>t1v!@CgX*WFlsVP{(S$L@(f1T6)xXZmEw_B+5)&n??7+z`qDHqX6`d{(T(EhQ$ z>(M_)p8#;!dwomSaVO?|p`spr?hrJtjAtMKe%XJDnR$(Cu&$jt0GhV5376Bh;mlLo UAI(Z0)xKY}5F&-p7LZ*2CyU!e6aWAK literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_redo.png b/src/qprojectM/src/images/icons/hi32-action-projectm_redo.png new file mode 100644 index 0000000000000000000000000000000000000000..774afb81da0e59d93e9a670788450dad4cf77f31 GIT binary patch literal 1659 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 literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_remove.png b/src/qprojectM/src/images/icons/hi32-action-projectm_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..d090a4365a115135d4a6e285313fa0099e1f7bc2 GIT binary patch literal 1638 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 literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_repeat_album.png b/src/qprojectM/src/images/icons/hi32-action-projectm_repeat_album.png new file mode 100644 index 0000000000000000000000000000000000000000..1046d59f2cdc80d1f833d818aa2a5c4d1e479f73 GIT binary patch literal 1785 zcmZ|Oc{JOJ76)+r5KCKaV-CfYXUe9}fymQ|7eD1w}-E;0gH_O`6=(32E2oDd>WfNlq zTke#-C?SB`4gSa`^6&sW*5(flgVG&hu>zG-)8akB~@Ye0+RDLIMhfN=!^lN=iyj zPEJWlL8H+a3??--H7zYIJv}`mBO^02Gb<}AJ3AYT#o}-{JRYBularg9o0peIAQ1BN z^9u?Jii=Br`>m|3{ORvco+bLF8|)n*_7h11 zB=Q9^rKEnopk}e)Pe#$3_0lG0MaRbO?jG0v{{G?N;mOI#`Ptdm^Yj1p_5bGE`nS&B z-DR^c?Ck7rZ?m_z*qfU>EY{XKbMwRc$CXvq(h75dzP3RBFu$}qx5&kyEih*1S7zpx zr{|WZXv>o`bn49V*!0T#DaP>RDw)a{9AosoU+o%Uyrrx*5kEBaufOctc+yC#Xqv5T zo~dq~ZfKus?3`@vnds=Fb`DT`Nz{Hal{ict8XX@R9ixoArwoshhek+Tlwl%eh-;8c z`Q}paxp2@qDDYe$;46Q?R{(xtg5A-;eTnucTT8p$!!PIDoSktvoYUi@&xZ%>?TwY0 zk-oOtvf?~^b~+jriSTl;c%Y|!Pe(@&qH|wYPyd05shPP6?F04o^M}C$0)r62A)#U65s^{RF|l!vknstq#H8dDG$u7I zJtH$K8;ir|4x<;>XD(U5Kn`v>8#?<(p{xC>h^af z_*6lfH;1-bf*xy~2p_L*c0J7lymWk^ZpjN$B%+mY&Gg5ZxnZnre$zQSV}ZvNMiieFuHxUf1%wiy*45t@&q%+kKBzvNLYrKlK%W^2OF%d+s+Dm`{~)n{0+TU$!qau$fIS z#>+$9A##r6(yVM-`OH?SQHQ$l1saiPqv75FDWxhX_+2k-w>GR`#ThBVXR`O&M5EbP z|31=pcLpu4fGax+5nSr^xIIKX^u)0qC*)7__5b-|L-z4)?D~?}yT&X+bX;|m0$4K; z<)Q@D&qz^D@xU!=iA4n?QNAvQnhm9R@RPxfLGs(JOH$*v)_Ol@7uK;gG38+YZE^U`LG&91UW()XKAC8R$l=}WBqqH^&DCWe*<4G=H%zX165t}Orn literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_repeat_no.png b/src/qprojectM/src/images/icons/hi32-action-projectm_repeat_no.png new file mode 100644 index 0000000000000000000000000000000000000000..bc956ea8f30fa2ac81ce5c800aa892f9e7809894 GIT binary patch literal 1692 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U}gyL32_B-85tRwn3$NEnORs^ zSXo)w*x1eKTYGYgus3!8I_T5^h8^Ge!)WG4D41Q;l2r&r*&s$UgaitL86Xj$X&HHqDcSXj88z`~)p4m+Kopw-B7xk*^qQp1 z+LY|N^xTH5f~MT!mV(mOlFIh7>W+$<&dS=ZnueabrrySuzSj2s_Ra~N-4nZeC-?MC z?(3i2KVkBOiBl#{o;qpr^hr}@OrAP(%Cy;2r_Y`?WA5~s^JdJNKXdkinR6D-nzMM; z+$FQ;EuAxe>AVF?=Pz8gV9~NgOO`KQx^nTdRZEtyS+-*B@>OeBtXj8f_4?Io*RNf- zVcq(TKm=s0S-WB7>UB$(uU@ct#hm%eX3kwYefE-RvldUCxfnJ9pvARcp8G+ew-gx-v>HGH|e*XOV_wV2TqW~NNl}m+zd4Q3jB*-tA zfsu)sg_Vt+gOiJ!hnJ6EKu}0nL{v;%LQ+avMpjl%UQSL@e!Z;P&P&v)GauJ`cP*Jp2^KIXdlzYX`i z_d4lJdw#uj=Be)pSTt>55ify<=60pj)&3RBk1` za~D_?Hb2`{cJ$BFLq+wU9yMlKt;?R7!DIDoYxeZ2eQ_86yu1~-K4tg1n{tf*pKN-V zQ7(}!HS6cU>a&?K^LRKiB>RH(Ce5**eSAek*&HuH<|*ypD*5*QKdw=pci4uh-<89A z?t<7CQxtUUnzpeezSHEed8%;bmcylmsy`hMOxIcA?O?N&$54nxX;I?bE``O>OMMJZ zOwqArW;tqb$=fkOGgqREL1S+f{K)y) z@}H?dY4K~PNA`k|YT-^7N(~*qDb3P)as1A)oH}*UgN5%R!h=pPetYjxNN8HP`0}4e z^JBEcl2b#U?(cj3(D?A`RY&Uj{XPY@1z+M(UYRxPr-|my4+j@6dh)aRY=*?+sTUp6 zQe7>rIQ+ZI68ooevvw|hdDTK!#N!FKy=2wHt#6)B{t{?*{%yWWrlEb`;lFQx-faGC zxNZCSizijSHj6*aG1Cryo$n_$FWNKc%CS3EnKPX|)5`BL2`vn;G08G7*X&y6^!{LW hO~lQ6(R1(oW8S&GD$(TMng^it>gnp|vd$@?2>_JAdU*f< literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_repeat_playlist.png b/src/qprojectM/src/images/icons/hi32-action-projectm_repeat_playlist.png new file mode 100644 index 0000000000000000000000000000000000000000..554c9f52078867b26142740b735c92d34f09562c GIT binary patch literal 1491 zcmbW0cTm#@6vsmn2oSU1bCMKq) zrelq=?M)yMe0+R-eSQ7>{QUj>0|EkwL}FlIU{Fv{ zaBy%)NJwaCD2YT03kwSm508k5Ad|@y3MDc!GAb%6Iy#z4rP64$n3xzkoz7q|m`rAD zY;0UyTzq_dLPA1fVq#KKQgU)~N=iyYAFG+S=N>y1M%M`i6#v#>PfIpDz#yghF9oU*E{c$lToA>guXQB9X~tAO5f8a`~ZD zF4>pvNu;8^!`=4>z`q;xjrZ?1 z_EtB=>s#WDZOP`2WDD5e-aS}rTNqbl;1Q2Wiv=lxAy8!%n5vpOTmzx0rLCijMCqaR z4GfKpO-#+qEiA39F*aCRJ9`I5C!90h#nsK-!_&)~;N$D(A3zKY3JwV+g@s3uDUngp zR9Xz3!HkWIPe@EkPDxEm&&bTmX65AO}mCULeu@cF!dQIi;-QR zxlrOo6?eUE-f!EN>Iu&FeXt;gKD)Pu->SIH#uQ#6JUmu=>CiHR^XJo!gz1wzqRe&2 za@U?-5YJ?KfPGG0X4x(?LZYzXj(k~HA*-3OiEzqvB(J>U=WR}gdU>N*Oh=d+r`nU^a<$v z4vju_ZMp8w1I!7r8J~+r+X%#vN5Zwp1@SY(DXuP>=ZxHBHgPs4J5wgY$DtCW!;hJ_ z6M`3vkDuobM=TjP$xWb2xD??J{IR`LIkXu4VVM0p`c?Q{CtxZ2tKwNq?n`;A{_^>I zlV6js+$VA`Utqw~=pMpf!40W$2bR5Yj}Q$sLG71d_WUo~JCf}xZ02rh^#pxJ?=_6c zi`SVuO`C0->}#L6;uAWU9MSH(At0gpOA8k(A#T3TA#+S)ogI=Z^LdU|^L`uYY228M=)Mn*=)#>OTlCZ?vQW@ct4R?bFt z0lF?}YTiw2%o+cHh$-Vg2xY=h)_=yV|4djB zTutVGW(dmo&pbpBOXh#Bod0UI|I?TJKX&*3D8Lf}_~TThc-d@V9{5%gtEX>ZXk=_+YGz?& zZDp(~Eh@mn3CuT~+(3;&BBDTDk}~p&>Uu_&PVPQ|k@4w8Rdvm+?L8AFPn$7w-r_Y| zcJ4iR?DYA|H*Vj1`1r}wXD?p8egEmp*Ka?5{`&p<&!4}4{{g{|+q0~I&Z8xm;o-Cv zSP0DZba4#PIG;P2+y9UQPs98Db9n@XU2hz#(6i}vjx&;Dyx7o{qWEX^zqPmSkuUK6vlC+h^~DY0!UdaAu%B5?!rk)`i%NxJ;nV=$oa*(lUcd8wwv>nYH}TIs@@*LSp+T7j!qMHt?0F|2wXB_J9-Dic70H zdy*^N&#UBg)+jF(ob9*RKTJ7GBjWy)n%`=Rz9-Ld{#zi$ZtD|#H{?X|V)l)RivoFe zgvQP`+Hmb*2-~~L33L6w?THS!)mD;se7)m2?hoqhTWdXjAA73Wbm;UhzMoO?|L^VI sm2AWJs$j|Gg?hD;|35@(ctmE`Yy8~S|MJkzX`qDQ>FVdQ&MBb@02koRkpKVy literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_rescan.png b/src/qprojectM/src/images/icons/hi32-action-projectm_rescan.png new file mode 100644 index 0000000000000000000000000000000000000000..0c37dccbdaf0e906d5886605f5e274b1cf47e5b8 GIT binary patch literal 1776 zcmZ|Oc|6ql9|!PZ+~*kgeT~~3t{IzS-66;1%!CjrIVv~Nq@kKfSVA_W203ypiIB}I zw7Ig9LgY5a%y$MeW9v8CzkjdC^Yi{3e|;X0_v3vV>v3FENI?h$0*SgfJ9u$+wWB2f z=2VBr#32v}48pqkIC8FBTwL7T++Z-6hlhukmzR%^kDs4kKtMoHP*6xnNLW}{L_|bX zR8&k%Ok7+X0)a?KNI;=bNl8g5DJf}bX&D(ASy@>*IXQWGc?AUpMMXs=B_(BLWfc__ zRaI3rH8pj0bqx&-O-)T045p=}rLC>4qobp%tE;D{r?0PXU|?WqXb6YH5eNhliA14L zMn*=)#>OTlCZ?vQW@ct+G#Z1!96M%dX=P(=<6vXwZ0G3aaNN_$#p}4Mud|!Ks|W6c zXQ123GalYyo<0#+zsQsR7fznK=yfXED`t^d$8%5W1iV4J0Vtz$IarOO*+KQ^DRW(gDq!v*^Wkef8Ji(CEm!iTC5vlT#mOK7RiEWl`6C0ghcjc`sma z3s#{EPEiY<@m~VdXQBubDS4xW;=#M+y(N`hW!0UPq|U~cp01aJZ-&Qa=jJK9R5qLa z{rmSH|37-zMSY)T!+=%8;0<{AHX@3GjHMys83suQ@KhEe;}Dg3XmX8hhG(1OS;w+i zzYR^k(8dL8q6!#<&D|5o!}ZtH$Q z+ur?7#_ul}q<(tqUqI&@YR@R`)fjDXf;RdOFg^=ReFkRcflrIT{4%h-3ao7an_B>x z3{WTlbr+yf0f5Fqr_<;R;K&|8-={MU=nNKP?>|h&-T{Nbd8E?-DwRf|P*(s~8yLb7NR*MWiK!VH z^NWR*wT-Qvy@R9E&)8X8n4?i}eI0EWOxMiH*(*3AIzAPjbBmalUrye%`ye@X9Gk7wBu%gY}=d{h_GQVY#T zuTXJXzJ4Dj^JeUMe+cr(S|&#^mXN-T_wA6Y3RQZQY1Fr4qj&BU=08g3N~7%^PLyPS zlt4T$qTAz1?|@N$G3(kH&&%F1iDP(>Rgz9}?^!DCx6`uwMGHMOS1?Y=VBz2wLWlF= zgc}4k;u50gGEsWE2M?x)i+a`$yV3lq@v-7Xc`~h}*O8EFiC?X&Ab+1T54>U_r=G_B zXj@fKg5K4vOB@W3FI)F_)I-f~`yu#mh_qRINZy$$G#uR!wS9}?AD5OxzZ1-QMIKOd zM?!aIU7vV`7?-&{J~g0(ls1=fA_dmhwa5OM(eyN`wTgGxt+jx!i(Qr z9s5Jq%)aghlt??bZM%LiF-gb`RcdO9cHnuvrp7mK_cv0f=*&1`iJsOgcAMD|4rLCc zSlHa#QCxhD)1V4EmSp3a{4n6J4jKxtx*x#o?#iF1>8j*E8(Mb$kRX;FYV$^I%zQDf zFfMwoZ`QUUXuR4wzjS(9>wR}C83PM0wH4=SG$m$mhppe_gO7BoFUoJnN--xd&i$UG zl6|&SuH1r|0~vV`GrHFYqueh^V8%4W5OuRw#Ts1CJ+D)QlqMF4U;MFDJhNG|GC1nq)SA`7~!S)y+k2oQQV+Ww_S=*|kdt8SN)$Mn;Og{@Khc`#SLb z8iE3-&k!h$xm3@toQFS>d+e(tGsJ4+Q$B7a(5<%WuYqnxf==0oX`3GngNvhwL$h5- G*8czn?_&M{ literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_rewind.png b/src/qprojectM/src/images/icons/hi32-action-projectm_rewind.png new file mode 100644 index 0000000000000000000000000000000000000000..f6e93e6a9d0b382d363baa773aafac4647973f88 GIT binary patch literal 1680 zcmZXV2~d+)7ltFNP*5-lYcPqZD8nXe$|44c5E7I?Sj!R+WDnU0s}>QdU=;)^Sf$jI zSd=QLfY??A#3V0!hBC^bhr)PG|bgbC)x7=ggcl@0nX3e8^v4*Gv}# z0_kG|{6bVGVqh?I2?{Z zAdpC;<<6bEc3WBPvEFNKYi(n1W9MjV?`*fv)xiL+B zpO}_#Bt0=XJ?UtAN@{vqdS*r@Ig3moXH&B&bPA0@qcdrYTsk9`O;5FWQb+KjmyXK*4_F&ad-1AMU z%kygXPz`(V!q3kduJ^NUJYnB_)O@S2<<8?99sO!5RE8 zFg(p2nRz}s|L2>9;jvG{V~a1w7KeGuug3YK?^a&FUm2Se@IDBnGKC6>Q~^j7B0w$_ z$yS9Mtcheou_}}bMG}!%A_gRYM5>ZZCQ~Yv>+9=({YR3|c{WnX#ehsKmWo6YvG6m1 zNC=45{*Q1CSX%{FR{?O-#+qVHVrr2&9#*lba_RgT)hw5z#Smq{O7;l=Msrotc+kSaj@IQDH%TZVoLw zBQ-fu<*0DN;UGdNF(M{D;YdP!Y*bhXF`!+kYA zJ-;jjWQvV;t}A8Y)us8VH_v+SHr7;>m6cc4)qPi6dFl4R+gZL)BLDnqUBaIldB`eG z2z1^HGt^X9+n8TfF~8`_hd>~;T&y3Oi25U|#v|JdZBPvOHFi;I-OtDLJ?w^DkZ9V) zbWy=<{L~IRn0xn(k!8NRPj7hb+*nXIYYKU3VNbDoIfU|7eK{|nhZGgC<#;ib3FvWN z$5ZLwOUYNeOsg*TQaevUzd4fJ!=YA2IoR^TbF1Ln6sajA9Inn~?qq3K_zi>WE_w~; z$`f_ovcR3!*?UKf7qDeJo@jKr&4vCRVIzEUVS=Z|3yy%$CzQF;(%4h1M_Ja*>Ab1? z$1D8Va}Ii);+(S-PGuS7hm?f5E7+j-TTiyVC$+xjzBd%RE9wt!l|Ng7m-xPPSSWkr z@X1)A9JjE)TR-m_R89WTk^1x>( zrLcx8{#!qMNLqS~>cu~GMB+5RjZ{uj`uv`cUWS@IAo*PO^4hmcV}f7evIBl%6LQy} zMQc68r)ElD2P=4!1OB-4;^{AZJkNU?!teaG34dk1#r(**D;xg`7IVn&rVpv)f5tmM A6951J literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_save.png b/src/qprojectM/src/images/icons/hi32-action-projectm_save.png new file mode 100644 index 0000000000000000000000000000000000000000..0bb4a46f215f22876be7acb9261e2c40a2a898f2 GIT binary patch literal 990 zcmV<410np0P)$3-9Ze5w7^aX^t_BaK{HOiFwcNJh3ikUU^pJI00_{62k7?Fv-31 zXD@7KynDd_@clRca{Y@xSNWIY(8?N06VuAeE!kToO|&UC)ab-1#q4m4R{R{4kmxhn0v!#pKNk*YvV`(zPj-r zuf6>v+rLdY_rf|}185*eJ*t61q3{BuoYB}2LL|!}UDAGhb)3N{#|EKLPz|8I0&t}Q zHk1GXL#%%M%XG9K_msJv7Yau?f(D>cz*PzaBlxZd57B+>(IApgz_k?cz$hb#;Je*M zx=&r)m{38=+|IMFfU6X!O=v3xyomrTSt$+GQovD}urq=hAYcXohNh7+Z#@DxXhKf~ zz;X&K3l{cGSSt`UVSNj{F=%2DKIp>sVg?kbJ)i=k3?DOLtD7Fw5&%k>yHTKh3w*N& zC>21G3M?C4r2-t-1HOF=RDHPz>O~~W0Su0#qmqIwUJFKIjy*n2!f4Oqt{GId4o6irA$tk_Obwo|rC7o;8^<1TQzEEk-QxW@J z0}wM|uRu{Hvi(jLHZ*-n3W!6X6cW> z2{SwVmpOM2GXf_}ZQ0>8qQK13oF@T_v;uvAUWb8cHRD;)S75Hfv=~-kwzL8f4=kK; ze^GwEzleCCpgB(hM3id)+!7|N3rww$b=0=H1VE7n*f*gMw~JqQwXCHB?~x3c}$ zvo}t3GECssWEf!kFJ<~eoKk=PC*Z?GkgvB8xk3oX`g)GY9YVPDKbkAo2|^hxd;kCd M07*qoM6N<$f|g>l4*&oF literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_scripts.png b/src/qprojectM/src/images/icons/hi32-action-projectm_scripts.png new file mode 100644 index 0000000000000000000000000000000000000000..7743e728a63df3db3c5429e4af2ebcd80c5c6fe2 GIT binary patch literal 1129 zcmV-v1eW`WP)O*ust6M7N)c4lg<^11g=i7$su8IxH-aFz5SJPSMM*cMv7tz%#UduuPMVp_ym#+C z$HmJ`@;WogWDs-UGQ)kBbH4k1=g)g)eturrK}!cgu#@pg8)E>-<#J@R+5aVIwOXZ8 zsl)(k4CHb-^7%XfqVVncfUCv!o%Z*_69p| z+uH~5=XGU#I$-8G&jW?6&)4GCC8+&=Hml4$D?D_kv>$!V#`h^xU%}@uY<|udQ;!z} zK~P7ds(k&cA3hyWrd(9#!3R)ffnZASr=}P+9dDQaCl+W&njO4w0=Bp+SNg z14M!qL#os6V5NS`&8!x;fdO?MD+cL+0DzUUGVy75VsALFynG~LbYMNNnld0FsP#nN zkTRW7kV|>Kcs`lHe=Wo7Uv}}<(JF`c#LwzUxG^JD6|5(+O62Hh5qfUvmc$wx6iyuz z&U_!#<*CJOkU%0w)j=xNnFit%-z0(e>{5POP()$|8YEC%duTnO?>q^`dYo_E_iFH= zi)B__Pr{q4K&?=9hE#_$N(E` zHn#tUK7bR-k!c&iYRU2HQ)daQo^&Q){OAy26A7GGG!jIT!>>sdI7(H>v@zEK&i-5^ ztj3(*bN{V;_(6fHZNh*CXk-ydx2^&a;qcul<}a)=I@Z$`fR%Eb@_YC9^8UwTSORP_ z2|TEidLL*x3yvS_;>~w2a^vZJ^bf^7edBCVV>WCU7MCLK7|wFyqXT4e>87`bxC}M& zh{W+)Hlq9PO*3<{htp>+v2Zn+&KE90VI(z zfQ3T9$@h92oIG~iapKherU9A-SB3As`J1^P|3Ou8MThq-004D;TAA3mLfWX2Kig zh?j~%&*Xg`OS|5eu)QNhvAZ9dE!LUlpBuU>i z*x201+|tFy#>Upx*3Qn(-rnB9!NJkd(aFil+1c5}#l_Xt)y>V#-QC^8!^6|l)62`t z+uPg6$H&*#*U!(--`_tVARsU>FeoS}I5;>YBqTI6G%PGEJUl!iA|f&}GAb%6IyyQg zCMGsEHZCqMK0ZDnAt5m_F)1l2IXO8cB_%aAH7zYIJv}`mBO^02Gb<}AJ3BikCnq;I zH!m+QKR>^qprEj@u&Ai0xVX5aq@=X8w5+VGyu7@kqN1|0vZ|`8y1Kfirlz*Gwyv(O zzP`Spp`o#{v8k!4xw*NerKPpCwXLnKy}iAoqocF4v#YDCySuxmr>D2Kx390SzrTON zgb5QTPMkDp(&WjLr%ahLb?Ve<)22dCkxE4ZpiK|L)oH z`^ocPkDvc~`r_BKm%m=W{r&mN-(SD}{U2oD(X(Fc41Q19{%gD$pC}|s-7@J#I+1T3IJ2*NyySTc!dw6kv2>iUXA4JJmQ2S@;0@8$ew zU|=ltba4!^I9+==*T2bu;lM}k2{nr(Cq3m3$l)#i<@8W`_M2s4HIsfzooG%@_2$#H zJ`&0v`(OOcw%>&ttQj;`FE_LF3oB)Q%5;3SB6G!okLoOk?#4SjPb|qgx!R5Kg-qYR z!w%<}7jNmVYkj#~V8MZoEWK}<1@X7`UHE9rRdO&}Z?`w&)w;IlPftluI;(OF!QQv+ouV< z0qzxD3oR0uRSrAv(fE2ZAxO>spp(H2hD@eAlfNf0FJai>z2FpE@~73RoI6sPOeP&v yy2;$kd0_+Rv47{@*e0*%*FyYih_Zr5ejZXs;FC}z?;>y$2&t;ucLK6T}N#e=? literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_settings_engine.png b/src/qprojectM/src/images/icons/hi32-action-projectm_settings_engine.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd4c190632a347613ffcbf24c014b3434c4d320 GIT binary patch literal 1747 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 Df~8)Q literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_settings_indicator.png b/src/qprojectM/src/images/icons/hi32-action-projectm_settings_indicator.png new file mode 100644 index 0000000000000000000000000000000000000000..e3f5442feeeb810329675f3e3a6e3d03556525aa GIT binary patch literal 1706 zcmV;b237fqP){G(qm4nDL8>&C$A@yGW$_}h0?U|J^k?%#c5!2$N~#9&q4G zHhZ?4AQgX~3ZaM1%r(#c4q4PO39YTf63<^qI-Z@y6H zLfs+a+Ej`@^;*cnl?Fm8?%0#1E==m}-7n3z7)-*h?d!MJXENbJS+e)3GVc|l6l>t+ zmwEAVn?nyo2)&R^Ta$Q}*1a=lFVq;n*<$*N;GY*H4?kb$$zL?qU_j~6km^5yTY=)_ zdp;8{RcQ?5Fl`$rU*hyDSZdX^){3b3UgHYL~A%&}o01%)bZvBI~X$Z+^zj)-lLuPTHz@C7KLIt+jxD1ISodjZM6>dp;*m8D0%sJ zWlo=I(#)n|wg@|iU~~Jebmp>N0VvmoJ4PV7PV*>*F`Z}EX2t1W-h^!#$W`(x389eq z!bF8_3I6qAgXYaQ!L_o!tI>jb3+Ag3cc9XMSOmsLA#$BJ*2My&ZooUoM=_00f&)ka zBJ41rFjXk|-nWK{UR!EwmxflTXEqMkDu4lZZ@E6WkT6@~`xAXwmVuD0F%=?Ix&Y09 zB<>pAzc0m~e>H<&Zd*EHY3)q|_HKtnRG)7J5RI%|z-$TAF?r#ig zHhk?)NXK9(qXVVdgpnMapVtgsE`IV8N&#_)RNU&JeR~Q;*k)acRRxGpv2ECbqyt~x zsomdBGOA73oQ1g(Y#-1JC8F9Vb4$8_rMfO4X|7*@q-(;}Nf-*rkDu=6!#TJTTV=9l z0R2f=_8{#-G72+A812(cD6~B7Pv1<^>}kM`33U#1+Hi#d{dxTMu>rQK8dREk_i?8i zU%7;C;FJrNskf7GAYWNY#%#vwX~2#NyE)L7AQ0LEzORUy@a79yzPc^MxLVSyf;M=E zk-kK?GvZNQoErft8OWMQLC@*?+5>@DiDISv5Yqioe)yXz138`BJ91#%ZSju}7V(pD zt+#>R@oM8mBan1qW)W@~;{A()XJ1|JDZxTXlHQtb2a!^?Xo;E^sDVh#CU;vO;i{WQ z2H_jGz}ab!OBc)38WLg-7bO*)kL- z&z-4GjP1(w%-QiVm+>)|h7Xsn1T0)$#;;10gov$hBL@9@GYpSJNo5@!GS?aB&sK#D z#Yuzl>8zWuj~WIKTK2~NFYGl$s8EU%UOjx~-&7xtG_J~v-v9sr07*qoM6N<$f)E5I A8vpfsg``ML=b%VHq`mAcU}m1`-G$2_#q&2L(h^6cj2b%4l06OHn9; z7Doj{0Tq?R6c=!rO0kL?MTemX60(8GjSyL~0lAlk>0ju#KJ%RS{dzu}Q=P(yx52K* z0svr>K&P_I?YTM_lsT#Gr(Xa73P{Y8^u9 zYymo9r`O^%_Uq{7g+(C9tQqGZaj^ltms-3mw}LGMW}L$_^P#A&n(Rd`yZOr+*`+ z#ZHiE6Wd}XTc}bWn#`Lj^^TSJ#7KN767Oh<7g^#FDccw(!G}xnB#C>d#Dyev2$R`` z$!th+EJghA}vzIfk2WKbbdcEER!z=$o zkUSW{TQLj#>%J9W9}MhW6_EoW_LvY^%gD?na)!^ggt%zfBiismQJcP^Lpbl1g`?EVs6v?yw<4KYrm*JO)4f8Q!=S|{KIhnBSC9J z`O$*hy}aC_pUz$tJ$gR)>W>GVE%m2Q9WVTDXKFk-nBeQ>=HldNXNy50%q#x4xSk_y z1puU50+o_RdLtNG$+ORPwJa=vx?1AOI*Ws_mBIXX12zVlRfUofb!0TfU-_c}0HHCvIgVEZ2`OUiYk)o2JWVGvzk5FA;$P;LgJST#e!)+<6?h1(NW8{>?IYE+5C;i+{Bf4TP;U-DAjyJ5 zXdzz8jPJW#zvlIL8I42e9SN77KX8AGjE?i<@6Wgp@N%ImV{g{nWRZYuU$h@wSI)IO zI`des8?1cTaE@6?YRud%ZeVdSxU)kp5eA;2>2CMIV`_0c+jw}K=0h?tycg>D?Y}%0A+olFK9VK1^X=)o@#4WYBcMRf5Eq zfSq~X*Zm?(@l1B6*j_~E$JD$Nl`P%T)Sjww8j@R6{ogLuy-WT~&X22#1hD{hATXiq zVs!8-hbh?RCu3jL98dIZwit84CLJ{TX^*Or>Xz=Kf-I2FI++_z>iOXN`bW>%_|dSIflO9)+}KWZ*Zq;5Ql zw$J+bzK}Ulk;%q*$5wdd)^v`japLiSDn)HOCY#m~1@D0b{U@QWLuh>Kt;P;Gh=2P%W+qs6q#sCPA@sdBInt`(1B8Irko~iytP|e6f$opA{&+3 zlvvUw>ugL;NlrOLVb?@1Hdr=uJJ1-!2eH;0MCHd zH9+_}2w#ICRAOYyv2xF4%GK8qO2G8Djp4soHw z2y}!8qz)k<00w@mfXo3THt<@8JXnzHBIGm&+0Q^W(~#vPWIhg=j6ueu(C!h)Xc%KK zh}G-I>b}En>BUG%FS|crO-AwNV{%sGiguIgq&a2Myps2Vyw@VZYYFGMB;(1#c(5?u z%NQ~nosswXdB6C_oI3tz|6)T2`mBU5q5o?+eLahkCPB^L?&eID= z3?sP4;cT;r6&8DKnIl?R6>+$tRagx3#Hc{Lwk8paB@)S(|09blYx6AO+>&s1QTTa5 zI6WtroDqyo3r0T)h9?C>{VJeH}np2DjPj<8$FhR2Hr#u z-9Y^52ss(?NaVR(MIGW$yI9ovSH$|?T&r^&%g7ao`bF9lC`1CjIVA=^i@`||IKBps z2|u6aIZ$my@ymahg%?9)Q|Oyzx0ckfdWKciFiG*;v+OIm zxiy=}mQj5^&Dm(i(^`;J_yTi?zqW7&R{ZuZ1P zu}$k`m5O}*ezmsj_Zv4Iu`yUUn`kZSF{QM!uW>Dp9aIj>oo~No`oq)TGLvbgoeHU~ zslBFklaVar^6sG=wJ^$+@_A_H=5lhny}7s0-y%=f_QKtLt;^56*q$G3P$6lXq{gnRpesA;; zTc#jXsD7_&GL@ch@P@XljB37+YJO2&F1hL6?arB)p}|4}x4N^&6Rt5IG9}pjMHXvd z+r6X>)2}(Hs!sHepS4}jyx)pv?RWB3BtVUR+7AN;QT3a)6Gx7ITxfzGVy;{@eQ^G9 zR$=$&Usl?;o$FyeQOxn}>WwdJ(eCCSY$&a@8`bbuPb^Zt(Rj*q({+vW{?w4rKcXWq zR;Q~UHTp!SWs_f*I+{@9GV+37X70JLY+0<~qfPJtwA+=x{-7nYWjJT-Nk8bL#AMaR zzSBA!V3cmgnZgavr<(<5yS=C8>m=cw?=%!rjOt0jWo}G|+fO*0VVuo;8oes)RfdCu zQPwkmxtktkGEIdqidFjf{iEBf_2SPfHFX4eYNY62-2rW=*|#lrA3O-R|Lt&$v#Nu$ zJbkvRe8An}x}M^3hb2L7opNN7g13UFsYz1Er#R-Gle)N^Go&1am#-=#gM0BALC{IX zR{gzkEolc1w4F{U(I{ZX2iCAJCb$zdvw@YCwuMHQaq5=0eqej6|Mr&pQ0u)F#7SmI zQ-|Tve49T``lXxwzQdpWdtawvmhHJ*+g+j0imrLqegOvZwC6z+8*Z(Sg1ZaJx%9{5 G3I71Zw}BV{ literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_stop.png b/src/qprojectM/src/images/icons/hi32-action-projectm_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..e7b0521b8c144f4b463a27172746d6de272e634c GIT binary patch literal 1561 zcmY+^2~g5m7yxjxOhi-66vYE5TaQgm@gQ#zH4e)}ktHR(jV#OTQd^I#w1Y|=wXw_t zZ@V?E)x6ru)v3lVEv?i-EfEm#4+yyE?C!MR{N8)>-n{wd&Aj)${NNpd>mYCl2n1S( z-;N7WjmYH&UajhJ>~l{+pw*yYQmDUb`d_U2Db&=|)~s2huCBgz?OF{D4KNrCfk3pi zwRLoKpirouo}RwG{)P=33=9km4Gm#1n30i@v9U264mU9|F*P+cGcz+cH%A~4NF)-4 zLT$3J*!+v7rIn4fjjhcV`z>~kw)ReT4lY|AFcl&Yq4gUT9Zuw5yL3#@7jh zb=v0Vtm1}qcJp5m;N%wQ;z?LRbnzs*dXavH@giZomu>SVy7>^@eTW{u1TQSX+mGNE zKnmC%L?G=7+8G)g5>BSjDAY(QjX|Tw(xVa>F?*xq_QfaePuhPdHTCH4zh|B~bC$)r zR9swg<3>egRdqGHrlz*8uCBhJp|P>4xv}|HWAojH=KJ-{Ej5j;6}7G9we8o~?N`|y zrPW=<)qRCkPYWuaU#{$D-RQqi{yeYj$?1}=tiq0T*2AOc+7IMDj85yIB=-jGedZTE z=(*=LX7`B8?onsjCp7i5L)d5g&@WP%Tq2b(0El^zw;A!&kA+#D zgeQ>l<|U$qMb$Q$Ol46jl}Y~%nQBQcS1OfD{||{O?Mh~eWDx*lfLIEMC4dN6SSAsR zBq9+Y5(2^%^Yeg;U>@KL{=pLfJidg>17>-^kGW+t+=ZzhV$Kh->R=O7!p~m?qZ5LU z*Wlra@bM!7PgOc7qH2q{to z7s!Jy%kdW%1I{mE^W|Ro3XeRc+ZhEWSK*YSaLkh1XUc6e*I@7M`hNB0lQ=& znmOkb_uZK>g^u`UPnno4<K}I4_n>V6RNHbGon1Skj>+7x8H!?7U85zS( zOwG&@NR*{5+SS9?A5Yp98cvI#GooYT5|~K`4<9{#B0b~e$&B>06UUCEB=1X%V}w#D zl(2AG6g@J6N+#h61R{}0z;6!>3?ftM2?x`%S*7)D-Tgyvhu^#$92k7{?h}VA0%UT9 z>fV6q_m8Sr>4}kKyqBYenW3(x`f9aRAXRyStTI}eAds2`9_Jg18QA}N=RUYE=t40)T)tX&SurAG=8^m2N^{|w32R6=XTd_2;jCe28@*A4q-dOd?XW6H3S}eSH z>3MCG1_qO}q2S~y@^F1vQ|np}|FZF2y=qY|7u{OtsW(pz-S4%4Vy)YDJ+2wA#p(w1 z^aWQnmDEj-;imPp%ry$fnBQ1TSLv+gy7Jn{&J^9TAPqb;Vqx&FPEzuT7rLB~>ox+R zq1%y=^Zs|*a|UCg`T6LI!h8xnYf9`0|n4Efafh7Vd-$M9gC zGu?47lkHdqm(mf^3htjmNT#?b5|4Wk6r3WfYH1=x(*290HwGjmfX_SNDRZL-yhjR; hr4$r>yaE*U%Mdepw`7ME9b1+^c)b4(+$}64=WjaZ2e<$L literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_track.png b/src/qprojectM/src/images/icons/hi32-action-projectm_track.png new file mode 100644 index 0000000000000000000000000000000000000000..dff10f20aaae7c79e14a3677d484243517310226 GIT binary patch literal 1672 zcmZ|Oc|6-^7y$5yqpn1paf>)Agh(W+b<7o|NK;oM2wKOOjHFmui>8FAnyW>-(7I`h zb~;s4#;ViPKD1TqXxBrOIzoh8+pq2Z-Shdr@AE$YJ)h6>J{&S>KSb3~6$Ao70{neL zfQU1b zCMKq)reNJPLfP8d+S%Em(P(>ndj|&x z3@Y3! zKe1VqxU9(d?5HE(#U$j!C4YZ3^<)ygASHv9#w?^CEBrRIC_RhKJYJHSTl(F}vYh<# z6Q_PSdAhQosJf7IzPPN8Q+}bW^2hQjZbeOFOxG8)hNjM@wyUij-L0KH zZGf&G;L+02-Q0HVa_iN`<}2LGoq#%STXk*o*{VyNa_(skH?N4Bdy1Q#$7SSRN@QL+ zoYH^b$ZtNh2kudSxKL&Ylv!NFU+urHbqp_b49<4ln!IxJ-nG85p1zSA{bPN%?+)CV z7`glS_lMJuCTAw6{+xdH*Uao|kzh--^@UI*6pD9tq!NitCj00AV@I&H{h4r6u(c@= z05$-dn*jdC#uw`w{B{2N8h>?lePw0sO?i{lbTL zfcJ}U-z~m*$9w%|VgA+omve8M$Ak?-TeUxLR$SjK?G_YtZRNBHnT=a1wSt6mg4k+d zRMmDwx$w{#VQ}fTKWB$nyyL|dxfhA|6-r!AO9(6pwm^c(m!k8es1q`)T$x3V40&9N z%#t7(J67piDEbCEbq$lej62H1(%xdJuZ9&DOMxBe&kP}jg5<#R3W`d*lvPyK)FDs} zn5LGtj;NfVUD!0w6fl9gR-?l+dE(!u{b9@!FkVKS9cG$eJ;)fC!B)= z+RoA0%`Yf4l9rG{XJ%(-WilDxrlo$J6dN5)i%pY_cjA)|8;Hlil; z07@F9Xh*z0?KK@gj!nWPbWIINVI>>OkH2qd8077Jm2lvMh1^7Rc_HWQHd=8io7FO# z)kf`n>Z(&;k`Md)VnTm}ExV>Jkm=-s`OW;1-kEo@5p*$$%U-YVg+hAbq2jT7cV7I& zPP$GZyb=xeDxG7h#6yFo`jnnM66il|w~ba)aAQOYM6IJk2K*t;eSRWXSY&U@t0fH! zSa;}Rf)70h3>^q5A@Fi$gjDhdZ2zcpj5`Foe`xL|!LTzvrnUbd2)e^}y)iY+Sb-L% z6!?MM?s0<$j3`i7yC=7dp%H^m4Gs&>`#gFY6t8PZOj7zt(U1;Y(5#Nz-|-|aHoaKm zVf5sz9C=%7WIfoc&n$gjl{J}`;br3uvU+^F79W1D_2JUwg#V4Ml&XSV@Ts86a00>rfXT8 z+6532Q{wNrxQ-KDJTrKzf)VTeQayJJo(&%=ibO)j;CV&2>XRO5t1~C&ZO}vm_yV&Zd6w>DowW8%bTmT!Bc(?>70JS&iDm>*TWd27m%FNP4l@Im^`Jq nJiO$0-`nzbafzQ^Z=^^gdX)d{Wxiq8r%xF`B>8rG$FcqeLenIe literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_undo.png b/src/qprojectM/src/images/icons/hi32-action-projectm_undo.png new file mode 100644 index 0000000000000000000000000000000000000000..1355739f4f1bed91a67c7c4d9ccf8caa8076e033 GIT binary patch literal 1659 zcmZ{jc{J2(7{^hVD@`Oj7s)nc$zX=;BQq7onkD;au@_3DMiEAf>gsYWsg#hosVrk; z)EykT3Z;;tWNAjtn3>;i_U@>2?z#Wm&-uLH_q^x4=lSdTmSBCoH!ElkJpV=dKgh_)Y}~j}R#sL{PEKB49s+?VC@3f@Dng-9 zB_$J_ncm4z50kb$t;1i&AsT)6UkW=hvs?Hzww{9?pM^ z!*|8vdn55LLe9Lzo}Sp7HHAv2x+Tv$CoLk6F2N5iTjN#|{{YgeIhnPLoI2XMy7_{- zsluBR7iwP>)s7U^yezIADXDu^dh7M&+hb*SMt{3IQqe%Ex!+gUNV;{u<6iUAhUO=Y zEl(e`cD6q1e)P1rgZR9=cYye8sHbnZw||7xKid0z>=|XUZ*aPIV1`8bK>TZ_gFM~- zY`Tp!^N=|GpnJMmV%K^$c1|^Se|Siw{@FYKr2iw2FXHiqT%Hi%3fO>Pjm>AWcxw{b zd^U&A0R$XCk~{$9ak;#o@cDe9P$(9QzyA+E2TEpwTmcC1K@Jz>fFK(L*dRwD3uOP0 z#RAvXxXd3iB+2A5n4rXOOzd3UOfRa0L+mI~a3=8&%GYxXul` z0)$)y0tojd@l0$T@rX-6nd75+)6|)#UiI75u#9Je_pf;FSN=NSmX#`C;6rs zT;p_bM=BuED4A`N#DX1V>`Yh{Ce?5x1$dMh;2Wr~XJEA5z(8MDM^jx@vfnDoTU9hv z)zmdKwX}6~4b80VkS?Cy`+Ng}Ln9)iW8-m$lG2W6ojjFuIxjEpbneNFw3vtk{y`D3 z@rlW48QFP+>ZbN?GG+MH#Pmnn8iy|sio_xwhe7|cvb4A``(}vLT1~)b9L2@OMn@ft zj>9D+AI~{oa{2ll;@>mN3=UuNUxEl&og3+_J`?DTv^3O$%59KY@9B@$ez{zuFC`_D zjX}8wA%;_~`=GV`mGIPSxis=v#HJ{EWU0I}#ym8f?sq(S(gIUeW`t@B*rMRvDW8_s z-nA${F`k1#>))s-D8sS(zuqI?A4$Z(N+CvX;>JBzMstbAQ}xu?S!`Htd5FvFg=@BPE? z#L$6L)B0Iv*gFqG&|**bc<2UbH z*4D?m3*=}U*?XZ#YEkYMt!+Ljwl6S`7eld_O^gX>KR2SZ@BMs4th#wPwXUe4S3 zs=S6!n0aSYV#aU`&(3d5jzybU7|pP&GB>Ey*xey*Pt8d}1Wy>VNFT&QJ&XaB%7e;R zmF?0rzK>)!3jYxKUcp@hHG7_G{kZG)NSk& z4Hsq|3Q#>_g-!mu&p~p(mL0Kd(a2nlHK-~cK;OJLsP_7yx#@|wQHtGLa%4wR*j7+) zMc$mC*`p9Fe9_!svIo)HcGJ3$TRZo8d)z3KFkc?5&UVl`vm74zOKINZrSd1~rh~`G e*leGk2Vz->>SI#2>yxteWyE;-q8@t0ocjlVoLiLu literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_visualizations.png b/src/qprojectM/src/images/icons/hi32-action-projectm_visualizations.png new file mode 100644 index 0000000000000000000000000000000000000000..d41d1df57c6be7b59d6ca9302a6fb86e4f8691f5 GIT binary patch literal 578 zcmV-I0=@l-P)RX$fwWs~Zjb{cH_1)1 z2iP0zR@`Y_n*No@)|NfaLtI=pAG#D+<^P22W zODP3_@B4JS-CCN)am;$X-Vw+Y@O__tzh4W1#bQB{Bqjj>5#j%H$4LHpv2lKJncA#x zegxSwPM!M|!nIZ@mG>(s5WkzrBJM*{rZ!jLkbu^@@D*BXcLF79v%YFP9t-SD*z5J2 zn^lR`YE_&9*fIY7cxEKuUcFggV#{;Iz+%FTfUAtQJXZ|%rZ)(bF`+Hb6*CBY)r3_Q z$W1tzOeAAe*S(;%&Xp(}!TsMKM)Ljj>(Mc=ctAu-$yfz5HsK+GGDfO`Sy!>vx;6zo z&)b`DKA#Ifnx^&M`bZ0<~N&1t5wdq9~${2*Z#t3;~M=emz_o$^Y)2j*daYo6tH1BEojNEtuvM z*tZ%(l_ZG(%w{vD(9_6nqF+UVbLv%ki`2U)rgHIrV& Q=Kufz07*qoM6N<$f^fC@kpKVy literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/images/icons/hi32-action-projectm_zoom.png b/src/qprojectM/src/images/icons/hi32-action-projectm_zoom.png new file mode 100644 index 0000000000000000000000000000000000000000..02cb6028a88742f37dc0dd33226a5ea94f173cc4 GIT binary patch literal 1546 zcmV+l2KD)gP)u0w~;ym{;K z17x7cHideUlb4%w|M&dPx$ov)VrE>-C|YAcm1pWfWt^HPm!~~3R1M0fWKHZ!I?{Hi z^3Pn+yY`~u9E>goK>cD90%2v{kYT~dgmGbI_|Sknbg)KkNgs#)biA5+*V$a_!I#Cy zCX1!~O)zs^0LZ8oM!xd46i}X8vAj^3JSie7eq$VImd+^{SUiQ%mh|!38Z)!6k($#i z9^f^4O?LpK^9QO*FAW?RnD_lR!}ZA%!vf5xYbMMoMb^_c1I*|hBD}ZI(3i|qq5%~@ z(_ANfO#q}+ju3*Dtz3CapdeoWd?t}^`!F43-S;>f12bln2r;Et3K=Rs=r#b+HZtHR{}WIROk`JV1};8r1M&_fURlh3aX%<$|B z04x_5&dF05^UFyNYM7fVfPD6QXYq)jxBG~L4ZA&PDxEEl5Ks8%FwY4Lh49+fR@YU0 zAG6AI89-^b0CZg{Ehz~ptqC9f255-(SF#g^16=@a9isndk=X7eZo2_69YkpX2YEGh z<^-T=(#U~@x@@@~QfWpCeJ)xV05Tc>mpyxvPd-*spmfx?!~RPG5kN#}YIRXK;l`|>wJw1m zIRFF93$Ps z!1Wle3pg%=8CbKATpy^)B{^{J7}k3pj(xqh*#$EQ3<-dc0CxN?$I!Jr2ni4pK_WmR z;IzqDy%TQA!sp!rV4lS3wD<74@Bi(dIAMW+?BeWp1@IjoLINb>tiN7?jN{W+{0VL8 zZU?|ld7ba`t1m2TFk9Ok5C8%I_reaikfbwk1Yq56_O>6RWV#`-JlEvFxqkovVB5U% z_|R04Q3cLzSm1hB7uUEKf99jL;0x4o$93+EOJ{c?-7JcNPSl zn%id;^_n}kKmGV^Q)|VhQ*R_|ZhPyh37Gks9MU$;82IbvN8jwU*Y0JW{c=lNWNiI= zSFOKR0A>aPJ7uG&cI(2`7H_CwUa%^eicDn`Y1!ImLf8{&opAIlT z_o-=zr=Hx7@h6ST>7*-f(p7F{VoX~{tM%p&n>y05MqtKxU0E=vUs3a z0D!x1@QRkhiOQ;4+lw^-r_#WrVhNK*>81Ld%!(cd002L2&pN)hrFuuLZX=RNn~~C{txsRJT~-8D35Hzjm{OtO${}@&Et;07*qoM6N<$f?j~aPXGV_ literal 0 HcmV?d00001 diff --git a/src/qprojectM/src/src.pro b/src/qprojectM/src/src.pro new file mode 100644 index 000000000..0ce8244c4 --- /dev/null +++ b/src/qprojectM/src/src.pro @@ -0,0 +1,12 @@ +SOURCES += qgltest.cpp \ + main.cpp +HEADERS += qgltest.h \ + QProjectMFileDialog.hpp +TEMPLATE = app +CONFIG += warn_on \ + thread \ + qt +TARGET = ../bin/qgltest +RESOURCES = application.qrc +DISTFILES += ../CMakeLists.txt \ +CMakeLists.txt diff --git a/src/qprojectM/templates/cpp b/src/qprojectM/templates/cpp new file mode 100644 index 000000000..6d548dddf --- /dev/null +++ b/src/qprojectM/templates/cpp @@ -0,0 +1,19 @@ +/*************************************************************************** + * Copyright (C) 2007 by carm * + * carm@localhost * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ diff --git a/src/qprojectM/templates/h b/src/qprojectM/templates/h new file mode 100644 index 000000000..6d548dddf --- /dev/null +++ b/src/qprojectM/templates/h @@ -0,0 +1,19 @@ +/*************************************************************************** + * Copyright (C) 2007 by carm * + * carm@localhost * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/