summaryrefslogtreecommitdiffstats
path: root/application
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2015-02-09 01:51:14 +0100
committerPetr Mrázek <peterix@gmail.com>2015-04-12 20:57:18 +0200
commitdb877ba121ff87a4e029daf8555d85dfef45993a (patch)
tree7673f83c404b3883f0a4fcf6b492f0c4125c293c /application
parent4730f54df7edf4775dfddf45f77c60edd86c32d9 (diff)
downloadMultiMC-db877ba121ff87a4e029daf8555d85dfef45993a.tar
MultiMC-db877ba121ff87a4e029daf8555d85dfef45993a.tar.gz
MultiMC-db877ba121ff87a4e029daf8555d85dfef45993a.tar.lz
MultiMC-db877ba121ff87a4e029daf8555d85dfef45993a.tar.xz
MultiMC-db877ba121ff87a4e029daf8555d85dfef45993a.zip
NOISSUE move everything.
Diffstat (limited to 'application')
-rw-r--r--application/BuildConfig.cpp.in56
-rw-r--r--application/BuildConfig.h63
-rw-r--r--application/CMakeLists.txt473
-rw-r--r--application/ColumnResizer.cpp202
-rw-r--r--application/ColumnResizer.h38
-rw-r--r--application/ConsoleWindow.cpp260
-rw-r--r--application/ConsoleWindow.h65
-rw-r--r--application/GuiUtil.cpp48
-rw-r--r--application/GuiUtil.h9
-rw-r--r--application/InstancePageProvider.cpp0
-rw-r--r--application/InstancePageProvider.h52
-rw-r--r--application/InstanceProxyModel.cpp23
-rw-r--r--application/InstanceProxyModel.h13
-rw-r--r--application/MainWindow.cpp2069
-rw-r--r--application/MainWindow.h218
-rw-r--r--application/MultiMC.cpp632
-rw-r--r--application/MultiMC.h188
-rw-r--r--application/NagUtils.cpp38
-rw-r--r--application/NagUtils.h23
-rw-r--r--application/Platform.h32
-rw-r--r--application/Platform_Other.cpp27
-rw-r--r--application/Platform_X11.cpp62
-rw-r--r--application/dialogs/AboutDialog.cpp127
-rw-r--r--application/dialogs/AboutDialog.h47
-rw-r--r--application/dialogs/AboutDialog.ui544
-rw-r--r--application/dialogs/AccountSelectDialog.cpp85
-rw-r--r--application/dialogs/AccountSelectDialog.h90
-rw-r--r--application/dialogs/AccountSelectDialog.ui56
-rw-r--r--application/dialogs/CopyInstanceDialog.cpp101
-rw-r--r--application/dialogs/CopyInstanceDialog.h52
-rw-r--r--application/dialogs/CopyInstanceDialog.ui161
-rw-r--r--application/dialogs/CustomMessageBox.cpp35
-rw-r--r--application/dialogs/CustomMessageBox.h26
-rw-r--r--application/dialogs/EditAccountDialog.cpp51
-rw-r--r--application/dialogs/EditAccountDialog.h60
-rw-r--r--application/dialogs/EditAccountDialog.ui94
-rw-r--r--application/dialogs/IconPickerDialog.cpp156
-rw-r--r--application/dialogs/IconPickerDialog.h48
-rw-r--r--application/dialogs/IconPickerDialog.ui67
-rw-r--r--application/dialogs/LoginDialog.cpp110
-rw-r--r--application/dialogs/LoginDialog.h58
-rw-r--r--application/dialogs/LoginDialog.ui77
-rw-r--r--application/dialogs/ModEditDialogCommon.cpp40
-rw-r--r--application/dialogs/ModEditDialogCommon.h9
-rw-r--r--application/dialogs/NewInstanceDialog.cpp207
-rw-r--r--application/dialogs/NewInstanceDialog.h59
-rw-r--r--application/dialogs/NewInstanceDialog.ui309
-rw-r--r--application/dialogs/NotificationDialog.cpp84
-rw-r--r--application/dialogs/NotificationDialog.h44
-rw-r--r--application/dialogs/NotificationDialog.ui85
-rw-r--r--application/dialogs/ProgressDialog.cpp125
-rw-r--r--application/dialogs/ProgressDialog.h65
-rw-r--r--application/dialogs/ProgressDialog.ui66
-rw-r--r--application/dialogs/UpdateDialog.cpp186
-rw-r--r--application/dialogs/UpdateDialog.h61
-rw-r--r--application/dialogs/UpdateDialog.ui106
-rw-r--r--application/dialogs/VersionSelectDialog.cpp177
-rw-r--r--application/dialogs/VersionSelectDialog.h66
-rw-r--r--application/dialogs/VersionSelectDialog.ui110
-rw-r--r--application/groupview/GroupView.cpp1003
-rw-r--r--application/groupview/GroupView.h125
-rw-r--r--application/groupview/GroupedProxyModel.cpp42
-rw-r--r--application/groupview/GroupedProxyModel.h15
-rw-r--r--application/groupview/InstanceDelegate.cpp362
-rw-r--r--application/groupview/InstanceDelegate.h35
-rw-r--r--application/groupview/VisualGroup.cpp301
-rw-r--r--application/groupview/VisualGroup.h91
-rw-r--r--application/install_prereqs.cmake.in24
-rw-r--r--application/main.cpp43
-rwxr-xr-xapplication/package/linux/MultiMC80
-rw-r--r--application/pagedialog/PageDialog.cpp62
-rw-r--r--application/pagedialog/PageDialog.h36
-rw-r--r--application/pages/BasePage.h38
-rw-r--r--application/pages/BasePageProvider.h69
-rw-r--r--application/pages/InstanceSettingsPage.cpp216
-rw-r--r--application/pages/InstanceSettingsPage.h74
-rw-r--r--application/pages/InstanceSettingsPage.ui453
-rw-r--r--application/pages/LogPage.cpp222
-rw-r--r--application/pages/LogPage.h86
-rw-r--r--application/pages/LogPage.ui140
-rw-r--r--application/pages/ModFolderPage.cpp160
-rw-r--r--application/pages/ModFolderPage.h94
-rw-r--r--application/pages/ModFolderPage.ui124
-rw-r--r--application/pages/NotesPage.cpp21
-rw-r--r--application/pages/NotesPage.h61
-rw-r--r--application/pages/NotesPage.ui60
-rw-r--r--application/pages/OtherLogsPage.cpp150
-rw-r--r--application/pages/OtherLogsPage.h72
-rw-r--r--application/pages/OtherLogsPage.ui117
-rw-r--r--application/pages/ResourcePackPage.h19
-rw-r--r--application/pages/ScreenshotsPage.cpp362
-rw-r--r--application/pages/ScreenshotsPage.h79
-rw-r--r--application/pages/ScreenshotsPage.ui109
-rw-r--r--application/pages/TexturePackPage.h17
-rw-r--r--application/pages/VersionPage.cpp321
-rw-r--r--application/pages/VersionPage.h80
-rw-r--r--application/pages/VersionPage.ui204
-rw-r--r--application/pages/global/AccountListPage.cpp142
-rw-r--r--application/pages/global/AccountListPage.h86
-rw-r--r--application/pages/global/AccountListPage.ui115
-rw-r--r--application/pages/global/ExternalToolsPage.cpp238
-rw-r--r--application/pages/global/ExternalToolsPage.h74
-rw-r--r--application/pages/global/ExternalToolsPage.ui197
-rw-r--r--application/pages/global/JavaPage.cpp146
-rw-r--r--application/pages/global/JavaPage.h73
-rw-r--r--application/pages/global/JavaPage.ui303
-rw-r--r--application/pages/global/MinecraftPage.cpp92
-rw-r--r--application/pages/global/MinecraftPage.h70
-rw-r--r--application/pages/global/MinecraftPage.ui148
-rw-r--r--application/pages/global/MultiMCPage.cpp459
-rw-r--r--application/pages/global/MultiMCPage.h100
-rw-r--r--application/pages/global/MultiMCPage.ui532
-rw-r--r--application/pages/global/ProxyPage.cpp95
-rw-r--r--application/pages/global/ProxyPage.h66
-rw-r--r--application/pages/global/ProxyPage.ui197
-rw-r--r--application/resources/MultiMC.icnsbin0 -> 437319 bytes
-rw-r--r--application/resources/MultiMC.icobin0 -> 76126 bytes
-rw-r--r--application/resources/MultiMC.manifest27
-rw-r--r--application/resources/OSX/OSX.qrc35
-rw-r--r--application/resources/OSX/index.theme11
-rw-r--r--application/resources/OSX/scalable/about.svg20
-rw-r--r--application/resources/OSX/scalable/accounts.svg16
-rw-r--r--application/resources/OSX/scalable/bug.svg25
-rw-r--r--application/resources/OSX/scalable/centralmods.svg16
-rw-r--r--application/resources/OSX/scalable/checkupdate.svg22
-rw-r--r--application/resources/OSX/scalable/copy.svg18
-rw-r--r--application/resources/OSX/scalable/coremods.svg21
-rw-r--r--application/resources/OSX/scalable/externaltools.svg14
-rw-r--r--application/resources/OSX/scalable/instance-settings.svg25
-rw-r--r--application/resources/OSX/scalable/jarmods.svg30
-rw-r--r--application/resources/OSX/scalable/java.svg33
-rw-r--r--application/resources/OSX/scalable/loadermods.svg14
-rw-r--r--application/resources/OSX/scalable/log.svg19
-rw-r--r--application/resources/OSX/scalable/minecraft.svg12
-rw-r--r--application/resources/OSX/scalable/multimc.svg18
-rw-r--r--application/resources/OSX/scalable/new.svg19
-rw-r--r--application/resources/OSX/scalable/news.svg16
-rw-r--r--application/resources/OSX/scalable/notes.svg21
-rw-r--r--application/resources/OSX/scalable/patreon.svg15
-rw-r--r--application/resources/OSX/scalable/proxy.svg16
-rw-r--r--application/resources/OSX/scalable/quickmods.svg18
-rw-r--r--application/resources/OSX/scalable/refresh.svg16
-rw-r--r--application/resources/OSX/scalable/resourcepacks.svg17
-rw-r--r--application/resources/OSX/scalable/screenshots.svg19
-rw-r--r--application/resources/OSX/scalable/settings.svg25
-rw-r--r--application/resources/OSX/scalable/status-bad.svg11
-rw-r--r--application/resources/OSX/scalable/status-good.svg19
-rw-r--r--application/resources/OSX/scalable/status-yellow.svg16
-rw-r--r--application/resources/OSX/scalable/viewfolder.svg16
-rw-r--r--application/resources/backgrounds/backgrounds.qrc6
-rw-r--r--application/resources/backgrounds/catbgrnd2.pngbin0 -> 78285 bytes
-rw-r--r--application/resources/iOS/iOS.qrc35
-rw-r--r--application/resources/iOS/index.theme11
-rw-r--r--application/resources/iOS/scalable/about.svg16
-rw-r--r--application/resources/iOS/scalable/accounts.svg14
-rw-r--r--application/resources/iOS/scalable/bug.svg22
-rw-r--r--application/resources/iOS/scalable/centralmods.svg13
-rw-r--r--application/resources/iOS/scalable/checkupdate.svg16
-rw-r--r--application/resources/iOS/scalable/copy.svg13
-rw-r--r--application/resources/iOS/scalable/coremods.svg18
-rw-r--r--application/resources/iOS/scalable/externaltools.svg13
-rw-r--r--application/resources/iOS/scalable/instance-settings.svg19
-rw-r--r--application/resources/iOS/scalable/jarmods.svg31
-rw-r--r--application/resources/iOS/scalable/java.svg33
-rw-r--r--application/resources/iOS/scalable/loadermods.svg14
-rw-r--r--application/resources/iOS/scalable/log.svg13
-rw-r--r--application/resources/iOS/scalable/minecraft.svg8
-rw-r--r--application/resources/iOS/scalable/multimc.svg13
-rw-r--r--application/resources/iOS/scalable/new.svg13
-rw-r--r--application/resources/iOS/scalable/news.svg14
-rw-r--r--application/resources/iOS/scalable/notes.svg15
-rw-r--r--application/resources/iOS/scalable/patreon.svg12
-rw-r--r--application/resources/iOS/scalable/proxy.svg11
-rw-r--r--application/resources/iOS/scalable/quickmods.svg14
-rw-r--r--application/resources/iOS/scalable/refresh.svg13
-rw-r--r--application/resources/iOS/scalable/resourcepacks.svg15
-rw-r--r--application/resources/iOS/scalable/screenshots.svg14
-rw-r--r--application/resources/iOS/scalable/settings.svg19
-rw-r--r--application/resources/iOS/scalable/status-bad.svg10
-rw-r--r--application/resources/iOS/scalable/status-good.svg18
-rw-r--r--application/resources/iOS/scalable/status-yellow.svg56
-rw-r--r--application/resources/iOS/scalable/viewfolder.svg12
-rw-r--r--application/resources/instances/brick.pngbin0 -> 713 bytes
-rw-r--r--application/resources/instances/broken.pngbin0 -> 1139 bytes
-rw-r--r--application/resources/instances/chicken.pngbin0 -> 1181 bytes
-rw-r--r--application/resources/instances/chicken128.pngbin0 -> 6369 bytes
-rw-r--r--application/resources/instances/creeper.pngbin0 -> 1524 bytes
-rw-r--r--application/resources/instances/creeper128.pngbin0 -> 9046 bytes
-rw-r--r--application/resources/instances/derp.pngbin0 -> 5225 bytes
-rw-r--r--application/resources/instances/diamond.pngbin0 -> 708 bytes
-rw-r--r--application/resources/instances/dirt.pngbin0 -> 482 bytes
-rw-r--r--application/resources/instances/enderman.pngbin0 -> 2429 bytes
-rw-r--r--application/resources/instances/enderpearl.pngbin0 -> 2120 bytes
-rw-r--r--application/resources/instances/enderpearl128.pngbin0 -> 21425 bytes
-rw-r--r--application/resources/instances/ftb_glow.pngbin0 -> 1747 bytes
-rw-r--r--application/resources/instances/ftb_glow128.pngbin0 -> 12708 bytes
-rw-r--r--application/resources/instances/ftb_logo.pngbin0 -> 1607 bytes
-rw-r--r--application/resources/instances/ftb_logo128.pngbin0 -> 7883 bytes
-rw-r--r--application/resources/instances/gear.pngbin0 -> 2414 bytes
-rw-r--r--application/resources/instances/gear128.pngbin0 -> 18321 bytes
-rw-r--r--application/resources/instances/gold.pngbin0 -> 978 bytes
-rw-r--r--application/resources/instances/grass.pngbin0 -> 618 bytes
-rw-r--r--application/resources/instances/herobrine.pngbin0 -> 1034 bytes
-rw-r--r--application/resources/instances/herobrine128.pngbin0 -> 4937 bytes
-rw-r--r--application/resources/instances/infinity.pngbin0 -> 1714 bytes
-rw-r--r--application/resources/instances/infinity128.pngbin0 -> 9237 bytes
-rw-r--r--application/resources/instances/instances.qrc49
-rw-r--r--application/resources/instances/iron.pngbin0 -> 532 bytes
-rw-r--r--application/resources/instances/kitten.pngbin0 -> 1605 bytes
-rw-r--r--application/resources/instances/magitech.pngbin0 -> 2646 bytes
-rw-r--r--application/resources/instances/magitech128.pngbin0 -> 23097 bytes
-rw-r--r--application/resources/instances/meat.pngbin0 -> 1514 bytes
-rw-r--r--application/resources/instances/meat128.pngbin0 -> 10583 bytes
-rw-r--r--application/resources/instances/netherstar.pngbin0 -> 1942 bytes
-rw-r--r--application/resources/instances/netherstar128.pngbin0 -> 14062 bytes
-rw-r--r--application/resources/instances/planks.pngbin0 -> 461 bytes
-rw-r--r--application/resources/instances/skeleton.pngbin0 -> 696 bytes
-rw-r--r--application/resources/instances/skeleton128.pngbin0 -> 3673 bytes
-rw-r--r--application/resources/instances/squarecreeper.pngbin0 -> 1623 bytes
-rw-r--r--application/resources/instances/squarecreeper128.pngbin0 -> 9136 bytes
-rw-r--r--application/resources/instances/steve.pngbin0 -> 969 bytes
-rw-r--r--application/resources/instances/steve128.pngbin0 -> 4312 bytes
-rw-r--r--application/resources/instances/stone.pngbin0 -> 438 bytes
-rw-r--r--application/resources/instances/tnt.pngbin0 -> 378 bytes
-rw-r--r--application/resources/instances/updateavailable.pngbin0 -> 2480 bytes
-rw-r--r--application/resources/multimc.rc29
-rw-r--r--application/resources/multimc/16x16/about.pngbin0 -> 1270 bytes
-rw-r--r--application/resources/multimc/16x16/bug.pngbin0 -> 734 bytes
-rw-r--r--application/resources/multimc/16x16/cat.pngbin0 -> 736 bytes
-rw-r--r--application/resources/multimc/16x16/centralmods.pngbin0 -> 1145 bytes
-rw-r--r--application/resources/multimc/16x16/checkupdate.pngbin0 -> 1212 bytes
-rw-r--r--application/resources/multimc/16x16/copy.pngbin0 -> 957 bytes
-rw-r--r--application/resources/multimc/16x16/coremods.pngbin0 -> 702 bytes
-rw-r--r--application/resources/multimc/16x16/help.pngbin0 -> 1297 bytes
-rw-r--r--application/resources/multimc/16x16/instance-settings.pngbin0 -> 1410 bytes
-rw-r--r--application/resources/multimc/16x16/jarmods.pngbin0 -> 693 bytes
-rw-r--r--application/resources/multimc/16x16/loadermods.pngbin0 -> 731 bytes
-rw-r--r--application/resources/multimc/16x16/log.pngbin0 -> 630 bytes
-rw-r--r--application/resources/multimc/16x16/minecraft.pngbin0 -> 782 bytes
-rw-r--r--application/resources/multimc/16x16/new.pngbin0 -> 1175 bytes
-rw-r--r--application/resources/multimc/16x16/news.pngbin0 -> 727 bytes
-rw-r--r--application/resources/multimc/16x16/noaccount.pngbin0 -> 334 bytes
-rw-r--r--application/resources/multimc/16x16/patreon.pngbin0 -> 682 bytes
-rw-r--r--application/resources/multimc/16x16/refresh.pngbin0 -> 931 bytes
-rw-r--r--application/resources/multimc/16x16/resourcepacks.pngbin0 -> 1207 bytes
-rw-r--r--application/resources/multimc/16x16/screenshots.pngbin0 -> 976 bytes
-rw-r--r--application/resources/multimc/16x16/settings.pngbin0 -> 1410 bytes
-rw-r--r--application/resources/multimc/16x16/status-bad.pngbin0 -> 643 bytes
-rw-r--r--application/resources/multimc/16x16/status-good.pngbin0 -> 714 bytes
-rw-r--r--application/resources/multimc/16x16/status-yellow.pngbin0 -> 590 bytes
-rw-r--r--application/resources/multimc/16x16/viewfolder.pngbin0 -> 852 bytes
-rw-r--r--application/resources/multimc/22x22/about.pngbin0 -> 1693 bytes
-rw-r--r--application/resources/multimc/22x22/bug.pngbin0 -> 1180 bytes
-rw-r--r--application/resources/multimc/22x22/cat.pngbin0 -> 1034 bytes
-rw-r--r--application/resources/multimc/22x22/centralmods.pngbin0 -> 1561 bytes
-rw-r--r--application/resources/multimc/22x22/checkupdate.pngbin0 -> 1635 bytes
-rw-r--r--application/resources/multimc/22x22/copy.pngbin0 -> 1004 bytes
-rw-r--r--application/resources/multimc/22x22/help.pngbin0 -> 1735 bytes
-rw-r--r--application/resources/multimc/22x22/instance-settings.pngbin0 -> 1964 bytes
-rw-r--r--application/resources/multimc/22x22/new.pngbin0 -> 1440 bytes
-rw-r--r--application/resources/multimc/22x22/news.pngbin0 -> 1173 bytes
-rw-r--r--application/resources/multimc/22x22/patreon.pngbin0 -> 976 bytes
-rw-r--r--application/resources/multimc/22x22/refresh.pngbin0 -> 1283 bytes
-rw-r--r--application/resources/multimc/22x22/screenshots.pngbin0 -> 1320 bytes
-rw-r--r--application/resources/multimc/22x22/settings.pngbin0 -> 1964 bytes
-rw-r--r--application/resources/multimc/22x22/status-bad.pngbin0 -> 968 bytes
-rw-r--r--application/resources/multimc/22x22/status-good.pngbin0 -> 994 bytes
-rw-r--r--application/resources/multimc/22x22/status-yellow.pngbin0 -> 803 bytes
-rw-r--r--application/resources/multimc/22x22/viewfolder.pngbin0 -> 1006 bytes
-rw-r--r--application/resources/multimc/24x24/cat.pngbin0 -> 1252 bytes
-rw-r--r--application/resources/multimc/24x24/coremods.pngbin0 -> 1281 bytes
-rw-r--r--application/resources/multimc/24x24/jarmods.pngbin0 -> 1170 bytes
-rw-r--r--application/resources/multimc/24x24/loadermods.pngbin0 -> 1240 bytes
-rw-r--r--application/resources/multimc/24x24/log.pngbin0 -> 1117 bytes
-rw-r--r--application/resources/multimc/24x24/minecraft.pngbin0 -> 1500 bytes
-rw-r--r--application/resources/multimc/24x24/noaccount.pngbin0 -> 344 bytes
-rw-r--r--application/resources/multimc/24x24/patreon.pngbin0 -> 1034 bytes
-rw-r--r--application/resources/multimc/24x24/resourcepacks.pngbin0 -> 2000 bytes
-rw-r--r--application/resources/multimc/24x24/status-bad.pngbin0 -> 1102 bytes
-rw-r--r--application/resources/multimc/24x24/status-good.pngbin0 -> 1066 bytes
-rw-r--r--application/resources/multimc/24x24/status-yellow.pngbin0 -> 872 bytes
-rw-r--r--application/resources/multimc/256x256/minecraft.pngbin0 -> 49869 bytes
-rw-r--r--application/resources/multimc/32x32/about.pngbin0 -> 2658 bytes
-rw-r--r--application/resources/multimc/32x32/bug.pngbin0 -> 1772 bytes
-rw-r--r--application/resources/multimc/32x32/cat.pngbin0 -> 1678 bytes
-rw-r--r--application/resources/multimc/32x32/centralmods.pngbin0 -> 2119 bytes
-rw-r--r--application/resources/multimc/32x32/checkupdate.pngbin0 -> 2480 bytes
-rw-r--r--application/resources/multimc/32x32/copy.pngbin0 -> 1401 bytes
-rw-r--r--application/resources/multimc/32x32/coremods.pngbin0 -> 1758 bytes
-rw-r--r--application/resources/multimc/32x32/help.pngbin0 -> 2720 bytes
-rw-r--r--application/resources/multimc/32x32/instance-settings.pngbin0 -> 2983 bytes
-rw-r--r--application/resources/multimc/32x32/jarmods.pngbin0 -> 1566 bytes
-rw-r--r--application/resources/multimc/32x32/loadermods.pngbin0 -> 1708 bytes
-rw-r--r--application/resources/multimc/32x32/log.pngbin0 -> 1460 bytes
-rw-r--r--application/resources/multimc/32x32/minecraft.pngbin0 -> 2495 bytes
-rw-r--r--application/resources/multimc/32x32/new.pngbin0 -> 1769 bytes
-rw-r--r--application/resources/multimc/32x32/news.pngbin0 -> 1752 bytes
-rw-r--r--application/resources/multimc/32x32/noaccount.pngbin0 -> 363 bytes
-rw-r--r--application/resources/multimc/32x32/patreon.pngbin0 -> 1450 bytes
-rw-r--r--application/resources/multimc/32x32/refresh.pngbin0 -> 2182 bytes
-rw-r--r--application/resources/multimc/32x32/resourcepacks.pngbin0 -> 2818 bytes
-rw-r--r--application/resources/multimc/32x32/screenshots.pngbin0 -> 1892 bytes
-rw-r--r--application/resources/multimc/32x32/settings.pngbin0 -> 2983 bytes
-rw-r--r--application/resources/multimc/32x32/status-bad.pngbin0 -> 1422 bytes
-rw-r--r--application/resources/multimc/32x32/status-good.pngbin0 -> 1400 bytes
-rw-r--r--application/resources/multimc/32x32/status-yellow.pngbin0 -> 1158 bytes
-rw-r--r--application/resources/multimc/32x32/viewfolder.pngbin0 -> 1518 bytes
-rw-r--r--application/resources/multimc/48x48/about.pngbin0 -> 3995 bytes
-rw-r--r--application/resources/multimc/48x48/bug.pngbin0 -> 3124 bytes
-rw-r--r--application/resources/multimc/48x48/cat.pngbin0 -> 2733 bytes
-rw-r--r--application/resources/multimc/48x48/centralmods.pngbin0 -> 3201 bytes
-rw-r--r--application/resources/multimc/48x48/checkupdate.pngbin0 -> 4196 bytes
-rw-r--r--application/resources/multimc/48x48/copy.pngbin0 -> 1952 bytes
-rw-r--r--application/resources/multimc/48x48/help.pngbin0 -> 4170 bytes
-rw-r--r--application/resources/multimc/48x48/instance-settings.pngbin0 -> 4797 bytes
-rw-r--r--application/resources/multimc/48x48/log.pngbin0 -> 2825 bytes
-rw-r--r--application/resources/multimc/48x48/minecraft.pngbin0 -> 5077 bytes
-rw-r--r--application/resources/multimc/48x48/new.pngbin0 -> 2870 bytes
-rw-r--r--application/resources/multimc/48x48/news.pngbin0 -> 3333 bytes
-rw-r--r--application/resources/multimc/48x48/noaccount.pngbin0 -> 387 bytes
-rw-r--r--application/resources/multimc/48x48/patreon.pngbin0 -> 2317 bytes
-rw-r--r--application/resources/multimc/48x48/refresh.pngbin0 -> 3743 bytes
-rw-r--r--application/resources/multimc/48x48/screenshots.pngbin0 -> 3010 bytes
-rw-r--r--application/resources/multimc/48x48/settings.pngbin0 -> 4797 bytes
-rw-r--r--application/resources/multimc/48x48/status-bad.pngbin0 -> 2389 bytes
-rw-r--r--application/resources/multimc/48x48/status-good.pngbin0 -> 2248 bytes
-rw-r--r--application/resources/multimc/48x48/status-yellow.pngbin0 -> 1773 bytes
-rw-r--r--application/resources/multimc/48x48/viewfolder.pngbin0 -> 1945 bytes
-rw-r--r--application/resources/multimc/64x64/about.pngbin0 -> 5513 bytes
-rw-r--r--application/resources/multimc/64x64/bug.pngbin0 -> 4263 bytes
-rw-r--r--application/resources/multimc/64x64/cat.pngbin0 -> 4033 bytes
-rw-r--r--application/resources/multimc/64x64/centralmods.pngbin0 -> 4408 bytes
-rw-r--r--application/resources/multimc/64x64/checkupdate.pngbin0 -> 5858 bytes
-rw-r--r--application/resources/multimc/64x64/copy.pngbin0 -> 2884 bytes
-rw-r--r--application/resources/multimc/64x64/coremods.pngbin0 -> 5036 bytes
-rw-r--r--application/resources/multimc/64x64/help.pngbin0 -> 5402 bytes
-rw-r--r--application/resources/multimc/64x64/instance-settings.pngbin0 -> 7125 bytes
-rw-r--r--application/resources/multimc/64x64/jarmods.pngbin0 -> 4003 bytes
-rw-r--r--application/resources/multimc/64x64/loadermods.pngbin0 -> 4406 bytes
-rw-r--r--application/resources/multimc/64x64/log.pngbin0 -> 3686 bytes
-rw-r--r--application/resources/multimc/64x64/new.pngbin0 -> 3949 bytes
-rw-r--r--application/resources/multimc/64x64/news.pngbin0 -> 4968 bytes
-rw-r--r--application/resources/multimc/64x64/patreon.pngbin0 -> 3212 bytes
-rw-r--r--application/resources/multimc/64x64/refresh.pngbin0 -> 5745 bytes
-rw-r--r--application/resources/multimc/64x64/resourcepacks.pngbin0 -> 6805 bytes
-rw-r--r--application/resources/multimc/64x64/screenshots.pngbin0 -> 4518 bytes
-rw-r--r--application/resources/multimc/64x64/settings.pngbin0 -> 7125 bytes
-rw-r--r--application/resources/multimc/64x64/status-bad.pngbin0 -> 2827 bytes
-rw-r--r--application/resources/multimc/64x64/status-good.pngbin0 -> 2954 bytes
-rw-r--r--application/resources/multimc/64x64/status-yellow.pngbin0 -> 2358 bytes
-rw-r--r--application/resources/multimc/64x64/viewfolder.pngbin0 -> 2134 bytes
-rw-r--r--application/resources/multimc/8x8/noaccount.pngbin0 -> 284 bytes
-rw-r--r--application/resources/multimc/index.theme42
-rw-r--r--application/resources/multimc/multimc.qrc206
-rw-r--r--application/resources/multimc/scalable/bug.svg387
-rw-r--r--application/resources/multimc/scalable/centralmods.svg346
-rw-r--r--application/resources/multimc/scalable/checkupdate.svg167
-rw-r--r--application/resources/multimc/scalable/console.svg228
-rw-r--r--application/resources/multimc/scalable/console_error.svg247
-rw-r--r--application/resources/multimc/scalable/java.svg773
-rw-r--r--application/resources/multimc/scalable/multimc.svg1993
-rw-r--r--application/resources/multimc/scalable/new.svg127
-rw-r--r--application/resources/multimc/scalable/news.svg296
-rw-r--r--application/resources/multimc/scalable/proxy.svg260
-rw-r--r--application/resources/multimc/scalable/screenshot-placeholder.svg86
-rw-r--r--application/resources/multimc/scalable/screenshots.svg1231
-rw-r--r--application/resources/multimc/scalable/status-bad.svg142
-rw-r--r--application/resources/multimc/scalable/status-good.svg201
-rw-r--r--application/resources/multimc/scalable/status-yellow.svg155
-rw-r--r--application/resources/multimc/scalable/viewfolder.svg122
-rw-r--r--application/resources/pe_blue/index.theme11
-rw-r--r--application/resources/pe_blue/pe_blue.qrc35
-rw-r--r--application/resources/pe_blue/scalable/about.svg16
-rw-r--r--application/resources/pe_blue/scalable/accounts.svg46
-rw-r--r--application/resources/pe_blue/scalable/bug.svg47
-rw-r--r--application/resources/pe_blue/scalable/centralmods.svg43
-rw-r--r--application/resources/pe_blue/scalable/checkupdate.svg43
-rw-r--r--application/resources/pe_blue/scalable/copy.svg41
-rw-r--r--application/resources/pe_blue/scalable/coremods.svg41
-rw-r--r--application/resources/pe_blue/scalable/externaltools.svg41
-rw-r--r--application/resources/pe_blue/scalable/instance-settings.svg46
-rw-r--r--application/resources/pe_blue/scalable/jarmods.svg22
-rw-r--r--application/resources/pe_blue/scalable/java.svg47
-rw-r--r--application/resources/pe_blue/scalable/loadermods.svg42
-rw-r--r--application/resources/pe_blue/scalable/log.svg41
-rw-r--r--application/resources/pe_blue/scalable/minecraft.svg44
-rw-r--r--application/resources/pe_blue/scalable/multimc.svg61
-rw-r--r--application/resources/pe_blue/scalable/new.svg44
-rw-r--r--application/resources/pe_blue/scalable/news.svg13
-rw-r--r--application/resources/pe_blue/scalable/notes.svg46
-rw-r--r--application/resources/pe_blue/scalable/patreon.svg41
-rw-r--r--application/resources/pe_blue/scalable/proxy.svg45
-rw-r--r--application/resources/pe_blue/scalable/quickmods.svg43
-rw-r--r--application/resources/pe_blue/scalable/refresh.svg41
-rw-r--r--application/resources/pe_blue/scalable/resourcepacks.svg13
-rw-r--r--application/resources/pe_blue/scalable/screenshots.svg44
-rw-r--r--application/resources/pe_blue/scalable/settings.svg46
-rw-r--r--application/resources/pe_blue/scalable/status-bad.svg10
-rw-r--r--application/resources/pe_blue/scalable/status-good.svg15
-rw-r--r--application/resources/pe_blue/scalable/status-yellow.svg16
-rw-r--r--application/resources/pe_blue/scalable/viewfolder.svg42
-rw-r--r--application/resources/pe_colored/index.theme11
-rw-r--r--application/resources/pe_colored/pe_colored.qrc35
-rw-r--r--application/resources/pe_colored/scalable/about.svg19
-rw-r--r--application/resources/pe_colored/scalable/accounts.svg20
-rw-r--r--application/resources/pe_colored/scalable/bug.svg17
-rw-r--r--application/resources/pe_colored/scalable/centralmods.svg18
-rw-r--r--application/resources/pe_colored/scalable/checkupdate.svg13
-rw-r--r--application/resources/pe_colored/scalable/copy.svg16
-rw-r--r--application/resources/pe_colored/scalable/coremods.svg16
-rw-r--r--application/resources/pe_colored/scalable/externaltools.svg13
-rw-r--r--application/resources/pe_colored/scalable/instance-settings.svg18
-rw-r--r--application/resources/pe_colored/scalable/jarmods.svg22
-rw-r--r--application/resources/pe_colored/scalable/java.svg49
-rw-r--r--application/resources/pe_colored/scalable/loadermods.svg15
-rw-r--r--application/resources/pe_colored/scalable/log.svg16
-rw-r--r--application/resources/pe_colored/scalable/minecraft.svg14
-rw-r--r--application/resources/pe_colored/scalable/multimc.svg32
-rw-r--r--application/resources/pe_colored/scalable/new.svg16
-rw-r--r--application/resources/pe_colored/scalable/news.svg13
-rw-r--r--application/resources/pe_colored/scalable/notes.svg21
-rw-r--r--application/resources/pe_colored/scalable/patreon.svg12
-rw-r--r--application/resources/pe_colored/scalable/proxy.svg15
-rw-r--r--application/resources/pe_colored/scalable/quickmods.svg14
-rw-r--r--application/resources/pe_colored/scalable/refresh.svg11
-rw-r--r--application/resources/pe_colored/scalable/resourcepacks.svg15
-rw-r--r--application/resources/pe_colored/scalable/screenshots.svg16
-rw-r--r--application/resources/pe_colored/scalable/settings.svg18
-rw-r--r--application/resources/pe_colored/scalable/status-bad.svg10
-rw-r--r--application/resources/pe_colored/scalable/status-good.svg15
-rw-r--r--application/resources/pe_colored/scalable/status-yellow.svg16
-rw-r--r--application/resources/pe_colored/scalable/viewfolder.svg17
-rw-r--r--application/resources/pe_dark/index.theme11
-rw-r--r--application/resources/pe_dark/pe_dark.qrc35
-rw-r--r--application/resources/pe_dark/scalable/about.svg15
-rw-r--r--application/resources/pe_dark/scalable/accounts.svg46
-rw-r--r--application/resources/pe_dark/scalable/bug.svg47
-rw-r--r--application/resources/pe_dark/scalable/centralmods.svg40
-rw-r--r--application/resources/pe_dark/scalable/checkupdate.svg12
-rw-r--r--application/resources/pe_dark/scalable/copy.svg40
-rw-r--r--application/resources/pe_dark/scalable/coremods.svg41
-rw-r--r--application/resources/pe_dark/scalable/externaltools.svg41
-rw-r--r--application/resources/pe_dark/scalable/instance-settings.svg43
-rw-r--r--application/resources/pe_dark/scalable/jarmods.svg41
-rw-r--r--application/resources/pe_dark/scalable/java.svg48
-rw-r--r--application/resources/pe_dark/scalable/loadermods.svg42
-rw-r--r--application/resources/pe_dark/scalable/log.svg41
-rw-r--r--application/resources/pe_dark/scalable/minecraft.svg44
-rw-r--r--application/resources/pe_dark/scalable/multimc.svg61
-rw-r--r--application/resources/pe_dark/scalable/new.svg41
-rw-r--r--application/resources/pe_dark/scalable/news.svg13
-rw-r--r--application/resources/pe_dark/scalable/notes.svg46
-rw-r--r--application/resources/pe_dark/scalable/patreon.svg41
-rw-r--r--application/resources/pe_dark/scalable/proxy.svg43
-rw-r--r--application/resources/pe_dark/scalable/quickmods.svg43
-rw-r--r--application/resources/pe_dark/scalable/refresh.svg11
-rw-r--r--application/resources/pe_dark/scalable/resourcepacks.svg13
-rw-r--r--application/resources/pe_dark/scalable/screenshots.svg44
-rw-r--r--application/resources/pe_dark/scalable/settings.svg43
-rw-r--r--application/resources/pe_dark/scalable/status-bad.svg10
-rw-r--r--application/resources/pe_dark/scalable/status-good.svg12
-rw-r--r--application/resources/pe_dark/scalable/status-yellow.svg16
-rw-r--r--application/resources/pe_dark/scalable/viewfolder.svg39
-rw-r--r--application/resources/pe_light/index.theme11
-rw-r--r--application/resources/pe_light/pe_light.qrc36
-rw-r--r--application/resources/pe_light/scalable/about.svg15
-rw-r--r--application/resources/pe_light/scalable/accounts.svg46
-rw-r--r--application/resources/pe_light/scalable/bug.svg47
-rw-r--r--application/resources/pe_light/scalable/centralmods.svg41
-rw-r--r--application/resources/pe_light/scalable/checkupdate.svg13
-rw-r--r--application/resources/pe_light/scalable/copy.svg40
-rw-r--r--application/resources/pe_light/scalable/coremods.svg41
-rw-r--r--application/resources/pe_light/scalable/externaltools.svg41
-rw-r--r--application/resources/pe_light/scalable/instance-settings.svg43
-rw-r--r--application/resources/pe_light/scalable/jarmods.svg41
-rw-r--r--application/resources/pe_light/scalable/java.svg49
-rw-r--r--application/resources/pe_light/scalable/loadermods.svg42
-rw-r--r--application/resources/pe_light/scalable/log.svg41
-rw-r--r--application/resources/pe_light/scalable/minecraft.svg44
-rw-r--r--application/resources/pe_light/scalable/multimc.svg61
-rw-r--r--application/resources/pe_light/scalable/new.svg41
-rw-r--r--application/resources/pe_light/scalable/news.svg12
-rw-r--r--application/resources/pe_light/scalable/notes.svg46
-rw-r--r--application/resources/pe_light/scalable/patreon.svg40
-rw-r--r--application/resources/pe_light/scalable/proxy.svg45
-rw-r--r--application/resources/pe_light/scalable/quickmods.svg43
-rw-r--r--application/resources/pe_light/scalable/refresh.svg11
-rw-r--r--application/resources/pe_light/scalable/resourcepacks.svg13
-rw-r--r--application/resources/pe_light/scalable/screenshots.svg44
-rw-r--r--application/resources/pe_light/scalable/settings.svg43
-rw-r--r--application/resources/pe_light/scalable/status-bad.svg10
-rw-r--r--application/resources/pe_light/scalable/status-good.svg12
-rw-r--r--application/resources/pe_light/scalable/status-yellow.svg16
-rw-r--r--application/resources/pe_light/scalable/viewfolder.svg40
-rw-r--r--application/resources/sources/clucker.svg404
-rw-r--r--application/resources/sources/creeper.svg775
-rw-r--r--application/resources/sources/enderpearl.svg271
-rw-r--r--application/resources/sources/ftb-glow.svg606
-rw-r--r--application/resources/sources/ftb-logo.svg257
-rw-r--r--application/resources/sources/gear.svg434
-rw-r--r--application/resources/sources/herobrine.svg583
-rw-r--r--application/resources/sources/magitech.svg886
-rw-r--r--application/resources/sources/meat.svg371
-rw-r--r--application/resources/sources/netherstar.svg342
-rw-r--r--application/resources/sources/pskeleton.svg581
-rw-r--r--application/resources/sources/skeleton.svg610
-rw-r--r--application/resources/sources/squarecreeper.svg828
-rw-r--r--application/resources/sources/steve.svg534
-rw-r--r--application/resources/versions/LWJGL/2.9.0.json45
-rw-r--r--application/resources/versions/LWJGL/2.9.1-nightly-20130708-debug3.json45
-rw-r--r--application/resources/versions/LWJGL/2.9.1.json45
-rw-r--r--application/resources/versions/LWJGL/2.9.2-nightly-20140822.json45
-rw-r--r--application/resources/versions/minecraft.json668
-rw-r--r--application/resources/versions/versions.qrc12
-rw-r--r--application/widgets/Common.cpp27
-rw-r--r--application/widgets/Common.h6
-rw-r--r--application/widgets/IconLabel.cpp43
-rw-r--r--application/widgets/IconLabel.h26
-rw-r--r--application/widgets/LabeledToolButton.cpp86
-rw-r--r--application/widgets/LabeledToolButton.h37
-rw-r--r--application/widgets/LineSeparator.cpp37
-rw-r--r--application/widgets/LineSeparator.h18
-rw-r--r--application/widgets/MCModInfoFrame.cpp111
-rw-r--r--application/widgets/MCModInfoFrame.h46
-rw-r--r--application/widgets/MCModInfoFrame.ui68
-rw-r--r--application/widgets/ModListView.cpp62
-rw-r--r--application/widgets/ModListView.h27
-rw-r--r--application/widgets/PageContainer.cpp210
-rw-r--r--application/widgets/PageContainer.h63
-rw-r--r--application/widgets/PageContainer_p.h123
-rw-r--r--application/widgets/ServerStatus.cpp129
-rw-r--r--application/widgets/ServerStatus.h37
-rw-r--r--application/widgets/VersionListView.cpp147
-rw-r--r--application/widgets/VersionListView.h43
534 files changed, 38884 insertions, 0 deletions
diff --git a/application/BuildConfig.cpp.in b/application/BuildConfig.cpp.in
new file mode 100644
index 00000000..04cfbf05
--- /dev/null
+++ b/application/BuildConfig.cpp.in
@@ -0,0 +1,56 @@
+#include "BuildConfig.h"
+#include <QObject>
+
+Config BuildConfig;
+
+Config::Config()
+{
+ // Version information
+ VERSION_MAJOR = @MultiMC_VERSION_MAJOR@;
+ VERSION_MINOR = @MultiMC_VERSION_MINOR@;
+ VERSION_HOTFIX = @MultiMC_VERSION_HOTFIX@;
+ VERSION_BUILD = @MultiMC_VERSION_BUILD@;
+
+ VERSION_CHANNEL = "@MultiMC_VERSION_CHANNEL@";
+ BUILD_PLATFORM = "@MultiMC_BUILD_PLATFORM@";
+ CHANLIST_URL = "@MultiMC_CHANLIST_URL@";
+ NOTIFICATION_URL = "@MultiMC_NOTIFICATION_URL@";
+ FULL_VERSION_STR = "@MultiMC_VERSION_MAJOR@.@MultiMC_VERSION_MINOR@.@MultiMC_VERSION_BUILD@";
+
+ UPDATER_DRY_RUN = @MultiMC_UPDATER_DRY_RUN_value@;
+ UPDATER_FORCE_LOCAL = @MultiMC_UPDATER_FORCE_LOCAL_value@;
+
+ GIT_COMMIT = "@MultiMC_GIT_COMMIT@";
+ VERSION_STR = "@MultiMC_VERSION_STRING@";
+ NEWS_RSS_URL = "@MultiMC_NEWS_RSS_URL@";
+}
+
+QString Config::printableVersionString() const
+{
+ QString vstr = QString("%1.%2").arg(QString::number(VERSION_MAJOR), QString::number(VERSION_MINOR));
+
+ if (VERSION_HOTFIX > 0) vstr += "." + QString::number(VERSION_HOTFIX);
+
+ // If the build is a development build or release candidate, add that info to the end.
+ if(VERSION_CHANNEL == "stable")
+ {
+ return vstr;
+ }
+ else if(VERSION_CHANNEL == "develop")
+ {
+ vstr += "-dev-" + QString::number(VERSION_BUILD);
+ }
+ else if(VERSION_CHANNEL == "unstable")
+ {
+ vstr += "-nuke-" + QString::number(VERSION_BUILD);
+ }
+ else if(VERSION_CHANNEL == "custom")
+ {
+ vstr += "-local";
+ }
+ else
+ {
+ vstr += "-" + VERSION_CHANNEL + "-" + QString::number(VERSION_BUILD);
+ }
+ return vstr;
+}
diff --git a/application/BuildConfig.h b/application/BuildConfig.h
new file mode 100644
index 00000000..60aefeb4
--- /dev/null
+++ b/application/BuildConfig.h
@@ -0,0 +1,63 @@
+#pragma once
+#include <QString>
+
+/**
+ * \brief The Config class holds all the build-time information passed from the build system.
+ */
+class Config
+{
+public:
+ Config();
+ /// The major version number.
+ int VERSION_MAJOR;
+ /// The minor version number.
+ int VERSION_MINOR;
+ /// The hotfix number.
+ int VERSION_HOTFIX;
+ /// The build number.
+ int VERSION_BUILD;
+
+ /**
+ * The version channel
+ * This is used by the updater to determine what channel the current version came from.
+ */
+ QString VERSION_CHANNEL;
+
+ /// A short string identifying this build's platform. For example, "lin64" or "win32".
+ QString BUILD_PLATFORM;
+
+ /// URL for the updater's channel
+ QString CHANLIST_URL;
+
+ /// URL for notifications
+ QString NOTIFICATION_URL;
+
+ /// Used for matching notifications
+ QString FULL_VERSION_STR;
+
+ /// enabled for updater dry run
+ bool UPDATER_DRY_RUN;
+
+ /// enabled for updater dry run
+ bool UPDATER_FORCE_LOCAL;
+
+ /// The commit hash of this build
+ QString GIT_COMMIT;
+
+ /// This is printed on start to standard output
+ QString VERSION_STR;
+
+ /**
+ * This is used to fetch the news RSS feed.
+ * It defaults in CMakeLists.txt to "http://multimc.org/rss.xml"
+ */
+ QString NEWS_RSS_URL;
+
+ /**
+ * \brief Converts the Version to a string.
+ * \return The version number in string format (major.minor.revision.build).
+ */
+ QString printableVersionString() const;
+};
+
+extern Config BuildConfig;
diff --git a/application/CMakeLists.txt b/application/CMakeLists.txt
new file mode 100644
index 00000000..58a90efa
--- /dev/null
+++ b/application/CMakeLists.txt
@@ -0,0 +1,473 @@
+project(MultiMC-Application)
+
+######## Set URLs ########
+set(MultiMC_NEWS_RSS_URL "http://multimc.org/rss.xml" CACHE STRING "URL to fetch MultiMC's news RSS feed from.")
+
+######## Set version numbers ########
+set(MultiMC_VERSION_MAJOR 0)
+set(MultiMC_VERSION_MINOR 4)
+set(MultiMC_VERSION_HOTFIX 5)
+
+# Build number
+set(MultiMC_VERSION_BUILD -1 CACHE STRING "Build number. -1 for no build number.")
+
+# Version type
+set(MultiMC_VERSION_TYPE "Custom" CACHE STRING "MultiMC's version type. This should be one of 'Custom', 'Release', 'ReleaseCandidate', or 'Development', depending on what type of version this is.")
+
+# Build platform.
+set(MultiMC_BUILD_PLATFORM "" CACHE STRING "A short string identifying the platform that this build was built for. Only used by the notification system and to display in the about dialog.")
+
+# Version channel
+set(MultiMC_VERSION_CHANNEL "" CACHE STRING "The current build's channel. Included in the version string.")
+
+# Channel list URL
+set(MultiMC_CHANLIST_URL "" CACHE STRING "URL for the channel list.")
+
+# Updater enabled?
+set(MultiMC_UPDATER false CACHE BOOL "Whether or not the update system is enabled. If this is enabled, you must also set MultiMC_CHANLIST_URL and MultiMC_VERSION_CHANNEL in order for it to work properly.")
+
+# Notification URL
+set(MultiMC_NOTIFICATION_URL "" CACHE STRING "URL for checking for notifications.")
+
+set(MultiMC_RELEASE_VERSION_NAME "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}")
+if(MultiMC_VERSION_HOTFIX GREATER 0)
+ set(MultiMC_RELEASE_VERSION_NAME "${MultiMC_RELEASE_VERSION_NAME}.${MultiMC_VERSION_HOTFIX}")
+endif()
+
+# Build a version string to display in the configure logs.
+if(MultiMC_VERSION_TYPE STREQUAL "Custom")
+ message(STATUS "Version Type: Custom")
+ set(MultiMC_VERSION_STRING "${MultiMC_RELEASE_VERSION_NAME}")
+elseif(MultiMC_VERSION_TYPE STREQUAL "Release")
+ message(STATUS "Version Type: Stable Release")
+ set(MultiMC_VERSION_STRING "${MultiMC_RELEASE_VERSION_NAME}")
+elseif(MultiMC_VERSION_TYPE STREQUAL "Development")
+ message(STATUS "Version Type: Development")
+ set(MultiMC_VERSION_STRING "${MultiMC_RELEASE_VERSION_NAME}-dev${MultiMC_VERSION_BUILD}")
+else()
+ message(ERROR "Invalid build type.")
+endif()
+
+message(STATUS "MultiMC 5 Version: ${MultiMC_VERSION_STRING}")
+
+# If the update system is enabled, make sure MultiMC_CHANLIST_URL and MultiMC_VERSION_CHANNEL are set.
+if(MultiMC_UPDATER)
+ if(MultiMC_VERSION_CHANNEL STREQUAL "")
+ message(FATAL_ERROR "Update system is enabled, but MultiMC_VERSION_CHANNEL is not set.\n"
+ "Please ensure the CMake variables MultiMC_VERSION_CHANNEL, MultiMC_CHANLIST_URL, and MultiMC_VERSION_BUILD are set.")
+ endif()
+ if(MultiMC_CHANLIST_URL STREQUAL "")
+ message(FATAL_ERROR "Update system is enabled, but MultiMC_CHANLIST_URL is not set.\n"
+ "Please ensure the CMake variables MultiMC_VERSION_CHANNEL, MultiMC_CHANLIST_URL, and MultiMC_VERSION_BUILD are set.")
+ endif()
+ if(MultiMC_VERSION_BUILD LESS 0)
+ message(FATAL_ERROR "Update system is enabled, but MultiMC_VERSION_BUILD is not set.\n"
+ "Please ensure the CMake variables MultiMC_VERSION_CHANNEL, MultiMC_CHANLIST_URL, and MultiMC_VERSION_BUILD are set.")
+ endif()
+ message(STATUS "Updater is enabled. Channel list URL: ${MultiMC_CHANLIST_URL}")
+endif()
+
+#### Updater-related build config options ####
+option(MultiMC_UPDATER_DRY_RUN "Enable updater dry-run mode -- for updater development." OFF)
+option(MultiMC_UPDATER_FORCE_LOCAL "Do not download updated updater -- for updater development." OFF)
+
+if(MultiMC_UPDATER_DRY_RUN)
+ set(MultiMC_UPDATER_DRY_RUN_value "true")
+else()
+ set(MultiMC_UPDATER_DRY_RUN_value "false")
+endif()
+
+if(MultiMC_UPDATER_FORCE_LOCAL)
+ set(MultiMC_UPDATER_FORCE_LOCAL_value "true")
+else()
+ set(MultiMC_UPDATER_FORCE_LOCAL_value "false")
+endif()
+
+######## Configure header ########
+configure_file("${PROJECT_SOURCE_DIR}/BuildConfig.cpp.in" "${PROJECT_BINARY_DIR}/BuildConfig.cpp")
+
+######## Packaging/install paths setup ########
+
+if(UNIX AND APPLE)
+ set(BINARY_DEST_DIR MultiMC.app/Contents/MacOS)
+ set(PLUGIN_DEST_DIR MultiMC.app/Contents/MacOS)
+ set(QTCONF_DEST_DIR MultiMC.app/Contents/Resources)
+ set(APPS "\${CMAKE_INSTALL_PREFIX}/MultiMC.app")
+
+ set(MACOSX_BUNDLE_BUNDLE_NAME "MultiMC")
+ set(MACOSX_BUNDLE_INFO_STRING "MultiMC Minecraft launcher and management utility.")
+ set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.multimc.MultiMC5")
+ set(MACOSX_BUNDLE_BUNDLE_VERSION "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}.${MultiMC_VERSION_HOTFIX}.${MultiMC_VERSION_BUILD}")
+ set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}.${MultiMC_VERSION_HOTFIX}.${MultiMC_VERSION_BUILD}")
+ set(MACOSX_BUNDLE_LONG_VERSION_STRING "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}.${MultiMC_VERSION_HOTFIX}.${MultiMC_VERSION_BUILD}")
+ set(MACOSX_BUNDLE_ICON_FILE MultiMC.icns)
+ set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2014 MultiMC Contributors")
+elseif(UNIX)
+ set(BINARY_DEST_DIR bin)
+ set(PLUGIN_DEST_DIR plugins)
+ set(QTCONF_DEST_DIR .)
+ set(APPS "\${CMAKE_INSTALL_PREFIX}/bin/MultiMC")
+elseif(WIN32)
+ set(BINARY_DEST_DIR .)
+ set(PLUGIN_DEST_DIR .)
+ set(QTCONF_DEST_DIR .)
+ set(APPS "\${CMAKE_INSTALL_PREFIX}/MultiMC.exe")
+endif()
+
+# directories to look for dependencies
+set(DIRS ${QT_LIBS_DIR} ${QT_LIBEXECS_DIR})
+
+################################ FILES ################################
+
+######## Sources and headers ########
+SET(MULTIMC_SOURCES
+ # Application base
+ main.cpp
+ MultiMC.h
+ MultiMC.cpp
+ BuildConfig.h
+ ${PROJECT_BINARY_DIR}/BuildConfig.cpp
+
+ # GUI - general utilities
+ GuiUtil.h
+ GuiUtil.cpp
+ ColumnResizer.h
+ ColumnResizer.cpp
+ InstanceProxyModel.h
+ InstanceProxyModel.cpp
+
+ # GUI - windows
+ MainWindow.h
+ MainWindow.cpp
+ ConsoleWindow.h
+ ConsoleWindow.cpp
+
+ # page provider for instances
+ InstancePageProvider.h
+ InstancePageProvider.cpp
+
+ # Annoying nag screen logic
+ NagUtils.h
+ NagUtils.cpp
+
+
+ # GUI - page dialog pages
+ pages/BasePage.h
+ pages/VersionPage.cpp
+ pages/VersionPage.h
+ pages/TexturePackPage.h
+ pages/ResourcePackPage.h
+ pages/ModFolderPage.cpp
+ pages/ModFolderPage.h
+ pages/NotesPage.cpp
+ pages/NotesPage.h
+ pages/LogPage.cpp
+ pages/LogPage.h
+ pages/InstanceSettingsPage.cpp
+ pages/InstanceSettingsPage.h
+ pages/ScreenshotsPage.cpp
+ pages/ScreenshotsPage.h
+ pages/OtherLogsPage.cpp
+ pages/OtherLogsPage.h
+
+ # GUI - global settings pages
+ pages/global/AccountListPage.cpp
+ pages/global/AccountListPage.h
+ pages/global/ExternalToolsPage.cpp
+ pages/global/ExternalToolsPage.h
+ pages/global/JavaPage.cpp
+ pages/global/JavaPage.h
+ pages/global/MinecraftPage.cpp
+ pages/global/MinecraftPage.h
+ pages/global/MultiMCPage.cpp
+ pages/global/MultiMCPage.h
+ pages/global/ProxyPage.cpp
+ pages/global/ProxyPage.h
+
+ # GUI - dialogs
+ dialogs/AboutDialog.cpp
+ dialogs/AboutDialog.h
+ dialogs/AccountSelectDialog.cpp
+ dialogs/AccountSelectDialog.h
+ dialogs/CopyInstanceDialog.cpp
+ dialogs/CopyInstanceDialog.h
+ dialogs/CustomMessageBox.cpp
+ dialogs/CustomMessageBox.h
+ dialogs/EditAccountDialog.cpp
+ dialogs/EditAccountDialog.h
+ dialogs/IconPickerDialog.cpp
+ dialogs/IconPickerDialog.h
+ dialogs/LoginDialog.cpp
+ dialogs/LoginDialog.h
+ dialogs/ModEditDialogCommon.cpp
+ dialogs/ModEditDialogCommon.h
+ dialogs/NewInstanceDialog.cpp
+ dialogs/NewInstanceDialog.h
+ dialogs/NotificationDialog.cpp
+ dialogs/NotificationDialog.h
+ pagedialog/PageDialog.cpp
+ pagedialog/PageDialog.h
+ dialogs/ProgressDialog.cpp
+ dialogs/ProgressDialog.h
+ dialogs/UpdateDialog.cpp
+ dialogs/UpdateDialog.h
+ dialogs/VersionSelectDialog.cpp
+ dialogs/VersionSelectDialog.h
+
+
+ # GUI - widgets
+ widgets/Common.cpp
+ widgets/Common.h
+ widgets/IconLabel.cpp
+ widgets/IconLabel.h
+ widgets/LabeledToolButton.cpp
+ widgets/LabeledToolButton.h
+ widgets/LineSeparator.cpp
+ widgets/LineSeparator.h
+ widgets/MCModInfoFrame.cpp
+ widgets/MCModInfoFrame.h
+ widgets/ModListView.cpp
+ widgets/ModListView.h
+ widgets/PageContainer.cpp
+ widgets/PageContainer.h
+ widgets/PageContainer_p.h
+ widgets/ServerStatus.cpp
+ widgets/ServerStatus.h
+ widgets/VersionListView.cpp
+ widgets/VersionListView.h
+
+
+ # GUI - instance group view
+ groupview/GroupedProxyModel.cpp
+ groupview/GroupedProxyModel.h
+ groupview/GroupView.cpp
+ groupview/GroupView.h
+ groupview/InstanceDelegate.cpp
+ groupview/InstanceDelegate.h
+ groupview/VisualGroup.cpp
+ groupview/VisualGroup.h
+)
+
+######## UIs ########
+SET(MULTIMC_UIS
+ # Option pages
+ pages/VersionPage.ui
+ pages/ModFolderPage.ui
+ pages/LogPage.ui
+ pages/InstanceSettingsPage.ui
+ pages/NotesPage.ui
+ pages/ScreenshotsPage.ui
+ pages/OtherLogsPage.ui
+
+ # Global settings pages
+ pages/global/AccountListPage.ui
+ pages/global/ExternalToolsPage.ui
+ pages/global/JavaPage.ui
+ pages/global/MinecraftPage.ui
+ pages/global/MultiMCPage.ui
+ pages/global/ProxyPage.ui
+
+ # Dialogs
+ dialogs/CopyInstanceDialog.ui
+ dialogs/NewInstanceDialog.ui
+ dialogs/AboutDialog.ui
+ dialogs/VersionSelectDialog.ui
+ dialogs/ProgressDialog.ui
+ dialogs/IconPickerDialog.ui
+ dialogs/AccountSelectDialog.ui
+ dialogs/EditAccountDialog.ui
+ dialogs/LoginDialog.ui
+ dialogs/UpdateDialog.ui
+ dialogs/NotificationDialog.ui
+
+ # Widgets/other
+ widgets/MCModInfoFrame.ui
+)
+
+set(MULTIMC_QRCS
+ resources/backgrounds/backgrounds.qrc
+ resources/multimc/multimc.qrc
+ resources/pe_dark/pe_dark.qrc
+ resources/pe_light/pe_light.qrc
+ resources/pe_colored/pe_colored.qrc
+ resources/pe_blue/pe_blue.qrc
+ resources/OSX/OSX.qrc
+ resources/iOS/iOS.qrc
+ resources/instances/instances.qrc
+ resources/versions/versions.qrc
+)
+
+######## Windows resource files ########
+if(WIN32)
+ set(MULTIMC_RCS resources/multimc.rc)
+endif()
+
+####### X11 Stuff #######
+if(UNIX AND NOT APPLE)
+ find_package(Qt5X11Extras REQUIRED)
+ set(MultiMC_LINK_ADDITIONAL_LIBS ${MultiMC_LINK_ADDITIONAL_LIBS} xcb Qt5::X11Extras)
+ list(APPEND MULTIMC_SOURCES Platform_X11.cpp)
+else()
+ list(APPEND MULTIMC_SOURCES Platform_Other.cpp)
+endif()
+
+
+# Link additional libraries
+if(WIN32)
+ set(MultiMC_LINK_ADDITIONAL_LIBS ${MultiMC_LINK_ADDITIONAL_LIBS} Qt5::WinMain)
+endif(WIN32)
+
+include_directories(../logic)
+
+# Qt 5 stuff
+qt5_wrap_ui(MULTIMC_UI ${MULTIMC_UIS})
+qt5_add_resources(MULTIMC_RESOURCES ${MULTIMC_QRCS})
+
+# Add executable
+add_executable(MultiMC MACOSX_BUNDLE WIN32 ${MULTIMC_SOURCES} ${MULTIMC_UI} ${MULTIMC_RESOURCES} ${MULTIMC_RCS})
+target_link_libraries(MultiMC MultiMC_logic xz-embedded unpack200 iconfix libUtil LogicalGui
+ ${QUAZIP_LIBRARIES} Qt5::Core Qt5::Xml Qt5::Widgets Qt5::Network Qt5::Concurrent Qt5::WebKitWidgets
+ ${MultiMC_LINK_ADDITIONAL_LIBS})
+
+################################ INSTALLATION AND PACKAGING ################################
+
+######## Install ########
+
+#### Executable ####
+if(APPLE AND UNIX) ## OSX
+ install(TARGETS MultiMC
+ BUNDLE DESTINATION . COMPONENT Runtime
+ RUNTIME DESTINATION MultiMC.app/Contents/MacOS COMPONENT Runtime
+ )
+
+elseif(UNIX) ## LINUX and similar
+ install(TARGETS MultiMC
+ BUNDLE DESTINATION . COMPONENT Runtime
+ RUNTIME DESTINATION bin COMPONENT Runtime
+ )
+ install(PROGRAMS package/linux/MultiMC DESTINATION .)
+
+elseif(WIN32) ## WINDOWS
+ install(TARGETS MultiMC
+ BUNDLE DESTINATION . COMPONENT Runtime
+ LIBRARY DESTINATION . COMPONENT Runtime
+ RUNTIME DESTINATION . COMPONENT Runtime
+ )
+endif()
+
+#### Java bits ####
+install_jar(JavaCheck "${BINARY_DEST_DIR}/jars")
+install_jar(NewLaunch "${BINARY_DEST_DIR}/jars")
+
+#### Dist package logic ####
+
+if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
+ # Image formats
+ install(
+ DIRECTORY "${QT_PLUGINS_DIR}/imageformats"
+ DESTINATION ${PLUGIN_DEST_DIR}
+ COMPONENT Runtime
+ REGEX "tga|tiff|mng" EXCLUDE
+ )
+ # Icon engines
+ install(
+ DIRECTORY "${QT_PLUGINS_DIR}/iconengines"
+ DESTINATION ${PLUGIN_DEST_DIR}
+ COMPONENT Runtime
+ REGEX "fontawesome" EXCLUDE
+ )
+ # Platform plugins
+ install(
+ DIRECTORY "${QT_PLUGINS_DIR}/platforms"
+ DESTINATION ${PLUGIN_DEST_DIR}
+ COMPONENT Runtime
+ REGEX "minimal|linuxfb|offscreen" EXCLUDE
+ )
+else()
+ # Image formats
+ install(
+ DIRECTORY "${QT_PLUGINS_DIR}/imageformats"
+ DESTINATION ${PLUGIN_DEST_DIR}
+ COMPONENT Runtime
+ REGEX "tga|tiff|mng" EXCLUDE
+ REGEX "d\\." EXCLUDE
+ REGEX "_debug\\." EXCLUDE
+ )
+ # Icon engines
+ install(
+ DIRECTORY "${QT_PLUGINS_DIR}/iconengines"
+ DESTINATION ${PLUGIN_DEST_DIR}
+ COMPONENT Runtime
+ REGEX "fontawesome" EXCLUDE
+ REGEX "d\\." EXCLUDE
+ REGEX "_debug\\." EXCLUDE
+ )
+ # Platform plugins
+ install(
+ DIRECTORY "${QT_PLUGINS_DIR}/platforms"
+ DESTINATION ${PLUGIN_DEST_DIR}
+ COMPONENT Runtime
+ REGEX "minimal|linuxfb|offscreen" EXCLUDE
+ REGEX "d\\." EXCLUDE
+ REGEX "_debug\\." EXCLUDE
+ )
+ if(APPLE)
+ # Accessible plugin to make buttons look decent on osx
+ install(
+ DIRECTORY "${QT_PLUGINS_DIR}/accessible"
+ DESTINATION ${PLUGIN_DEST_DIR}
+ COMPONENT Runtime
+ REGEX "quick" EXCLUDE
+ REGEX "d\\." EXCLUDE
+ REGEX "_debug\\." EXCLUDE
+ )
+ endif()
+endif()
+
+# qtconf
+install(
+ CODE "
+file(WRITE \"\${CMAKE_INSTALL_PREFIX}/${QTCONF_DEST_DIR}/qt.conf\" \"\")
+"
+ COMPONENT Runtime
+)
+
+# ICNS file for OS X
+if(APPLE)
+ install(FILES resources/MultiMC.icns DESTINATION MultiMC.app/Contents/Resources)
+endif()
+
+configure_file(
+ "${CMAKE_CURRENT_SOURCE_DIR}/install_prereqs.cmake.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/install_prereqs.cmake"
+ @ONLY
+)
+install(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/install_prereqs.cmake" COMPONENT Runtime)
+
+
+
+######## Package ########
+
+# Package with CPack
+if(UNIX)
+ if(APPLE)
+ set(CPACK_GENERATOR "ZIP")
+ else()
+ set(CPACK_GENERATOR "TGZ")
+ endif()
+elseif(WIN32)
+ set(CPACK_GENERATOR "ZIP")
+endif()
+set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0)
+
+set(CPACK_PACKAGE_NAME "MultiMC 5")
+set(CPACK_PACKAGE_VENDOR "")
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "MultiMC - Minecraft launcher and management tool.")
+set(CPACK_PACKAGE_VERSION "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}.${MultiMC_VERSION_REV}.${MultiMC_VERSION_BUILD}")
+set(CPACK_PACKAGE_VERSION_MAJOR ${MultiMC_VERSION_MAJOR})
+set(CPACK_PACKAGE_VERSION_MINOR ${MultiMC_VERSION_MINOR})
+set(CPACK_PACKAGE_VERSION_PATCH ${MultiMC_VERSION_REV})
+
+set(CPACK_PACKAGE_FILE_NAME "MultiMC")
+
+include(CPack)
diff --git a/application/ColumnResizer.cpp b/application/ColumnResizer.cpp
new file mode 100644
index 00000000..1c5597aa
--- /dev/null
+++ b/application/ColumnResizer.cpp
@@ -0,0 +1,202 @@
+/*
+ * Copyright 2011 Aurélien Gâteau <agateau@kde.org>
+ * License: LGPL v2.1 or later (see COPYING)
+ */
+#include "ColumnResizer.h"
+
+#include <QDebug>
+#include <QEvent>
+#include <QFormLayout>
+#include <QGridLayout>
+#include <QTimer>
+#include <QWidget>
+
+class FormLayoutWidgetItem : public QWidgetItem
+{
+public:
+ FormLayoutWidgetItem(QWidget* widget, QFormLayout* formLayout, QFormLayout::ItemRole itemRole)
+ : QWidgetItem(widget)
+ , m_width(-1)
+ , m_formLayout(formLayout)
+ , m_itemRole(itemRole)
+ {}
+
+ QSize sizeHint() const
+ {
+ QSize size = QWidgetItem::sizeHint();
+ if (m_width != -1) {
+ size.setWidth(m_width);
+ }
+ return size;
+ }
+
+ QSize minimumSize() const
+ {
+ QSize size = QWidgetItem::minimumSize();
+ if (m_width != -1) {
+ size.setWidth(m_width);
+ }
+ return size;
+ }
+
+ QSize maximumSize() const
+ {
+ QSize size = QWidgetItem::maximumSize();
+ if (m_width != -1) {
+ size.setWidth(m_width);
+ }
+ return size;
+ }
+
+ void setWidth(int width)
+ {
+ if (width != m_width) {
+ m_width = width;
+ invalidate();
+ }
+ }
+
+ void setGeometry(const QRect& _rect)
+ {
+ QRect rect = _rect;
+ int width = widget()->sizeHint().width();
+ if (m_itemRole == QFormLayout::LabelRole && m_formLayout->labelAlignment() & Qt::AlignRight) {
+ rect.setLeft(rect.right() - width);
+ }
+ QWidgetItem::setGeometry(rect);
+ }
+
+ QFormLayout* formLayout() const
+ {
+ return m_formLayout;
+ }
+
+private:
+ int m_width;
+ QFormLayout* m_formLayout;
+ QFormLayout::ItemRole m_itemRole;
+};
+
+typedef QPair<QGridLayout*, int> GridColumnInfo;
+
+class ColumnResizerPrivate
+{
+public:
+ ColumnResizerPrivate(ColumnResizer* q_ptr)
+ : q(q_ptr)
+ , m_updateTimer(new QTimer(q))
+ {
+ m_updateTimer->setSingleShot(true);
+ m_updateTimer->setInterval(0);
+ QObject::connect(m_updateTimer, SIGNAL(timeout()), q, SLOT(updateWidth()));
+ }
+
+ void scheduleWidthUpdate()
+ {
+ m_updateTimer->start();
+ }
+
+ ColumnResizer* q;
+ QTimer* m_updateTimer;
+ QList<QWidget*> m_widgets;
+ QList<FormLayoutWidgetItem*> m_wrWidgetItemList;
+ QList<GridColumnInfo> m_gridColumnInfoList;
+};
+
+ColumnResizer::ColumnResizer(QObject* parent)
+: QObject(parent)
+, d(new ColumnResizerPrivate(this))
+{}
+
+ColumnResizer::~ColumnResizer()
+{
+ delete d;
+}
+
+void ColumnResizer::addWidget(QWidget* widget)
+{
+ d->m_widgets.append(widget);
+ widget->installEventFilter(this);
+ d->scheduleWidthUpdate();
+}
+
+void ColumnResizer::updateWidth()
+{
+ int width = 0;
+ Q_FOREACH(QWidget* widget, d->m_widgets) {
+ width = qMax(widget->sizeHint().width(), width);
+ }
+ Q_FOREACH(FormLayoutWidgetItem* item, d->m_wrWidgetItemList) {
+ item->setWidth(width);
+ item->formLayout()->update();
+ }
+ Q_FOREACH(GridColumnInfo info, d->m_gridColumnInfoList) {
+ info.first->setColumnMinimumWidth(info.second, width);
+ }
+}
+
+bool ColumnResizer::eventFilter(QObject*, QEvent* event)
+{
+ if (event->type() == QEvent::Resize) {
+ d->scheduleWidthUpdate();
+ }
+ return false;
+}
+
+void ColumnResizer::addWidgetsFromLayout(QLayout* layout, int column)
+{
+ Q_ASSERT(column >= 0);
+ QGridLayout* gridLayout = qobject_cast<QGridLayout*>(layout);
+ QFormLayout* formLayout = qobject_cast<QFormLayout*>(layout);
+ if (gridLayout) {
+ addWidgetsFromGridLayout(gridLayout, column);
+ } else if (formLayout) {
+ if (column > QFormLayout::SpanningRole) {
+ qCritical() << "column should not be more than" << QFormLayout::SpanningRole << "for QFormLayout";
+ return;
+ }
+ QFormLayout::ItemRole role = static_cast<QFormLayout::ItemRole>(column);
+ addWidgetsFromFormLayout(formLayout, role);
+ } else {
+ qCritical() << "Don't know how to handle layout" << layout;
+ }
+}
+
+void ColumnResizer::addWidgetsFromGridLayout(QGridLayout* layout, int column)
+{
+ for (int row = 0; row < layout->rowCount(); ++row) {
+ QLayoutItem* item = layout->itemAtPosition(row, column);
+ if (!item) {
+ continue;
+ }
+ QWidget* widget = item->widget();
+ if (!widget) {
+ continue;
+ }
+ addWidget(widget);
+ }
+ d->m_gridColumnInfoList << GridColumnInfo(layout, column);
+}
+
+void ColumnResizer::addWidgetsFromFormLayout(QFormLayout* layout, QFormLayout::ItemRole role)
+{
+ for (int row = 0; row < layout->rowCount(); ++row) {
+ QLayoutItem* item = layout->itemAt(row, role);
+ if (!item) {
+ continue;
+ }
+ QWidget* widget = item->widget();
+ if (!widget) {
+ continue;
+ }
+ layout->removeItem(item);
+ delete item;
+ FormLayoutWidgetItem* newItem = new FormLayoutWidgetItem(widget, layout, role);
+ layout->setItem(row, role, newItem);
+ addWidget(widget);
+ d->m_wrWidgetItemList << newItem;
+ }
+}
+
+#include <ColumnResizer.moc>
+// vi: ts=4 sw=4 et
diff --git a/application/ColumnResizer.h b/application/ColumnResizer.h
new file mode 100644
index 00000000..4bbac383
--- /dev/null
+++ b/application/ColumnResizer.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2011 Aurélien Gâteau <agateau@kde.org>
+ * License: LGPL v2.1 or later (see COPYING)
+ */
+#pragma once
+
+#include <QFormLayout>
+
+#include <QtCore/QObject>
+#include <QtCore/QList>
+
+class QEvent;
+class QGridLayout;
+class QLayout;
+class QWidget;
+
+class ColumnResizerPrivate;
+class ColumnResizer : public QObject
+{
+ Q_OBJECT
+public:
+ ColumnResizer(QObject* parent = 0);
+ ~ColumnResizer();
+
+ void addWidget(QWidget* widget);
+ void addWidgetsFromLayout(QLayout*, int column);
+ void addWidgetsFromGridLayout(QGridLayout*, int column);
+ void addWidgetsFromFormLayout(QFormLayout*, QFormLayout::ItemRole role);
+
+private Q_SLOTS:
+ void updateWidth();
+
+protected:
+ bool eventFilter(QObject*, QEvent* event);
+
+private:
+ ColumnResizerPrivate* const d;
+};
diff --git a/application/ConsoleWindow.cpp b/application/ConsoleWindow.cpp
new file mode 100644
index 00000000..52c68299
--- /dev/null
+++ b/application/ConsoleWindow.cpp
@@ -0,0 +1,260 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ConsoleWindow.h"
+#include "MultiMC.h"
+
+#include <QScrollBar>
+#include <QMessageBox>
+#include <QSystemTrayIcon>
+#include <QHBoxLayout>
+#include <QPushButton>
+#include <qlayoutitem.h>
+#include <QCloseEvent>
+
+#include <Platform.h>
+#include <dialogs/CustomMessageBox.h>
+#include <dialogs/ProgressDialog.h>
+#include "widgets/PageContainer.h"
+#include "pages/LogPage.h"
+#include "InstancePageProvider.h"
+
+#include "icons/IconList.h"
+
+class LogPageProvider : public BasePageProvider
+{
+public:
+ LogPageProvider(BasePageProviderPtr parent, BasePage * log_page)
+ {
+ m_parent = parent;
+ m_log_page = log_page;
+ }
+ virtual QString dialogTitle() {return "Fake";};
+ virtual QList<BasePage *> getPages()
+ {
+ auto pages = m_parent->getPages();
+ pages.prepend(m_log_page);
+ return pages;
+ }
+private:
+ BasePageProviderPtr m_parent;
+ BasePage * m_log_page;
+};
+
+ConsoleWindow::ConsoleWindow(BaseProcess *process, QWidget *parent)
+ : QMainWindow(parent), m_proc(process)
+{
+ MultiMCPlatform::fixWM_CLASS(this);
+ setAttribute(Qt::WA_DeleteOnClose);
+
+ auto instance = m_proc->instance();
+ auto icon = ENV.icons()->getIcon(instance->iconKey());
+ QString windowTitle = tr("Console window for ") + instance->name();
+
+ // Set window properties
+ {
+ setWindowIcon(icon);
+ setWindowTitle(windowTitle);
+ }
+
+ // Add page container
+ {
+ auto mainLayout = new QVBoxLayout;
+ auto provider = std::make_shared<InstancePageProvider>(m_proc->instance());
+ auto baseprovider = std::dynamic_pointer_cast<BasePageProvider>(provider);
+ auto proxy_provider = std::make_shared<LogPageProvider>(baseprovider, new LogPage(m_proc));
+ m_container = new PageContainer(proxy_provider, "console", this);
+ mainLayout->addWidget(m_container);
+ mainLayout->setSpacing(0);
+ mainLayout->setContentsMargins(0,0,0,0);
+ setLayout(mainLayout);
+ setCentralWidget(m_container);
+ }
+
+ // Add custom buttons to the page container layout.
+ {
+ auto horizontalLayout = new QHBoxLayout();
+ horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
+ horizontalLayout->setContentsMargins(6, -1, 6, -1);
+
+ auto btnHelp = new QPushButton();
+ btnHelp->setText(tr("Help"));
+ horizontalLayout->addWidget(btnHelp);
+ connect(btnHelp, SIGNAL(clicked(bool)), m_container, SLOT(help()));
+
+ auto spacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
+ horizontalLayout->addSpacerItem(spacer);
+
+ m_killButton = new QPushButton();
+ m_killButton->setText(tr("Kill Minecraft"));
+ horizontalLayout->addWidget(m_killButton);
+ connect(m_killButton, SIGNAL(clicked(bool)), SLOT(on_btnKillMinecraft_clicked()));
+
+ m_closeButton = new QPushButton();
+ m_closeButton->setText(tr("Close"));
+ horizontalLayout->addWidget(m_closeButton);
+ connect(m_closeButton, SIGNAL(clicked(bool)), SLOT(on_closeButton_clicked()));
+
+ m_container->addButtons(horizontalLayout);
+ }
+
+ // restore window state
+ {
+ auto base64State = MMC->settings()->get("ConsoleWindowState").toByteArray();
+ restoreState(QByteArray::fromBase64(base64State));
+ auto base64Geometry = MMC->settings()->get("ConsoleWindowGeometry").toByteArray();
+ restoreGeometry(QByteArray::fromBase64(base64Geometry));
+ }
+
+ // Set up tray icon
+ {
+ m_trayIcon = new QSystemTrayIcon(icon, this);
+ m_trayIcon->setToolTip(windowTitle);
+
+ connect(m_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
+ SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
+ m_trayIcon->show();
+ }
+
+ // Set up signal connections
+ connect(m_proc, SIGNAL(ended(InstancePtr, int, QProcess::ExitStatus)), this,
+ SLOT(onEnded(InstancePtr, int, QProcess::ExitStatus)));
+ connect(m_proc, SIGNAL(prelaunch_failed(InstancePtr, int, QProcess::ExitStatus)), this,
+ SLOT(onEnded(InstancePtr, int, QProcess::ExitStatus)));
+ connect(m_proc, SIGNAL(launch_failed(InstancePtr)), this,
+ SLOT(onLaunchFailed(InstancePtr)));
+
+ setMayClose(false);
+
+ if (m_proc->instance()->settings().get("ShowConsole").toBool())
+ {
+ show();
+ }
+}
+
+void ConsoleWindow::iconActivated(QSystemTrayIcon::ActivationReason reason)
+{
+ switch (reason)
+ {
+ case QSystemTrayIcon::Trigger:
+ {
+ toggleConsole();
+ }
+ default:
+ return;
+ }
+}
+
+void ConsoleWindow::on_closeButton_clicked()
+{
+ close();
+}
+
+void ConsoleWindow::setMayClose(bool mayclose)
+{
+ if(mayclose)
+ m_closeButton->setText(tr("Close"));
+ else
+ m_closeButton->setText(tr("Hide"));
+ m_mayclose = mayclose;
+}
+
+void ConsoleWindow::toggleConsole()
+{
+ if (isVisible())
+ {
+ if(!isActiveWindow())
+ {
+ activateWindow();
+ return;
+ }
+ hide();
+ }
+ else
+ {
+ show();
+ }
+}
+
+void ConsoleWindow::closeEvent(QCloseEvent *event)
+{
+ if (!m_mayclose)
+ {
+ toggleConsole();
+ event->ignore();
+ }
+ else if(m_container->requestClose(event))
+ {
+ MMC->settings()->set("ConsoleWindowState", saveState().toBase64());
+ MMC->settings()->set("ConsoleWindowGeometry", saveGeometry().toBase64());
+
+ emit isClosing();
+ m_trayIcon->hide();
+ event->accept();
+ }
+}
+
+void ConsoleWindow::on_btnKillMinecraft_clicked()
+{
+ m_killButton->setEnabled(false);
+ auto response = CustomMessageBox::selectable(
+ this, tr("Kill Minecraft?"),
+ tr("This can cause the instance to get corrupted and should only be used if Minecraft "
+ "is frozen for some reason"),
+ QMessageBox::Question, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes)->exec();
+ if (response == QMessageBox::Yes)
+ m_proc->killProcess();
+ else
+ m_killButton->setEnabled(true);
+}
+
+void ConsoleWindow::onEnded(InstancePtr instance, int code, QProcess::ExitStatus status)
+{
+ bool peacefulExit = code == 0 && status != QProcess::CrashExit;
+ m_killButton->setEnabled(false);
+ setMayClose(true);
+ if (instance->settings().get("AutoCloseConsole").toBool())
+ {
+ if (peacefulExit)
+ {
+ this->close();
+ return;
+ }
+ }
+ if (!isVisible())
+ {
+ show();
+ }
+ // Raise Window
+ if (MMC->settings()->get("RaiseConsole").toBool())
+ {
+ raise();
+ activateWindow();
+ }
+}
+
+void ConsoleWindow::onLaunchFailed(InstancePtr instance)
+{
+ m_killButton->setEnabled(false);
+
+ setMayClose(true);
+
+ if (!isVisible())
+ show();
+}
+ConsoleWindow::~ConsoleWindow()
+{
+
+}
diff --git a/application/ConsoleWindow.h b/application/ConsoleWindow.h
new file mode 100644
index 00000000..6e3849c5
--- /dev/null
+++ b/application/ConsoleWindow.h
@@ -0,0 +1,65 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QMainWindow>
+#include <QSystemTrayIcon>
+#include "BaseProcess.h"
+
+class QPushButton;
+class PageContainer;
+class ConsoleWindow : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ explicit ConsoleWindow(BaseProcess *proc, QWidget *parent = 0);
+ virtual ~ConsoleWindow();
+
+ /**
+ * @brief specify if the window is allowed to close
+ * @param mayclose
+ * used to keep it alive while MC runs
+ */
+ void setMayClose(bool mayclose);
+
+signals:
+ void isClosing();
+
+private
+slots:
+ void on_closeButton_clicked();
+ void on_btnKillMinecraft_clicked();
+
+ void onEnded(InstancePtr instance, int code, QProcess::ExitStatus status);
+ void onLaunchFailed(InstancePtr instance);
+
+ // FIXME: add handlers for the other MinecraftProcess signals (pre/post launch command
+ // failures)
+
+ void iconActivated(QSystemTrayIcon::ActivationReason);
+ void toggleConsole();
+protected:
+ void closeEvent(QCloseEvent *);
+
+private:
+ BaseProcess *m_proc = nullptr;
+ bool m_mayclose = true;
+ QSystemTrayIcon *m_trayIcon = nullptr;
+ PageContainer *m_container = nullptr;
+ QPushButton *m_closeButton = nullptr;
+ QPushButton *m_killButton = nullptr;
+};
diff --git a/application/GuiUtil.cpp b/application/GuiUtil.cpp
new file mode 100644
index 00000000..fb42b9bc
--- /dev/null
+++ b/application/GuiUtil.cpp
@@ -0,0 +1,48 @@
+#include "GuiUtil.h"
+
+#include <QClipboard>
+#include <QDesktopServices>
+#include <QApplication>
+
+#include "dialogs/ProgressDialog.h"
+#include "net/PasteUpload.h"
+#include "dialogs/CustomMessageBox.h"
+
+void GuiUtil::uploadPaste(const QString &text, QWidget *parentWidget)
+{
+ ProgressDialog dialog(parentWidget);
+ std::unique_ptr<PasteUpload> paste(new PasteUpload(parentWidget, text));
+
+ if (!paste->validateText())
+ {
+ CustomMessageBox::selectable(
+ parentWidget, QObject::tr("Upload failed"),
+ QObject::tr("The log file is too big. You'll have to upload it manually."),
+ QMessageBox::Warning)->exec();
+ return;
+ }
+
+ dialog.exec(paste.get());
+ if (!paste->successful())
+ {
+ CustomMessageBox::selectable(parentWidget, QObject::tr("Upload failed"),
+ paste->failReason(), QMessageBox::Critical)->exec();
+ }
+ else
+ {
+ const QString link = paste->pasteLink();
+ setClipboardText(link);
+ QDesktopServices::openUrl(link);
+ CustomMessageBox::selectable(
+ parentWidget, QObject::tr("Upload finished"),
+ QObject::tr("The <a href=\"%1\">link to the uploaded log</a> has been opened in "
+ "the default "
+ "browser and placed in your clipboard.").arg(link),
+ QMessageBox::Information)->exec();
+ }
+}
+
+void GuiUtil::setClipboardText(const QString &text)
+{
+ QApplication::clipboard()->setText(text);
+}
diff --git a/application/GuiUtil.h b/application/GuiUtil.h
new file mode 100644
index 00000000..9f872f75
--- /dev/null
+++ b/application/GuiUtil.h
@@ -0,0 +1,9 @@
+#pragma once
+
+#include <QWidget>
+
+namespace GuiUtil
+{
+void uploadPaste(const QString &text, QWidget *parentWidget);
+void setClipboardText(const QString &text);
+}
diff --git a/application/InstancePageProvider.cpp b/application/InstancePageProvider.cpp
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/application/InstancePageProvider.cpp
diff --git a/application/InstancePageProvider.h b/application/InstancePageProvider.h
new file mode 100644
index 00000000..a19e21c8
--- /dev/null
+++ b/application/InstancePageProvider.h
@@ -0,0 +1,52 @@
+#pragma once
+#include "minecraft/OneSixInstance.h"
+#include "pages/BasePage.h"
+#include "pages/VersionPage.h"
+#include "pages/ModFolderPage.h"
+#include "pages/ResourcePackPage.h"
+#include "pages/TexturePackPage.h"
+#include "pages/NotesPage.h"
+#include "pages/ScreenshotsPage.h"
+#include "pages/InstanceSettingsPage.h"
+#include "pages/OtherLogsPage.h"
+#include "pages/BasePageProvider.h"
+#include <pathutils.h>
+
+class InstancePageProvider : public QObject, public BasePageProvider
+{
+ Q_OBJECT
+public:
+ explicit InstancePageProvider(InstancePtr parent)
+ {
+ inst = parent;
+ }
+
+ virtual ~InstancePageProvider() {};
+ virtual QList<BasePage *> getPages() override
+ {
+ QList<BasePage *> values;
+ std::shared_ptr<OneSixInstance> onesix = std::dynamic_pointer_cast<OneSixInstance>(inst);
+ if(onesix)
+ {
+ values.append(new VersionPage(onesix.get()));
+ values.append(new ModFolderPage(onesix.get(), onesix->loaderModList(), "mods", "loadermods",
+ tr("Loader mods"), "Loader-mods"));
+ values.append(new CoreModFolderPage(onesix.get(), onesix->coreModList(), "coremods", "coremods",
+ tr("Core mods"), "Core-mods"));
+ values.append(new ResourcePackPage(onesix.get()));
+ values.append(new TexturePackPage(onesix.get()));
+ values.append(new NotesPage(onesix.get()));
+ values.append(new ScreenshotsPage(PathCombine(onesix->minecraftRoot(), "screenshots")));
+ values.append(new InstanceSettingsPage(onesix.get()));
+ values.append(new OtherLogsPage(onesix->minecraftRoot()));
+ }
+ return values;
+ }
+
+ virtual QString dialogTitle() override
+ {
+ return tr("Edit Instance (%1)").arg(inst->name());
+ }
+protected:
+ InstancePtr inst;
+};
diff --git a/application/InstanceProxyModel.cpp b/application/InstanceProxyModel.cpp
new file mode 100644
index 00000000..2048252c
--- /dev/null
+++ b/application/InstanceProxyModel.cpp
@@ -0,0 +1,23 @@
+#include "InstanceProxyModel.h"
+#include "MultiMC.h"
+#include <BaseInstance.h>
+
+InstanceProxyModel::InstanceProxyModel(QObject *parent) : GroupedProxyModel(parent)
+{
+}
+
+bool InstanceProxyModel::subSortLessThan(const QModelIndex &left,
+ const QModelIndex &right) const
+{
+ BaseInstance *pdataLeft = static_cast<BaseInstance *>(left.internalPointer());
+ BaseInstance *pdataRight = static_cast<BaseInstance *>(right.internalPointer());
+ QString sortMode = MMC->settings()->get("InstSortMode").toString();
+ if (sortMode == "LastLaunch")
+ {
+ return pdataLeft->lastLaunch() > pdataRight->lastLaunch();
+ }
+ else
+ {
+ return QString::localeAwareCompare(pdataLeft->name(), pdataRight->name()) < 0;
+ }
+}
diff --git a/application/InstanceProxyModel.h b/application/InstanceProxyModel.h
new file mode 100644
index 00000000..e558efc4
--- /dev/null
+++ b/application/InstanceProxyModel.h
@@ -0,0 +1,13 @@
+#include "groupview/GroupedProxyModel.h"
+
+/**
+ * A proxy model that is responsible for sorting instances into groups
+ */
+class InstanceProxyModel : public GroupedProxyModel
+{
+public:
+ explicit InstanceProxyModel(QObject *parent = 0);
+
+protected:
+ virtual bool subSortLessThan(const QModelIndex &left, const QModelIndex &right) const;
+};
diff --git a/application/MainWindow.cpp b/application/MainWindow.cpp
new file mode 100644
index 00000000..8e235e19
--- /dev/null
+++ b/application/MainWindow.cpp
@@ -0,0 +1,2069 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Authors: Andrew Okin
+ * Peterix
+ * Orochimarufan <orochimarufan.x3@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "MultiMC.h"
+#include "BuildConfig.h"
+
+#include "MainWindow.h"
+
+
+#include <QtCore/QVariant>
+#include <QtWidgets/QAction>
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QButtonGroup>
+#include <QtWidgets/QHBoxLayout>
+#include <QtWidgets/QHeaderView>
+#include <QtWidgets/QMainWindow>
+#include <QtWidgets/QStatusBar>
+#include <QtWidgets/QToolBar>
+#include <QtWidgets/QWidget>
+
+class Ui_MainWindow
+{
+public:
+ QAction *actionAddInstance;
+ QAction *actionViewInstanceFolder;
+ QAction *actionRefresh;
+ QAction *actionViewCentralModsFolder;
+ QAction *actionCheckUpdate;
+ QAction *actionSettings;
+ QAction *actionReportBug;
+ QAction *actionPatreon;
+ QAction *actionMoreNews;
+ QAction *actionAbout;
+ QAction *actionLaunchInstance;
+ QAction *actionRenameInstance;
+ QAction *actionChangeInstGroup;
+ QAction *actionChangeInstIcon;
+ QAction *actionEditInstNotes;
+ QAction *actionEditInstance;
+ QAction *actionViewSelectedInstFolder;
+ QAction *actionDeleteInstance;
+ QAction *actionConfig_Folder;
+ QAction *actionCAT;
+ QAction *actionCopyInstance;
+ QAction *actionManageAccounts;
+ QAction *actionLaunchInstanceOffline;
+ QAction *actionScreenshots;
+ QAction *actionInstanceSettings;
+ QAction *actionExportInstance;
+ QWidget *centralWidget;
+ QHBoxLayout *horizontalLayout;
+ QToolBar *mainToolBar;
+ QStatusBar *statusBar;
+ QToolBar *instanceToolBar;
+ QToolBar *newsToolBar;
+
+ void setupUi(QMainWindow *MainWindow)
+ {
+ if (MainWindow->objectName().isEmpty())
+ {
+ MainWindow->setObjectName(QStringLiteral("MainWindow"));
+ }
+ MainWindow->resize(694, 563);
+ MainWindow->setWindowIcon(MMC->getThemedIcon("multimc"));
+ actionAddInstance = new QAction(MainWindow);
+ actionAddInstance->setObjectName(QStringLiteral("actionAddInstance"));
+ actionAddInstance->setIcon(MMC->getThemedIcon("new"));
+ actionViewInstanceFolder = new QAction(MainWindow);
+ actionViewInstanceFolder->setObjectName(QStringLiteral("actionViewInstanceFolder"));
+ actionViewInstanceFolder->setIcon(MMC->getThemedIcon("viewfolder"));
+ actionRefresh = new QAction(MainWindow);
+ actionRefresh->setObjectName(QStringLiteral("actionRefresh"));
+ actionRefresh->setIcon(MMC->getThemedIcon("refresh"));
+ actionViewCentralModsFolder = new QAction(MainWindow);
+ actionViewCentralModsFolder->setObjectName(QStringLiteral("actionViewCentralModsFolder"));
+ actionViewCentralModsFolder->setIcon(MMC->getThemedIcon("centralmods"));
+ actionCheckUpdate = new QAction(MainWindow);
+ actionCheckUpdate->setObjectName(QStringLiteral("actionCheckUpdate"));
+ actionCheckUpdate->setIcon(MMC->getThemedIcon("checkupdate"));
+ actionSettings = new QAction(MainWindow);
+ actionSettings->setObjectName(QStringLiteral("actionSettings"));
+ actionSettings->setIcon(MMC->getThemedIcon("settings"));
+ actionSettings->setMenuRole(QAction::PreferencesRole);
+ actionReportBug = new QAction(MainWindow);
+ actionReportBug->setObjectName(QStringLiteral("actionReportBug"));
+ actionReportBug->setIcon(MMC->getThemedIcon("bug"));
+ actionPatreon = new QAction(MainWindow);
+ actionPatreon->setObjectName(QStringLiteral("actionPatreon"));
+ actionPatreon->setIcon(MMC->getThemedIcon("patreon"));
+ actionMoreNews = new QAction(MainWindow);
+ actionMoreNews->setObjectName(QStringLiteral("actionMoreNews"));
+ actionMoreNews->setIcon(MMC->getThemedIcon("news"));
+ actionAbout = new QAction(MainWindow);
+ actionAbout->setObjectName(QStringLiteral("actionAbout"));
+ actionAbout->setIcon(MMC->getThemedIcon("about"));
+ actionAbout->setMenuRole(QAction::AboutRole);
+ actionLaunchInstance = new QAction(MainWindow);
+ actionLaunchInstance->setObjectName(QStringLiteral("actionLaunchInstance"));
+ actionRenameInstance = new QAction(MainWindow);
+ actionRenameInstance->setObjectName(QStringLiteral("actionRenameInstance"));
+ actionChangeInstGroup = new QAction(MainWindow);
+ actionChangeInstGroup->setObjectName(QStringLiteral("actionChangeInstGroup"));
+ actionChangeInstIcon = new QAction(MainWindow);
+ actionChangeInstIcon->setObjectName(QStringLiteral("actionChangeInstIcon"));
+ actionChangeInstIcon->setEnabled(true);
+ actionChangeInstIcon->setIcon(QIcon(":/icons/instances/infinity"));
+ actionChangeInstIcon->setIconVisibleInMenu(true);
+ actionEditInstNotes = new QAction(MainWindow);
+ actionEditInstNotes->setObjectName(QStringLiteral("actionEditInstNotes"));
+ actionEditInstance = new QAction(MainWindow);
+ actionEditInstance->setObjectName(QStringLiteral("actionEditInstance"));
+ actionViewSelectedInstFolder = new QAction(MainWindow);
+ actionViewSelectedInstFolder->setObjectName(QStringLiteral("actionViewSelectedInstFolder"));
+ actionDeleteInstance = new QAction(MainWindow);
+ actionDeleteInstance->setObjectName(QStringLiteral("actionDeleteInstance"));
+ actionConfig_Folder = new QAction(MainWindow);
+ actionConfig_Folder->setObjectName(QStringLiteral("actionConfig_Folder"));
+ actionCAT = new QAction(MainWindow);
+ actionCAT->setObjectName(QStringLiteral("actionCAT"));
+ actionCAT->setCheckable(true);
+ actionCAT->setIcon(MMC->getThemedIcon("cat"));
+ actionCopyInstance = new QAction(MainWindow);
+ actionCopyInstance->setObjectName(QStringLiteral("actionCopyInstance"));
+ actionCopyInstance->setIcon(MMC->getThemedIcon("copy"));
+ actionManageAccounts = new QAction(MainWindow);
+ actionManageAccounts->setObjectName(QStringLiteral("actionManageAccounts"));
+ actionLaunchInstanceOffline = new QAction(MainWindow);
+ actionLaunchInstanceOffline->setObjectName(QStringLiteral("actionLaunchInstanceOffline"));
+ actionScreenshots = new QAction(MainWindow);
+ actionScreenshots->setObjectName(QStringLiteral("actionScreenshots"));
+ actionInstanceSettings = new QAction(MainWindow);
+ actionInstanceSettings->setObjectName(QStringLiteral("actionInstanceSettings"));
+ actionExportInstance = new QAction(MainWindow);
+ actionExportInstance->setObjectName(QStringLiteral("actionExportInstance"));
+ centralWidget = new QWidget(MainWindow);
+ centralWidget->setObjectName(QStringLiteral("centralWidget"));
+ horizontalLayout = new QHBoxLayout(centralWidget);
+ horizontalLayout->setSpacing(0);
+ horizontalLayout->setContentsMargins(11, 11, 11, 11);
+ horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
+ horizontalLayout->setSizeConstraint(QLayout::SetDefaultConstraint);
+ horizontalLayout->setContentsMargins(0, 0, 0, 0);
+ MainWindow->setCentralWidget(centralWidget);
+ mainToolBar = new QToolBar(MainWindow);
+ mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
+ mainToolBar->setMovable(false);
+ mainToolBar->setAllowedAreas(Qt::TopToolBarArea);
+ mainToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
+ mainToolBar->setFloatable(false);
+ MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
+ statusBar = new QStatusBar(MainWindow);
+ statusBar->setObjectName(QStringLiteral("statusBar"));
+ MainWindow->setStatusBar(statusBar);
+ instanceToolBar = new QToolBar(MainWindow);
+ instanceToolBar->setObjectName(QStringLiteral("instanceToolBar"));
+ instanceToolBar->setEnabled(true);
+ instanceToolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
+ instanceToolBar->setIconSize(QSize(80, 80));
+ instanceToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
+ instanceToolBar->setFloatable(false);
+ MainWindow->addToolBar(Qt::RightToolBarArea, instanceToolBar);
+ newsToolBar = new QToolBar(MainWindow);
+ newsToolBar->setObjectName(QStringLiteral("newsToolBar"));
+ newsToolBar->setMovable(false);
+ newsToolBar->setAllowedAreas(Qt::BottomToolBarArea);
+ newsToolBar->setIconSize(QSize(16, 16));
+ newsToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+ newsToolBar->setFloatable(false);
+ MainWindow->addToolBar(Qt::BottomToolBarArea, newsToolBar);
+
+ mainToolBar->addAction(actionAddInstance);
+ mainToolBar->addAction(actionCopyInstance);
+ mainToolBar->addSeparator();
+ mainToolBar->addAction(actionViewInstanceFolder);
+ mainToolBar->addAction(actionViewCentralModsFolder);
+ mainToolBar->addAction(actionRefresh);
+ mainToolBar->addSeparator();
+ mainToolBar->addAction(actionCheckUpdate);
+ mainToolBar->addAction(actionSettings);
+ mainToolBar->addSeparator();
+ mainToolBar->addAction(actionReportBug);
+ mainToolBar->addAction(actionAbout);
+ mainToolBar->addSeparator();
+ mainToolBar->addAction(actionPatreon);
+ mainToolBar->addAction(actionCAT);
+ instanceToolBar->addAction(actionChangeInstIcon);
+ instanceToolBar->addAction(actionLaunchInstance);
+ instanceToolBar->addAction(actionLaunchInstanceOffline);
+ instanceToolBar->addAction(actionChangeInstGroup);
+ instanceToolBar->addSeparator();
+ instanceToolBar->addAction(actionEditInstance);
+ instanceToolBar->addAction(actionInstanceSettings);
+ instanceToolBar->addAction(actionEditInstNotes);
+ instanceToolBar->addAction(actionScreenshots);
+ instanceToolBar->addSeparator();
+ instanceToolBar->addAction(actionViewSelectedInstFolder);
+ instanceToolBar->addAction(actionConfig_Folder);
+ instanceToolBar->addSeparator();
+ instanceToolBar->addAction(actionExportInstance);
+ instanceToolBar->addAction(actionDeleteInstance);
+ newsToolBar->addAction(actionMoreNews);
+
+ retranslateUi(MainWindow);
+
+ QMetaObject::connectSlotsByName(MainWindow);
+ } // setupUi
+
+ void retranslateUi(QMainWindow *MainWindow)
+ {
+ MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MultiMC 5", 0));
+ actionAddInstance->setText(QApplication::translate("MainWindow", "Add Instance", 0));
+ actionAddInstance->setToolTip(QApplication::translate("MainWindow", "Add a new instance.", 0));
+ actionAddInstance->setStatusTip(QApplication::translate("MainWindow", "Add a new instance.", 0));
+ actionViewInstanceFolder->setText(QApplication::translate("MainWindow", "View Instance Folder", 0));
+ actionViewInstanceFolder->setToolTip(QApplication::translate("MainWindow", "Open the instance folder in a file browser.", 0));
+ actionViewInstanceFolder->setStatusTip(QApplication::translate("MainWindow", "Open the instance folder in a file browser.", 0));
+ actionRefresh->setText(QApplication::translate("MainWindow", "Refresh", 0));
+ actionRefresh->setToolTip(QApplication::translate("MainWindow", "Reload the instance list.", 0));
+ actionRefresh->setStatusTip(QApplication::translate("MainWindow", "Reload the instance list.", 0));
+ actionViewCentralModsFolder->setText(QApplication::translate("MainWindow", "View Central Mods Folder", 0));
+ actionViewCentralModsFolder->setToolTip(QApplication::translate("MainWindow", "Open the central mods folder in a file browser.", 0));
+ actionViewCentralModsFolder->setStatusTip(QApplication::translate("MainWindow", "Open the central mods folder in a file browser.", 0));
+ actionCheckUpdate->setText(QApplication::translate("MainWindow", "Check for Updates", 0));
+ actionCheckUpdate->setToolTip(QApplication::translate("MainWindow", "Check for new updates for MultiMC", 0));
+ actionCheckUpdate->setStatusTip(QApplication::translate("MainWindow", "Check for new updates for MultiMC", 0));
+ actionSettings->setText(QApplication::translate("MainWindow", "Settings", 0));
+ actionSettings->setToolTip(QApplication::translate("MainWindow", "Change settings.", 0));
+ actionSettings->setStatusTip(QApplication::translate("MainWindow", "Change settings.", 0));
+ actionReportBug->setText(QApplication::translate("MainWindow", "Report a Bug", 0));
+ actionReportBug->setToolTip(QApplication::translate("MainWindow", "Open the bug tracker to report a bug with MultiMC.", 0));
+ actionReportBug->setStatusTip(QApplication::translate("MainWindow", "Open the bug tracker to report a bug with MultiMC.", 0));
+ actionPatreon->setText(QApplication::translate("MainWindow", "Support us on Patreon!", 0));
+ actionPatreon->setToolTip(QApplication::translate("MainWindow", "Open the MultiMC Patreon page.", 0));
+ actionPatreon->setStatusTip(QApplication::translate("MainWindow", "Open the MultiMC Patreon page.", 0));
+ actionMoreNews->setText(QApplication::translate("MainWindow", "More News", 0));
+ actionMoreNews->setIconText(QApplication::translate("MainWindow", "More news...", 0));
+ actionMoreNews->setToolTip(QApplication::translate("MainWindow", "Open the MultiMC development blog to read more news about MultiMC.", 0));
+ actionMoreNews->setStatusTip(QApplication::translate("MainWindow", "Open the MultiMC development blog to read more news about MultiMC.", 0));
+ actionAbout->setText(QApplication::translate("MainWindow", "About MultiMC", 0));
+ actionAbout->setToolTip(QApplication::translate("MainWindow", "View information about MultiMC.", 0));
+ actionAbout->setStatusTip(QApplication::translate("MainWindow", "About MultiMC", 0));
+ actionLaunchInstance->setText(QApplication::translate("MainWindow", "Play", 0));
+ actionLaunchInstance->setToolTip(QApplication::translate("MainWindow", "Launch the selected instance.", 0));
+ actionLaunchInstance->setStatusTip(QApplication::translate("MainWindow", "Launch the selected instance.", 0));
+ actionRenameInstance->setText(QApplication::translate("MainWindow", "Instance Name", 0));
+ actionRenameInstance->setToolTip(QApplication::translate("MainWindow", "Rename the selected instance.", 0));
+ actionRenameInstance->setStatusTip(QApplication::translate("MainWindow", "Rename the selected instance.", 0));
+ actionChangeInstGroup->setText(QApplication::translate("MainWindow", "Change Group", 0));
+ actionChangeInstGroup->setToolTip(QApplication::translate("MainWindow", "Change the selected instance's group.", 0));
+ actionChangeInstGroup->setStatusTip(QApplication::translate("MainWindow", "Change the selected instance's group.", 0));
+ actionChangeInstIcon->setText(QApplication::translate("MainWindow", "Change Icon", 0));
+ actionChangeInstIcon->setToolTip(QApplication::translate("MainWindow", "Change the selected instance's icon.", 0));
+ actionChangeInstIcon->setStatusTip(QApplication::translate("MainWindow", "Change the selected instance's icon.", 0));
+ actionEditInstNotes->setText(QApplication::translate("MainWindow", "Edit Notes", 0));
+ actionEditInstNotes->setToolTip(QApplication::translate("MainWindow", "Edit the notes for the selected instance.", 0));
+ actionEditInstNotes->setStatusTip(QApplication::translate("MainWindow", "Edit the notes for the selected instance.", 0));
+ actionEditInstance->setText(QApplication::translate("MainWindow", "Edit Instance", 0));
+ actionEditInstance->setIconText(QApplication::translate("MainWindow", "Edit Instance", 0));
+ actionEditInstance->setToolTip(QApplication::translate("MainWindow", "Change the instance settings, mods and versions.", 0));
+ actionEditInstance->setStatusTip(QApplication::translate("MainWindow", "Change the instance settings, mods and versions.", 0));
+ actionViewSelectedInstFolder->setText(QApplication::translate("MainWindow", "Instance Folder", 0));
+ actionViewSelectedInstFolder->setToolTip(QApplication::translate("MainWindow", "Open the selected instance's root folder in a file browser.", 0));
+ actionViewSelectedInstFolder->setStatusTip(QApplication::translate("MainWindow", "Open the selected instance's root folder in a file browser.", 0));
+ actionDeleteInstance->setText(QApplication::translate("MainWindow", "Delete", 0));
+ actionDeleteInstance->setToolTip(QApplication::translate("MainWindow", "Delete the selected instance.", 0));
+ actionDeleteInstance->setStatusTip(QApplication::translate("MainWindow", "Delete the selected instance.", 0));
+ actionConfig_Folder->setText(QApplication::translate("MainWindow", "Config Folder", 0));
+ actionConfig_Folder->setToolTip(QApplication::translate("MainWindow", "Open the instance's config folder", 0));
+ actionCAT->setText(QApplication::translate("MainWindow", "Meow", 0));
+ actionCAT->setToolTip(QApplication::translate("MainWindow", "<html><head/><body><p align=\"center\">It's a fluffy kitty :3</p></body></html>", 0));
+ actionCopyInstance->setText(QApplication::translate("MainWindow", "Copy Instance", 0));
+ actionCopyInstance->setToolTip(QApplication::translate("MainWindow", "Copy the selected instance.", 0));
+ actionCopyInstance->setStatusTip(QApplication::translate("MainWindow", "Add a new instance.", 0));
+ actionManageAccounts->setText(QApplication::translate("MainWindow", "Manage Accounts", 0));
+ actionManageAccounts->setToolTip(QApplication::translate("MainWindow", "Manage your Mojang or Minecraft accounts.", 0));
+ actionLaunchInstanceOffline->setText(QApplication::translate("MainWindow", "Play Offline", 0));
+ actionLaunchInstanceOffline->setToolTip(QApplication::translate("MainWindow", "Launch the selected instance in offline mode.", 0));
+ actionLaunchInstanceOffline->setStatusTip(QApplication::translate("MainWindow", "Launch the selected instance.", 0));
+ actionScreenshots->setText(QApplication::translate("MainWindow", "Manage Screenshots", 0));
+ actionScreenshots->setToolTip(QApplication::translate("MainWindow", "<html><head/><body><p>View and upload screenshots for this instance</p></body></html>", 0));
+ actionInstanceSettings->setText(QApplication::translate("MainWindow", "Instance Settings", 0));
+ actionInstanceSettings->setToolTip(QApplication::translate("MainWindow", "Change the settings specific to the instance", 0));
+ actionExportInstance->setText(QApplication::translate("MainWindow", "Export Instance", 0));
+ mainToolBar->setWindowTitle(QApplication::translate("MainWindow", "Main Toolbar", 0));
+ instanceToolBar->setWindowTitle(QApplication::translate("MainWindow", "Instance Toolbar", 0));
+ newsToolBar->setWindowTitle(QApplication::translate("MainWindow", "News Toolbar", 0));
+ } // retranslateUi
+
+};
+
+namespace Ui {
+ class MainWindow: public Ui_MainWindow {};
+} // namespace Ui
+
+#include <QMenu>
+#include <QMessageBox>
+#include <QInputDialog>
+
+#include <QDesktopServices>
+#include <QKeyEvent>
+#include <QUrl>
+#include <QDir>
+#include <QFileInfo>
+#include <QLabel>
+#include <QToolButton>
+#include <QWidgetAction>
+#include <QProgressDialog>
+#include <QShortcut>
+#include <QFileDialog>
+
+#include <JlCompress.h>
+
+#include "osutils.h"
+#include "userutils.h"
+#include "pathutils.h"
+
+#include "groupview/GroupView.h"
+#include "groupview/InstanceDelegate.h"
+#include "InstanceProxyModel.h"
+
+#include "Platform.h"
+
+#include "widgets/LabeledToolButton.h"
+#include "widgets/ServerStatus.h"
+
+#include "dialogs/NewInstanceDialog.h"
+#include "dialogs/ProgressDialog.h"
+#include "dialogs/AboutDialog.h"
+#include "dialogs/VersionSelectDialog.h"
+#include "dialogs/CustomMessageBox.h"
+#include "dialogs/IconPickerDialog.h"
+#include "dialogs/CopyInstanceDialog.h"
+#include "dialogs/AccountSelectDialog.h"
+#include "dialogs/UpdateDialog.h"
+#include "dialogs/EditAccountDialog.h"
+#include "dialogs/NotificationDialog.h"
+
+#include "pages/global/MultiMCPage.h"
+#include "pages/global/ExternalToolsPage.h"
+#include "pages/global/AccountListPage.h"
+#include "pages/global/ProxyPage.h"
+#include "pages/global/JavaPage.h"
+#include "pages/global/MinecraftPage.h"
+
+#include "ConsoleWindow.h"
+#include "pagedialog/PageDialog.h"
+
+#include "InstanceList.h"
+#include "minecraft/MinecraftVersionList.h"
+#include "minecraft/LwjglVersionList.h"
+#include "icons/IconList.h"
+#include "java/JavaVersionList.h"
+
+#include "auth/flows/AuthenticateTask.h"
+#include "auth/flows/RefreshTask.h"
+
+#include "updater/DownloadTask.h"
+
+#include "news/NewsChecker.h"
+
+#include "net/URLConstants.h"
+#include "net/NetJob.h"
+#include "Env.h"
+
+#include "BaseInstance.h"
+#include "BaseProcess.h"
+#include "java/JavaUtils.h"
+#include "NagUtils.h"
+#include "InstancePageProvider.h"
+#include "minecraft/SkinUtils.h"
+
+//#include "minecraft/LegacyInstance.h"
+
+#include <updater/UpdateChecker.h>
+#include <notifications/NotificationChecker.h>
+#include <tasks/ThreadTask.h>
+#include <net/CacheDownload.h>
+
+#include "tools/BaseProfiler.h"
+
+MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
+{
+ MultiMCPlatform::fixWM_CLASS(this);
+ ui->setupUi(this);
+
+ // initialize the news checker
+ m_newsChecker.reset(new NewsChecker(BuildConfig.NEWS_RSS_URL));
+
+ QString winTitle =
+ QString("MultiMC 5 - Version %1").arg(BuildConfig.printableVersionString());
+ if (!BuildConfig.BUILD_PLATFORM.isEmpty())
+ winTitle += " on " + BuildConfig.BUILD_PLATFORM;
+ setWindowTitle(winTitle);
+
+ // OSX magic.
+ setUnifiedTitleAndToolBarOnMac(true);
+
+ // Global shortcuts
+ {
+ // FIXME: This is kinda weird. and bad. We need some kind of managed shutdown.
+ auto q = new QShortcut(QKeySequence::Quit, this);
+ connect(q, SIGNAL(activated()), qApp, SLOT(quit()));
+ }
+
+ // The instance action toolbar customizations
+ {
+ // disabled until we have an instance selected
+ ui->instanceToolBar->setEnabled(false);
+
+ // the rename label is inside the rename tool button
+ renameButton = new LabeledToolButton();
+ renameButton->setText("Instance Name");
+ renameButton->setToolTip(ui->actionRenameInstance->toolTip());
+ connect(renameButton, SIGNAL(clicked(bool)), SLOT(on_actionRenameInstance_triggered()));
+ ui->instanceToolBar->insertWidget(ui->actionLaunchInstance, renameButton);
+ ui->instanceToolBar->insertSeparator(ui->actionLaunchInstance);
+ renameButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ }
+
+ // Add the news label to the news toolbar.
+ {
+ newsLabel = new QToolButton();
+ newsLabel->setIcon(MMC->getThemedIcon("news"));
+ newsLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ newsLabel->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+ ui->newsToolBar->insertWidget(ui->actionMoreNews, newsLabel);
+ QObject::connect(newsLabel, &QAbstractButton::clicked, this,
+ &MainWindow::newsButtonClicked);
+ QObject::connect(m_newsChecker.get(), &NewsChecker::newsLoaded, this,
+ &MainWindow::updateNewsLabel);
+ updateNewsLabel();
+ }
+
+ // Create the instance list widget
+ {
+ view = new GroupView(ui->centralWidget);
+
+ view->setSelectionMode(QAbstractItemView::SingleSelection);
+ // view->setCategoryDrawer(drawer);
+ // view->setCollapsibleBlocks(true);
+ // view->setViewMode(QListView::IconMode);
+ // view->setFlow(QListView::LeftToRight);
+ // view->setWordWrap(true);
+ // view->setMouseTracking(true);
+ // view->viewport()->setAttribute(Qt::WA_Hover);
+ auto delegate = new ListViewDelegate();
+ view->setItemDelegate(delegate);
+ // view->setSpacing(10);
+ // view->setUniformItemWidths(true);
+
+ // do not show ugly blue border on the mac
+ view->setAttribute(Qt::WA_MacShowFocusRect, false);
+
+ view->installEventFilter(this);
+
+ proxymodel = new InstanceProxyModel(this);
+ // proxymodel->setSortRole(KCategorizedSortFilterProxyModel::CategorySortRole);
+ // proxymodel->setFilterRole(KCategorizedSortFilterProxyModel::CategorySortRole);
+ // proxymodel->setDynamicSortFilter ( true );
+
+ // FIXME: instList should be global-ish, or at least not tied to the main window...
+ // maybe the application itself?
+ proxymodel->setSourceModel(MMC->instances().get());
+ proxymodel->sort(0);
+ view->setFrameShape(QFrame::NoFrame);
+ view->setModel(proxymodel);
+
+ view->setContextMenuPolicy(Qt::CustomContextMenu);
+ connect(view, SIGNAL(customContextMenuRequested(const QPoint &)), this,
+ SLOT(showInstanceContextMenu(const QPoint &)));
+
+ ui->horizontalLayout->addWidget(view);
+ }
+ // The cat background
+ {
+ bool cat_enable = MMC->settings()->get("TheCat").toBool();
+ ui->actionCAT->setChecked(cat_enable);
+ connect(ui->actionCAT, SIGNAL(toggled(bool)), SLOT(onCatToggled(bool)));
+ setCatBackground(cat_enable);
+ }
+ // start instance when double-clicked
+ connect(view, SIGNAL(doubleClicked(const QModelIndex &)), this,
+ SLOT(instanceActivated(const QModelIndex &)));
+ // track the selection -- update the instance toolbar
+ connect(view->selectionModel(),
+ SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this,
+ SLOT(instanceChanged(const QModelIndex &, const QModelIndex &)));
+
+ // track icon changes and update the toolbar!
+ connect(ENV.icons().get(), SIGNAL(iconUpdated(QString)), SLOT(iconUpdated(QString)));
+
+ // model reset -> selection is invalid. All the instance pointers are wrong.
+ // FIXME: stop using POINTERS everywhere
+ connect(MMC->instances().get(), SIGNAL(dataIsInvalid()), SLOT(selectionBad()));
+
+ m_statusLeft = new QLabel(tr("No instance selected"), this);
+ m_statusRight = new ServerStatus(this);
+ statusBar()->addPermanentWidget(m_statusLeft, 1);
+ statusBar()->addPermanentWidget(m_statusRight, 0);
+
+ // Add "manage accounts" button, right align
+ QWidget *spacer = new QWidget();
+ spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ ui->mainToolBar->addWidget(spacer);
+
+ accountMenu = new QMenu(this);
+ manageAccountsAction = new QAction(tr("Manage Accounts"), this);
+ manageAccountsAction->setCheckable(false);
+ connect(manageAccountsAction, SIGNAL(triggered(bool)), this,
+ SLOT(on_actionManageAccounts_triggered()));
+
+ repopulateAccountsMenu();
+
+ accountMenuButton = new QToolButton(this);
+ accountMenuButton->setText(tr("Accounts"));
+ accountMenuButton->setMenu(accountMenu);
+ accountMenuButton->setPopupMode(QToolButton::InstantPopup);
+ accountMenuButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+ accountMenuButton->setIcon(MMC->getThemedIcon("noaccount"));
+
+ QWidgetAction *accountMenuButtonAction = new QWidgetAction(this);
+ accountMenuButtonAction->setDefaultWidget(accountMenuButton);
+
+ ui->mainToolBar->addAction(accountMenuButtonAction);
+
+ // set up global pages dialog
+ {
+ m_globalSettingsProvider = std::make_shared<GenericPageProvider>(tr("Settings"));
+ m_globalSettingsProvider->addPage<MultiMCPage>();
+ m_globalSettingsProvider->addPage<MinecraftPage>();
+ m_globalSettingsProvider->addPage<JavaPage>();
+ m_globalSettingsProvider->addPage<ProxyPage>();
+ m_globalSettingsProvider->addPage<ExternalToolsPage>();
+ m_globalSettingsProvider->addPage<AccountListPage>();
+ }
+
+ // Update the menu when the active account changes.
+ // Shouldn't have to use lambdas here like this, but if I don't, the compiler throws a fit.
+ // Template hell sucks...
+ connect(MMC->accounts().get(), &MojangAccountList::activeAccountChanged, [this]
+ { activeAccountChanged(); });
+ connect(MMC->accounts().get(), &MojangAccountList::listChanged, [this]
+ { repopulateAccountsMenu(); });
+
+ // Show initial account
+ activeAccountChanged();
+
+ auto accounts = MMC->accounts();
+
+ QList<CacheDownloadPtr> skin_dls;
+ for (int i = 0; i < accounts->count(); i++)
+ {
+ auto account = accounts->at(i);
+ if (account != nullptr)
+ {
+ for (auto profile : account->profiles())
+ {
+ auto meta = Env::getInstance().metacache()->resolveEntry("skins", profile.name + ".png");
+ auto action = CacheDownload::make(
+ QUrl("http://" + URLConstants::SKINS_BASE + profile.name + ".png"), meta);
+ skin_dls.append(action);
+ meta->stale = true;
+ }
+ }
+ }
+ if (!skin_dls.isEmpty())
+ {
+ auto job = new NetJob("Startup player skins download");
+ connect(job, SIGNAL(succeeded()), SLOT(skinJobFinished()));
+ connect(job, SIGNAL(failed()), SLOT(skinJobFinished()));
+ for (auto action : skin_dls)
+ {
+ job->addNetAction(action);
+ }
+ skin_download_job.reset(job);
+ job->start();
+ }
+
+ // run the things that load and download other things... FIXME: this is NOT the place
+ // FIXME: invisible actions in the background = NOPE.
+ {
+ if (!MMC->minecraftlist()->isLoaded())
+ {
+ m_versionLoadTask = MMC->minecraftlist()->getLoadTask();
+ startTask(m_versionLoadTask);
+ }
+ if (!MMC->lwjgllist()->isLoaded())
+ {
+ MMC->lwjgllist()->loadList();
+ }
+
+ m_newsChecker->reloadNews();
+ updateNewsLabel();
+
+ // set up the updater object.
+ auto updater = MMC->updateChecker();
+ connect(updater.get(), &UpdateChecker::updateAvailable, this,
+ &MainWindow::updateAvailable);
+ connect(updater.get(), &UpdateChecker::noUpdateFound, this,
+ &MainWindow::updateNotAvailable);
+ // if automatic update checks are allowed, start one.
+ if (MMC->settings()->get("AutoUpdate").toBool())
+ {
+ auto updater = MMC->updateChecker();
+ updater->checkForUpdate(MMC->settings()->get("UpdateChannel").toString(), false);
+ }
+ auto checker = new NotificationChecker();
+ checker->setNotificationsUrl(QUrl(BuildConfig.NOTIFICATION_URL));
+ checker->setApplicationChannel(BuildConfig.VERSION_CHANNEL);
+ checker->setApplicationPlatform(BuildConfig.BUILD_PLATFORM);
+ checker->setApplicationFullVersion(BuildConfig.FULL_VERSION_STR);
+ m_notificationChecker.reset(checker);
+ connect(m_notificationChecker.get(),
+ &NotificationChecker::notificationCheckFinished, this,
+ &MainWindow::notificationsChanged);
+ checker->checkForNotifications();
+ }
+
+ setSelectedInstanceById(MMC->settings()->get("SelectedInstance").toString());
+
+ // removing this looks stupid
+ view->setFocus();
+}
+
+MainWindow::~MainWindow()
+{
+ delete ui;
+ delete proxymodel;
+}
+
+void MainWindow::skinJobFinished()
+{
+ activeAccountChanged();
+ skin_download_job.reset();
+}
+
+void MainWindow::showInstanceContextMenu(const QPoint &pos)
+{
+ QList<QAction *> actions;
+
+ QAction *actionSep = new QAction("", this);
+ actionSep->setSeparator(true);
+
+ bool onInstance = view->indexAt(pos).isValid();
+ if (onInstance)
+ {
+ actions = ui->instanceToolBar->actions();
+
+ QAction *actionVoid = new QAction(m_selectedInstance->name(), this);
+ actionVoid->setEnabled(false);
+
+ QAction *actionRename = new QAction(tr("Rename"), this);
+ actionRename->setToolTip(ui->actionRenameInstance->toolTip());
+
+ QAction *actionCopyInstance = new QAction(tr("Copy instance"), this);
+ actionCopyInstance->setToolTip(ui->actionCopyInstance->toolTip());
+
+ connect(actionRename, SIGNAL(triggered(bool)),
+ SLOT(on_actionRenameInstance_triggered()));
+ connect(actionCopyInstance, SIGNAL(triggered(bool)),
+ SLOT(on_actionCopyInstance_triggered()));
+
+ actions.replace(1, actionRename);
+ actions.prepend(actionSep);
+ actions.prepend(actionVoid);
+ actions.append(actionCopyInstance);
+ }
+ else
+ {
+ QAction *actionVoid = new QAction(tr("MultiMC"), this);
+ actionVoid->setEnabled(false);
+
+ QAction *actionCreateInstance = new QAction(tr("Create instance"), this);
+ actionCreateInstance->setToolTip(ui->actionAddInstance->toolTip());
+
+ connect(actionCreateInstance, SIGNAL(triggered(bool)),
+ SLOT(on_actionAddInstance_triggered()));
+
+ actions.prepend(actionSep);
+ actions.prepend(actionVoid);
+ actions.append(actionCreateInstance);
+ }
+ QMenu myMenu;
+ myMenu.addActions(actions);
+ if (onInstance)
+ myMenu.setEnabled(m_selectedInstance->canLaunch());
+ myMenu.exec(view->mapToGlobal(pos));
+}
+
+void MainWindow::updateToolsMenu()
+{
+ if (ui->actionLaunchInstance->menu())
+ {
+ ui->actionLaunchInstance->menu()->deleteLater();
+ }
+ QMenu *launchMenu = new QMenu(this);
+ QAction *normalLaunch = launchMenu->addAction(tr("Launch"));
+ connect(normalLaunch, &QAction::triggered, [this]()
+ { doLaunch(); });
+ launchMenu->addSeparator()->setText(tr("Profilers"));
+ for (auto profiler : MMC->profilers().values())
+ {
+ QAction *profilerAction = launchMenu->addAction(profiler->name());
+ QString error;
+ if (!profiler->check(&error))
+ {
+ profilerAction->setDisabled(true);
+ profilerAction->setToolTip(
+ tr("Profiler not setup correctly. Go into settings, \"External Tools\"."));
+ }
+ else
+ {
+ connect(profilerAction, &QAction::triggered, [this, profiler]()
+ { doLaunch(true, profiler.get()); });
+ }
+ }
+ launchMenu->addSeparator()->setText(tr("Tools"));
+ for (auto tool : MMC->tools().values())
+ {
+ QAction *toolAction = launchMenu->addAction(tool->name());
+ QString error;
+ if (!tool->check(&error))
+ {
+ toolAction->setDisabled(true);
+ toolAction->setToolTip(
+ tr("Tool not setup correctly. Go into settings, \"External Tools\"."));
+ }
+ else
+ {
+ connect(toolAction, &QAction::triggered, [this, tool]()
+ { tool->createDetachedTool(m_selectedInstance, this)->run(); });
+ }
+ }
+ ui->actionLaunchInstance->setMenu(launchMenu);
+}
+
+void MainWindow::repopulateAccountsMenu()
+{
+ accountMenu->clear();
+
+ std::shared_ptr<MojangAccountList> accounts = MMC->accounts();
+ MojangAccountPtr active_account = accounts->activeAccount();
+
+ QString active_username = "";
+ if (active_account != nullptr)
+ {
+ active_username = accounts->activeAccount()->username();
+ }
+
+ if (accounts->count() <= 0)
+ {
+ QAction *action = new QAction(tr("No accounts added!"), this);
+ action->setEnabled(false);
+ accountMenu->addAction(action);
+
+ accountMenu->addSeparator();
+ }
+ else
+ {
+ // TODO: Nicer way to iterate?
+ for (int i = 0; i < accounts->count(); i++)
+ {
+ MojangAccountPtr account = accounts->at(i);
+
+ // Styling hack
+ QAction *section = new QAction(account->username(), this);
+ section->setEnabled(false);
+ accountMenu->addAction(section);
+
+ for (auto profile : account->profiles())
+ {
+ QAction *action = new QAction(profile.name, this);
+ action->setData(account->username());
+ action->setCheckable(true);
+ if (active_username == account->username())
+ {
+ action->setChecked(true);
+ }
+
+ action->setIcon(SkinUtils::getFaceFromCache(profile.name));
+ accountMenu->addAction(action);
+ connect(action, SIGNAL(triggered(bool)), SLOT(changeActiveAccount()));
+ }
+
+ accountMenu->addSeparator();
+ }
+ }
+
+ QAction *action = new QAction(tr("No Default Account"), this);
+ action->setCheckable(true);
+ action->setIcon(MMC->getThemedIcon("noaccount"));
+ action->setData("");
+ if (active_username.isEmpty())
+ {
+ action->setChecked(true);
+ }
+
+ accountMenu->addAction(action);
+ connect(action, SIGNAL(triggered(bool)), SLOT(changeActiveAccount()));
+
+ accountMenu->addSeparator();
+ accountMenu->addAction(manageAccountsAction);
+}
+
+/*
+ * Assumes the sender is a QAction
+ */
+void MainWindow::changeActiveAccount()
+{
+ QAction *sAction = (QAction *)sender();
+ // Profile's associated Mojang username
+ // Will need to change when profiles are properly implemented
+ if (sAction->data().type() != QVariant::Type::String)
+ return;
+
+ QVariant data = sAction->data();
+ QString id = "";
+ if (!data.isNull())
+ {
+ id = data.toString();
+ }
+
+ MMC->accounts()->setActiveAccount(id);
+
+ activeAccountChanged();
+}
+
+void MainWindow::activeAccountChanged()
+{
+ repopulateAccountsMenu();
+
+ MojangAccountPtr account = MMC->accounts()->activeAccount();
+
+ if (account != nullptr && account->username() != "")
+ {
+ const AccountProfile *profile = account->currentProfile();
+ if (profile != nullptr)
+ {
+ accountMenuButton->setIcon(SkinUtils::getFaceFromCache(profile->name));
+ return;
+ }
+ }
+
+ // Set the icon to the "no account" icon.
+ accountMenuButton->setIcon(MMC->getThemedIcon("noaccount"));
+}
+
+bool MainWindow::eventFilter(QObject *obj, QEvent *ev)
+{
+ if (obj == view)
+ {
+ if (ev->type() == QEvent::KeyPress)
+ {
+ QKeyEvent *keyEvent = static_cast<QKeyEvent *>(ev);
+ switch (keyEvent->key())
+ {
+ case Qt::Key_Enter:
+ case Qt::Key_Return:
+ on_actionLaunchInstance_triggered();
+ return true;
+ case Qt::Key_Delete:
+ on_actionDeleteInstance_triggered();
+ return true;
+ case Qt::Key_F5:
+ on_actionRefresh_triggered();
+ return true;
+ case Qt::Key_F2:
+ on_actionRenameInstance_triggered();
+ return true;
+ default:
+ break;
+ }
+ }
+ }
+ return QMainWindow::eventFilter(obj, ev);
+}
+
+void MainWindow::updateNewsLabel()
+{
+ if (m_newsChecker->isLoadingNews())
+ {
+ newsLabel->setText(tr("Loading news..."));
+ newsLabel->setEnabled(false);
+ }
+ else
+ {
+ QList<NewsEntryPtr> entries = m_newsChecker->getNewsEntries();
+ if (entries.length() > 0)
+ {
+ newsLabel->setText(entries[0]->title);
+ newsLabel->setEnabled(true);
+ }
+ else
+ {
+ newsLabel->setText(tr("No news available."));
+ newsLabel->setEnabled(false);
+ }
+ }
+}
+
+void MainWindow::updateAvailable(GoUpdate::Status status)
+{
+ UpdateDialog dlg;
+ UpdateAction action = (UpdateAction)dlg.exec();
+ switch (action)
+ {
+ case UPDATE_LATER:
+ qDebug() << "Update will be installed later.";
+ break;
+ case UPDATE_NOW:
+ downloadUpdates(status);
+ break;
+ case UPDATE_ONEXIT:
+ downloadUpdates(status, true);
+ break;
+ }
+}
+
+void MainWindow::updateNotAvailable()
+{
+ UpdateDialog dlg(false);
+ dlg.exec();
+}
+
+QList<int> stringToIntList(const QString &string)
+{
+ QStringList split = string.split(',', QString::SkipEmptyParts);
+ QList<int> out;
+ for (int i = 0; i < split.size(); ++i)
+ {
+ out.append(split.at(i).toInt());
+ }
+ return out;
+}
+QString intListToString(const QList<int> &list)
+{
+ QStringList slist;
+ for (int i = 0; i < list.size(); ++i)
+ {
+ slist.append(QString::number(list.at(i)));
+ }
+ return slist.join(',');
+}
+void MainWindow::notificationsChanged()
+{
+ QList<NotificationChecker::NotificationEntry> entries =
+ m_notificationChecker->notificationEntries();
+ QList<int> shownNotifications =
+ stringToIntList(MMC->settings()->get("ShownNotifications").toString());
+ for (auto it = entries.begin(); it != entries.end(); ++it)
+ {
+ NotificationChecker::NotificationEntry entry = *it;
+ if (!shownNotifications.contains(entry.id))
+ {
+ NotificationDialog dialog(entry, this);
+ if (dialog.exec() == NotificationDialog::DontShowAgain)
+ {
+ shownNotifications.append(entry.id);
+ }
+ }
+ }
+ MMC->settings()->set("ShownNotifications", intListToString(shownNotifications));
+}
+
+void MainWindow::downloadUpdates(GoUpdate::Status status, bool installOnExit)
+{
+ qDebug() << "Downloading updates.";
+ // TODO: If the user chooses to update on exit, we should download updates in the
+ // background.
+ // Doing so is a bit complicated, because we'd have to make sure it finished downloading
+ // before actually exiting MultiMC.
+ ProgressDialog updateDlg(this);
+ status.rootPath = MMC->rootPath;
+
+ GoUpdate::DownloadTask updateTask(status, &updateDlg);
+ // If the task succeeds, install the updates.
+ if (updateDlg.exec(&updateTask))
+ {
+ UpdateFlags baseFlags = None;
+ if (BuildConfig.UPDATER_DRY_RUN)
+ baseFlags |= DryRun;
+ if (installOnExit)
+ MMC->installUpdates(updateTask.updateFilesDir(), baseFlags | OnExit);
+ else
+ MMC->installUpdates(updateTask.updateFilesDir(), baseFlags | RestartOnFinish);
+ }
+}
+
+void MainWindow::onCatToggled(bool state)
+{
+ setCatBackground(state);
+ MMC->settings()->set("TheCat", state);
+}
+
+void MainWindow::setCatBackground(bool enabled)
+{
+ if (enabled)
+ {
+ view->setStyleSheet("GroupView"
+ "{"
+ "background-image: url(:/backgrounds/kitteh);"
+ "background-attachment: fixed;"
+ "background-clip: padding;"
+ "background-position: top right;"
+ "background-repeat: none;"
+ "background-color:palette(base);"
+ "}");
+ }
+ else
+ {
+ view->setStyleSheet(QString());
+ }
+}
+
+static QFileInfo findRecursive(const QString &dir, const QString &name)
+{
+ for (const auto info : QDir(dir).entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files, QDir::DirsLast))
+ {
+ if (info.isFile() && info.fileName() == name)
+ {
+ return info;
+ }
+ else if (info.isDir())
+ {
+ const QFileInfo res = findRecursive(info.absoluteFilePath(), name);
+ if (res.isFile() && res.exists())
+ {
+ return res;
+ }
+ }
+ }
+ return QFileInfo();
+}
+
+// FIXME: eliminate, should not be needed
+void MainWindow::waitForMinecraftVersions()
+{
+ if (!MMC->minecraftlist()->isLoaded() && m_versionLoadTask &&
+ m_versionLoadTask->isRunning())
+ {
+ QEventLoop waitLoop;
+ waitLoop.connect(m_versionLoadTask, SIGNAL(failed(QString)), SLOT(quit()));
+ waitLoop.connect(m_versionLoadTask, SIGNAL(succeeded()), SLOT(quit()));
+ waitLoop.exec();
+ }
+}
+
+void MainWindow::instanceFromZipPack(QString instName, QString instGroup, QString instIcon, QUrl url)
+{
+ InstancePtr newInstance;
+
+ QString instancesDir = MMC->settings()->get("InstanceDir").toString();
+ QString instDirName = DirNameFromString(instName, instancesDir);
+ QString instDir = PathCombine(instancesDir, instDirName);
+
+ QString archivePath;
+ if (url.isLocalFile())
+ {
+ archivePath = url.toLocalFile();
+ }
+ else
+ {
+ const QString path = url.host() + '/' + url.path();
+ auto entry = ENV.metacache()->resolveEntry("general", path);
+ CacheDownloadPtr dl = CacheDownload::make(url, entry);
+ NetJob job(tr("Modpack download"));
+ job.addNetAction(dl);
+
+ // FIXME: possibly causes endless loop problems
+ ProgressDialog dlDialog(this);
+ if (dlDialog.exec(&job) != QDialog::Accepted)
+ {
+ return;
+ }
+ archivePath = entry->getFullPath();
+ }
+
+ QTemporaryDir extractTmpDir;
+ QDir extractDir(extractTmpDir.path());
+ qDebug() << "Attempting to create instance from" << archivePath;
+ if (JlCompress::extractDir(archivePath, extractDir.absolutePath()).isEmpty())
+ {
+ CustomMessageBox::selectable(this, tr("Error"),
+ tr("Failed to extract modpack"), QMessageBox::Warning)->show();
+ return;
+ }
+ const QFileInfo instanceCfgFile = findRecursive(extractDir.absolutePath(), "instance.cfg");
+ if (!instanceCfgFile.isFile() || !instanceCfgFile.exists())
+ {
+ CustomMessageBox::selectable(this, tr("Error"), tr("Archive does not contain instance.cfg"))->show();
+ return;
+ }
+ if (!copyPath(instanceCfgFile.absoluteDir().absolutePath(), instDir))
+ {
+ CustomMessageBox::selectable(this, tr("Error"), tr("Unable to copy instance"))->show();
+ return;
+ }
+
+ auto error = MMC->instances()->loadInstance(newInstance, instDir);
+ QString errorMsg = tr("Failed to load instance %1: ").arg(instDirName);
+ switch (error)
+ {
+ case InstanceList::UnknownLoadError:
+ errorMsg += tr("Unkown error");
+ CustomMessageBox::selectable(this, tr("Error"), errorMsg, QMessageBox::Warning)->show();
+ return;
+ case InstanceList::NotAnInstance:
+ errorMsg += tr("Not an instance");
+ CustomMessageBox::selectable(this, tr("Error"), errorMsg, QMessageBox::Warning)->show();
+ return;
+ }
+
+ newInstance->setName(instName);
+ newInstance->setIconKey(instIcon);
+ newInstance->setGroupInitial(instGroup);
+ MMC->instances()->add(InstancePtr(newInstance));
+ MMC->instances()->saveGroupList();
+
+ finalizeInstance(newInstance);
+}
+
+void MainWindow::instanceFromVersion(QString instName, QString instGroup, QString instIcon, BaseVersionPtr version)
+{
+ InstancePtr newInstance;
+
+ QString instancesDir = MMC->settings()->get("InstanceDir").toString();
+ QString instDirName = DirNameFromString(instName, instancesDir);
+ QString instDir = PathCombine(instancesDir, instDirName);
+ auto error = MMC->instances()->createInstance(newInstance, version, instDir);
+ QString errorMsg = tr("Failed to create instance %1: ").arg(instDirName);
+ switch (error)
+ {
+ case InstanceList::NoCreateError:
+ break;
+
+ case InstanceList::InstExists:
+ {
+ errorMsg += tr("An instance with the given directory name already exists.");
+ CustomMessageBox::selectable(this, tr("Error"), errorMsg, QMessageBox::Warning)->show();
+ return;
+ }
+
+ case InstanceList::CantCreateDir:
+ {
+ errorMsg += tr("Failed to create the instance directory.");
+ CustomMessageBox::selectable(this, tr("Error"), errorMsg, QMessageBox::Warning)->show();
+ return;
+ }
+
+ default:
+ {
+ errorMsg += tr("Unknown instance loader error %1").arg(error);
+ CustomMessageBox::selectable(this, tr("Error"), errorMsg, QMessageBox::Warning)->show();
+ return;
+ }
+ }
+ newInstance->setName(instName);
+ newInstance->setIconKey(instIcon);
+ newInstance->setGroupInitial(instGroup);
+ MMC->instances()->add(InstancePtr(newInstance));
+ MMC->instances()->saveGroupList();
+ finalizeInstance(newInstance);
+}
+
+void MainWindow::finalizeInstance(InstancePtr inst)
+{
+ if (MMC->accounts()->anyAccountIsValid())
+ {
+ ProgressDialog loadDialog(this);
+ auto update = inst->doUpdate();
+ connect(update.get(), &Task::failed, [this](QString reason)
+ {
+ QString error = QString("Instance load failed: %1").arg(reason);
+ CustomMessageBox::selectable(this, tr("Error"), error, QMessageBox::Warning)
+ ->show();
+ });
+ loadDialog.exec(update.get());
+ }
+ else
+ {
+ CustomMessageBox::selectable(
+ this, tr("Error"),
+ tr("MultiMC cannot download Minecraft or update instances unless you have at least "
+ "one account added.\nPlease add your Mojang or Minecraft account."),
+ QMessageBox::Warning)->show();
+ }
+}
+
+
+void MainWindow::on_actionAddInstance_triggered()
+{
+ waitForMinecraftVersions();
+
+ NewInstanceDialog newInstDlg(this);
+ if (!newInstDlg.exec())
+ return;
+
+ MMC->settings()->set("LastUsedGroupForNewInstance", newInstDlg.instGroup());
+
+ const QUrl modpackUrl = newInstDlg.modpackUrl();
+
+
+ if (modpackUrl.isValid())
+ {
+ instanceFromZipPack(newInstDlg.instName(), newInstDlg.instGroup(), newInstDlg.iconKey(), modpackUrl);
+ }
+ else
+ {
+ instanceFromVersion(newInstDlg.instName(), newInstDlg.instGroup(), newInstDlg.iconKey(), newInstDlg.selectedVersion());
+ }
+}
+
+void MainWindow::on_actionCopyInstance_triggered()
+{
+ if (!m_selectedInstance)
+ return;
+
+ CopyInstanceDialog copyInstDlg(m_selectedInstance, this);
+ if (!copyInstDlg.exec())
+ return;
+
+ QString instancesDir = MMC->settings()->get("InstanceDir").toString();
+ QString instDirName = DirNameFromString(copyInstDlg.instName(), instancesDir);
+ QString instDir = PathCombine(instancesDir, instDirName);
+
+ InstancePtr newInstance;
+ auto error = MMC->instances()->copyInstance(newInstance, m_selectedInstance, instDir);
+
+ QString errorMsg = tr("Failed to create instance %1: ").arg(instDirName);
+ switch (error)
+ {
+ case InstanceList::NoCreateError:
+ newInstance->setName(copyInstDlg.instName());
+ newInstance->setGroupInitial(copyInstDlg.instGroup());
+ newInstance->setIconKey(copyInstDlg.iconKey());
+ MMC->instances()->add(newInstance);
+ return;
+
+ case InstanceList::InstExists:
+ {
+ errorMsg += tr("An instance with the given directory name already exists.");
+ CustomMessageBox::selectable(this, tr("Error"), errorMsg, QMessageBox::Warning)->show();
+ break;
+ }
+
+ case InstanceList::CantCreateDir:
+ {
+ errorMsg += tr("Failed to create the instance directory.");
+ CustomMessageBox::selectable(this, tr("Error"), errorMsg, QMessageBox::Warning)->show();
+ break;
+ }
+
+ default:
+ {
+ errorMsg += tr("Unknown instance loader error %1").arg(error);
+ CustomMessageBox::selectable(this, tr("Error"), errorMsg, QMessageBox::Warning)->show();
+ break;
+ }
+ }
+}
+
+void MainWindow::on_actionChangeInstIcon_triggered()
+{
+ if (!m_selectedInstance)
+ return;
+
+ IconPickerDialog dlg(this);
+ dlg.exec(m_selectedInstance->iconKey());
+ if (dlg.result() == QDialog::Accepted)
+ {
+ m_selectedInstance->setIconKey(dlg.selectedIconKey);
+ auto ico = ENV.icons()->getBigIcon(dlg.selectedIconKey);
+ ui->actionChangeInstIcon->setIcon(ico);
+ }
+}
+
+void MainWindow::iconUpdated(QString icon)
+{
+ if (icon == m_currentInstIcon)
+ {
+ ui->actionChangeInstIcon->setIcon(ENV.icons()->getBigIcon(m_currentInstIcon));
+ }
+}
+
+void MainWindow::updateInstanceToolIcon(QString new_icon)
+{
+ m_currentInstIcon = new_icon;
+ ui->actionChangeInstIcon->setIcon(ENV.icons()->getBigIcon(m_currentInstIcon));
+}
+
+void MainWindow::setSelectedInstanceById(const QString &id)
+{
+ if (id.isNull())
+ return;
+ const QModelIndex index = MMC->instances()->getInstanceIndexById(id);
+ if (index.isValid())
+ {
+ QModelIndex selectionIndex = proxymodel->mapFromSource(index);
+ view->selectionModel()->setCurrentIndex(selectionIndex, QItemSelectionModel::ClearAndSelect);
+ }
+}
+
+void MainWindow::on_actionChangeInstGroup_triggered()
+{
+ if (!m_selectedInstance)
+ return;
+
+ bool ok = false;
+ QString name(m_selectedInstance->group());
+ auto groups = MMC->instances()->getGroups();
+ groups.insert(0, "");
+ groups.sort(Qt::CaseInsensitive);
+ int foo = groups.indexOf(name);
+
+ name = QInputDialog::getItem(this, tr("Group name"), tr("Enter a new group name."), groups,
+ foo, true, &ok);
+ name = name.simplified();
+ if (ok)
+ m_selectedInstance->setGroupPost(name);
+}
+
+void MainWindow::on_actionViewInstanceFolder_triggered()
+{
+ QString str = MMC->settings()->get("InstanceDir").toString();
+ openDirInDefaultProgram(str);
+}
+
+void MainWindow::on_actionRefresh_triggered()
+{
+ MMC->instances()->loadList();
+}
+
+void MainWindow::on_actionViewCentralModsFolder_triggered()
+{
+ openDirInDefaultProgram(MMC->settings()->get("CentralModsDir").toString(), true);
+}
+
+void MainWindow::on_actionConfig_Folder_triggered()
+{
+ if (m_selectedInstance)
+ {
+ QString str = m_selectedInstance->instanceConfigFolder();
+ openDirInDefaultProgram(QDir(str).absolutePath());
+ }
+}
+
+void MainWindow::on_actionCheckUpdate_triggered()
+{
+ auto updater = MMC->updateChecker();
+ updater->checkForUpdate(MMC->settings()->get("UpdateChannel").toString(), true);
+}
+
+template <typename T>
+void ShowPageDialog(T raw_provider, QWidget * parent, QString open_page = QString())
+{
+ auto provider = std::dynamic_pointer_cast<BasePageProvider>(raw_provider);
+ if(!provider)
+ return;
+ PageDialog dlg(provider, open_page, parent);
+ dlg.exec();
+}
+
+void ShowInstancePageDialog(InstancePtr instance, QWidget * parent, QString open_page = QString())
+{
+ auto provider = std::make_shared<InstancePageProvider>(instance);
+ ShowPageDialog(provider, parent, open_page);
+}
+
+void MainWindow::on_actionSettings_triggered()
+{
+ ShowPageDialog(m_globalSettingsProvider, this, "global-settings");
+ // FIXME: quick HACK to make this work. improve, optimize.
+ proxymodel->invalidate();
+ proxymodel->sort(0);
+ updateToolsMenu();
+ update();
+}
+
+void MainWindow::on_actionInstanceSettings_triggered()
+{
+ ShowInstancePageDialog(m_selectedInstance, this, "settings");
+}
+
+void MainWindow::on_actionEditInstNotes_triggered()
+{
+ ShowInstancePageDialog(m_selectedInstance, this, "notes");
+}
+
+void MainWindow::on_actionEditInstance_triggered()
+{
+ ShowInstancePageDialog(m_selectedInstance, this);
+}
+
+void MainWindow::on_actionScreenshots_triggered()
+{
+ ShowInstancePageDialog(m_selectedInstance, this, "screenshots");
+}
+
+
+void MainWindow::on_actionManageAccounts_triggered()
+{
+ ShowPageDialog(m_globalSettingsProvider, this, "accounts");
+}
+
+void MainWindow::on_actionReportBug_triggered()
+{
+ openWebPage(QUrl("https://github.com/MultiMC/MultiMC5/issues"));
+}
+
+void MainWindow::on_actionPatreon_triggered()
+{
+ openWebPage(QUrl("http://www.patreon.com/multimc"));
+}
+
+void MainWindow::on_actionMoreNews_triggered()
+{
+ openWebPage(QUrl("http://multimc.org/posts.html"));
+}
+
+void MainWindow::newsButtonClicked()
+{
+ QList<NewsEntryPtr> entries = m_newsChecker->getNewsEntries();
+ if (entries.count() > 0)
+ openWebPage(QUrl(entries[0]->link));
+ else
+ openWebPage(QUrl("http://multimc.org/posts.html"));
+}
+
+void MainWindow::on_actionAbout_triggered()
+{
+ AboutDialog dialog(this);
+ dialog.exec();
+}
+
+void MainWindow::on_mainToolBar_visibilityChanged(bool)
+{
+ // Don't allow hiding the main toolbar.
+ // This is the only way I could find to prevent it... :/
+ ui->mainToolBar->setVisible(true);
+}
+
+void MainWindow::on_actionDeleteInstance_triggered()
+{
+ if (m_selectedInstance)
+ {
+ auto response = CustomMessageBox::selectable(
+ this, tr("CAREFUL"), tr("This is permanent! Are you sure?\nAbout to delete: ") +
+ m_selectedInstance->name(),
+ QMessageBox::Question, QMessageBox::Yes | QMessageBox::No)->exec();
+ if (response == QMessageBox::Yes)
+ {
+ m_selectedInstance->nuke();
+ }
+ }
+}
+
+#include <pathutils.h>
+
+bool compressSubDir(QuaZip* zip, QString dir, QString origDir, QString prefix)
+{
+ if (!zip) return false;
+ if (zip->getMode()!=QuaZip::mdCreate && zip->getMode()!=QuaZip::mdAppend && zip->getMode()!=QuaZip::mdAdd)
+ {
+ return false;
+ }
+
+ QDir directory(dir);
+ if (!directory.exists()) return false;
+
+ QDir origDirectory(origDir);
+ if (dir != origDir)
+ {
+ QuaZipFile dirZipFile(zip);
+ auto dirPrefix = PathCombine(prefix, origDirectory.relativeFilePath(dir)) + "/";
+ if (!dirZipFile.open(QIODevice::WriteOnly, QuaZipNewInfo(dirPrefix, dir), 0, 0, 0))
+ {
+ return false;
+ }
+ dirZipFile.close();
+ }
+
+ QFileInfoList files = directory.entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::Hidden);
+ for (auto file: files)
+ {
+ if(!compressSubDir(zip,file.absoluteFilePath(),origDir, prefix))
+ {
+ return false;
+ }
+ }
+
+ files = directory.entryInfoList(QDir::Files);
+ for (auto file: files)
+ {
+ if(!file.isFile())
+ {
+ continue;
+ }
+
+ if(file.absoluteFilePath()==zip->getZipName())
+ {
+ continue;
+ }
+
+ QString filename = origDirectory.relativeFilePath(file.absoluteFilePath());
+ if(prefix.size())
+ {
+ filename = PathCombine(prefix, filename);
+ }
+ if (!JlCompress::compressFile(zip,file.absoluteFilePath(),filename))
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool compressDir(QString zipFile, QString dir, QString prefix = QString())
+{
+ QuaZip zip(zipFile);
+ QDir().mkpath(QFileInfo(zipFile).absolutePath());
+ if(!zip.open(QuaZip::mdCreate))
+ {
+ QFile::remove(zipFile);
+ return false;
+ }
+
+ QSet<QString> added;
+ if (!compressSubDir(&zip,dir,dir,prefix))
+ {
+ QFile::remove(zipFile);
+ return false;
+ }
+ zip.close();
+ if(zip.getZipError()!=0)
+ {
+ QFile::remove(zipFile);
+ return false;
+ }
+ return true;
+}
+
+void MainWindow::on_actionExportInstance_triggered()
+{
+ if (m_selectedInstance)
+ {
+ auto name = RemoveInvalidFilenameChars(m_selectedInstance->name());
+
+ const QString output = QFileDialog::getSaveFileName(this, tr("Export %1")
+ .arg(m_selectedInstance->name()),
+ PathCombine(QDir::homePath(), name + ".zip") , "Zip (*.zip)");
+ if (output.isNull())
+ {
+ return;
+ }
+ if (QFile::exists(output))
+ {
+ int ret = QMessageBox::question(this, tr("Overwrite?"), tr("This file already exists. Do you want to overwrite it?"),
+ QMessageBox::No, QMessageBox::Yes);
+ if (ret == QMessageBox::No)
+ {
+ return;
+ }
+ }
+
+ if (!compressDir(output, m_selectedInstance->instanceRoot(), name))
+ {
+ QMessageBox::warning(this, tr("Error"), tr("Unable to export instance"));
+ }
+ }
+}
+
+void MainWindow::on_actionRenameInstance_triggered()
+{
+ if (m_selectedInstance)
+ {
+ bool ok = false;
+ QString name(m_selectedInstance->name());
+ name =
+ QInputDialog::getText(this, tr("Instance name"), tr("Enter a new instance name."),
+ QLineEdit::Normal, name, &ok);
+
+ if (name.length() > 0)
+ {
+ if (ok && name.length())
+ {
+ m_selectedInstance->setName(name);
+ renameButton->setText(name);
+ }
+ }
+ }
+}
+
+void MainWindow::on_actionViewSelectedInstFolder_triggered()
+{
+ if (m_selectedInstance)
+ {
+ QString str = m_selectedInstance->instanceRoot();
+ openDirInDefaultProgram(QDir(str).absolutePath());
+ }
+}
+
+void MainWindow::closeEvent(QCloseEvent *event)
+{
+ // Save the window state and geometry.
+
+ MMC->settings()->set("MainWindowState", saveState().toBase64());
+ MMC->settings()->set("MainWindowGeometry", saveGeometry().toBase64());
+
+ QMainWindow::closeEvent(event);
+ QApplication::exit();
+}
+/*
+void MainWindow::on_instanceView_customContextMenuRequested(const QPoint &pos)
+{
+ QMenu *instContextMenu = new QMenu("Instance", this);
+
+ // Add the actions from the toolbar to the context menu.
+ instContextMenu->addActions(ui->instanceToolBar->actions());
+
+ instContextMenu->exec(view->mapToGlobal(pos));
+}
+*/
+void MainWindow::instanceActivated(QModelIndex index)
+{
+ if (!index.isValid())
+ return;
+ QString id = index.data(InstanceList::InstanceIDRole).toString();
+ InstancePtr inst = MMC->instances()->getInstanceById(id);
+ if (!inst)
+ return;
+
+ NagUtils::checkJVMArgs(inst->settings().get("JvmArgs").toString(), this);
+
+ doLaunch();
+}
+
+void MainWindow::on_actionLaunchInstance_triggered()
+{
+ if (m_selectedInstance)
+ {
+ NagUtils::checkJVMArgs(m_selectedInstance->settings().get("JvmArgs").toString(), this);
+ doLaunch();
+ }
+}
+
+void MainWindow::on_actionLaunchInstanceOffline_triggered()
+{
+ if (m_selectedInstance)
+ {
+ NagUtils::checkJVMArgs(m_selectedInstance->settings().get("JvmArgs").toString(), this);
+ doLaunch(false);
+ }
+}
+
+void MainWindow::doLaunch(bool online, BaseProfilerFactory *profiler)
+{
+ if (!m_selectedInstance)
+ return;
+
+ // Find an account to use.
+ std::shared_ptr<MojangAccountList> accounts = MMC->accounts();
+ MojangAccountPtr account = accounts->activeAccount();
+ if (accounts->count() <= 0)
+ {
+ // Tell the user they need to log in at least one account in order to play.
+ auto reply = CustomMessageBox::selectable(
+ this, tr("No Accounts"),
+ tr("In order to play Minecraft, you must have at least one Mojang or Minecraft "
+ "account logged in to MultiMC."
+ "Would you like to open the account manager to add an account now?"),
+ QMessageBox::Information, QMessageBox::Yes | QMessageBox::No)->exec();
+
+ if (reply == QMessageBox::Yes)
+ {
+ // Open the account manager.
+ on_actionManageAccounts_triggered();
+ }
+ }
+ else if (account.get() == nullptr)
+ {
+ // If no default account is set, ask the user which one to use.
+ AccountSelectDialog selectDialog(tr("Which account would you like to use?"),
+ AccountSelectDialog::GlobalDefaultCheckbox, this);
+
+ selectDialog.exec();
+
+ // Launch the instance with the selected account.
+ account = selectDialog.selectedAccount();
+
+ // If the user said to use the account as default, do that.
+ if (selectDialog.useAsGlobalDefault() && account.get() != nullptr)
+ accounts->setActiveAccount(account->username());
+ }
+
+ // if no account is selected, we bail
+ if (!account.get())
+ return;
+
+ // we try empty password first :)
+ QString password;
+ // we loop until the user succeeds in logging in or gives up
+ bool tryagain = true;
+ // the failure. the default failure.
+ QString failReason = tr("Your account is currently not logged in. Please enter "
+ "your password to log in again.");
+
+ while (tryagain)
+ {
+ AuthSessionPtr session(new AuthSession());
+ session->wants_online = online;
+ auto task = account->login(session, password);
+ if (task)
+ {
+ // We'll need to validate the access token to make sure the account
+ // is still logged in.
+ ProgressDialog progDialog(this);
+ if (online)
+ progDialog.setSkipButton(true, tr("Play Offline"));
+ progDialog.exec(task.get());
+ if (!task->successful())
+ {
+ failReason = task->failReason();
+ }
+ }
+ switch (session->status)
+ {
+ case AuthSession::Undetermined:
+ {
+ qCritical() << "Received undetermined session status during login. Bye.";
+ tryagain = false;
+ break;
+ }
+ case AuthSession::RequiresPassword:
+ {
+ EditAccountDialog passDialog(failReason, this, EditAccountDialog::PasswordField);
+ if (passDialog.exec() == QDialog::Accepted)
+ {
+ password = passDialog.password();
+ }
+ else
+ {
+ tryagain = false;
+ }
+ break;
+ }
+ case AuthSession::PlayableOffline:
+ {
+ // we ask the user for a player name
+ bool ok = false;
+ QString usedname = session->player_name;
+ QString name = QInputDialog::getText(this, tr("Player name"),
+ tr("Choose your offline mode player name."),
+ QLineEdit::Normal, session->player_name, &ok);
+ if (!ok)
+ {
+ tryagain = false;
+ break;
+ }
+ if (name.length())
+ {
+ usedname = name;
+ }
+ session->MakeOffline(usedname);
+ // offline flavored game from here :3
+ }
+ case AuthSession::PlayableOnline:
+ {
+ // update first if the server actually responded
+ if (session->auth_server_online)
+ {
+ updateInstance(m_selectedInstance, session, profiler);
+ }
+ else
+ {
+ launchInstance(m_selectedInstance, session, profiler);
+ }
+ tryagain = false;
+ }
+ }
+ }
+}
+
+void MainWindow::updateInstance(InstancePtr instance, AuthSessionPtr session,
+ BaseProfilerFactory *profiler)
+{
+ auto updateTask = instance->doUpdate();
+ if (!updateTask)
+ {
+ launchInstance(instance, session, profiler);
+ return;
+ }
+ ProgressDialog tDialog(this);
+ connect(updateTask.get(), &Task::succeeded, [this, instance, session, profiler]
+ { launchInstance(instance, session, profiler); });
+ connect(updateTask.get(), SIGNAL(failed(QString)), SLOT(onGameUpdateError(QString)));
+ tDialog.exec(updateTask.get());
+}
+
+void MainWindow::launchInstance(InstancePtr instance, AuthSessionPtr session,
+ BaseProfilerFactory *profiler)
+{
+ Q_ASSERT_X(instance != NULL, "launchInstance", "instance is NULL");
+ Q_ASSERT_X(session.get() != nullptr, "launchInstance", "session is NULL");
+
+ QString launchScript;
+
+ BaseProcess *proc = instance->prepareForLaunch(session);
+ if (!proc)
+ return;
+
+ this->hide();
+
+ console = new ConsoleWindow(proc);
+ connect(console, SIGNAL(isClosing()), this, SLOT(instanceEnded()));
+
+ proc->setHeader("MultiMC version: " + BuildConfig.printableVersionString() + "\n\n");
+ proc->arm();
+
+ if (profiler)
+ {
+ QString error;
+ if (!profiler->check(&error))
+ {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Couldn't start profiler: %1").arg(error));
+ proc->abort();
+ return;
+ }
+ BaseProfiler *profilerInstance = profiler->createProfiler(instance, this);
+ QProgressDialog dialog;
+ dialog.setMinimum(0);
+ dialog.setMaximum(0);
+ dialog.setValue(0);
+ dialog.setLabelText(tr("Waiting for profiler..."));
+ connect(&dialog, &QProgressDialog::canceled, profilerInstance,
+ &BaseProfiler::abortProfiling);
+ dialog.show();
+ connect(profilerInstance, &BaseProfiler::readyToLaunch,
+ [&dialog, this, proc](const QString & message)
+ {
+ dialog.accept();
+ QMessageBox msg;
+ msg.setText(tr("The game launch is delayed until you press the "
+ "button. This is the right time to setup the profiler, as the "
+ "profiler server is running now.\n\n%1").arg(message));
+ msg.setWindowTitle(tr("Waiting"));
+ msg.setIcon(QMessageBox::Information);
+ msg.addButton(tr("Launch"), QMessageBox::AcceptRole);
+ msg.exec();
+ proc->launch();
+ });
+ connect(profilerInstance, &BaseProfiler::abortLaunch,
+ [&dialog, this, proc](const QString & message)
+ {
+ dialog.accept();
+ QMessageBox msg;
+ msg.setText(tr("Couldn't start the profiler: %1").arg(message));
+ msg.setWindowTitle(tr("Error"));
+ msg.setIcon(QMessageBox::Critical);
+ msg.addButton(QMessageBox::Ok);
+ msg.exec();
+ proc->abort();
+ });
+ profilerInstance->beginProfiling(proc);
+ dialog.exec();
+ }
+ else
+ {
+ proc->launch();
+ }
+}
+
+void MainWindow::onGameUpdateError(QString error)
+{
+ CustomMessageBox::selectable(this, tr("Error updating instance"), error,
+ QMessageBox::Warning)->show();
+}
+
+void MainWindow::taskStart()
+{
+ // Nothing to do here yet.
+}
+
+void MainWindow::taskEnd()
+{
+ QObject *sender = QObject::sender();
+ if (sender == m_versionLoadTask)
+ m_versionLoadTask = NULL;
+
+ sender->deleteLater();
+}
+
+void MainWindow::startTask(Task *task)
+{
+ connect(task, SIGNAL(started()), SLOT(taskStart()));
+ connect(task, SIGNAL(succeeded()), SLOT(taskEnd()));
+ connect(task, SIGNAL(failed(QString)), SLOT(taskEnd()));
+ task->start();
+}
+
+// BrowserDialog
+void MainWindow::openWebPage(QUrl url)
+{
+ QDesktopServices::openUrl(url);
+}
+
+void MainWindow::instanceChanged(const QModelIndex &current, const QModelIndex &previous)
+{
+ if(!current.isValid())
+ {
+ MMC->settings()->set("SelectedInstance", QString());
+ selectionBad();
+ return;
+ }
+ QString id = current.data(InstanceList::InstanceIDRole).toString();
+ m_selectedInstance = MMC->instances()->getInstanceById(id);
+ if ( m_selectedInstance )
+ {
+ ui->instanceToolBar->setEnabled(m_selectedInstance->canLaunch());
+ renameButton->setText(m_selectedInstance->name());
+ m_statusLeft->setText(m_selectedInstance->getStatusbarDescription());
+ updateInstanceToolIcon(m_selectedInstance->iconKey());
+
+ updateToolsMenu();
+
+ MMC->settings()->set("SelectedInstance", m_selectedInstance->id());
+ }
+ else
+ {
+ MMC->settings()->set("SelectedInstance", QString());
+ selectionBad();
+ return;
+ }
+}
+
+void MainWindow::selectionBad()
+{
+ // start by reseting everything...
+ m_selectedInstance = nullptr;
+
+ statusBar()->clearMessage();
+ ui->instanceToolBar->setEnabled(false);
+ renameButton->setText(tr("Rename Instance"));
+ updateInstanceToolIcon("infinity");
+
+ // ...and then see if we can enable the previously selected instance
+ setSelectedInstanceById(MMC->settings()->get("SelectedInstance").toString());
+}
+
+void MainWindow::instanceEnded()
+{
+ this->show();
+}
+
+void MainWindow::checkSetDefaultJava()
+{
+ const QString javaHack = "IntelHack";
+ bool askForJava = false;
+ do
+ {
+ QString currentHostName = QHostInfo::localHostName();
+ QString oldHostName = MMC->settings()->get("LastHostname").toString();
+ if (currentHostName != oldHostName)
+ {
+ MMC->settings()->set("LastHostname", currentHostName);
+ askForJava = true;
+ break;
+ }
+ QString currentJavaPath = MMC->settings()->get("JavaPath").toString();
+ if (currentJavaPath.isEmpty())
+ {
+ askForJava = true;
+ break;
+ }
+ if(!currentJavaPath.contains('/'))
+ {
+ currentJavaPath = QStandardPaths::findExecutable(currentJavaPath);
+ }
+ QFile currentJavaBin(currentJavaPath);
+ if(!currentJavaBin.exists())
+ {
+ askForJava = true;
+ break;
+ }
+ #if defined Q_OS_WIN32
+ QString currentHack = MMC->settings()->get("JavaDetectionHack").toString();
+ if (currentHack != javaHack)
+ {
+ CustomMessageBox::selectable(
+ this, tr("Java detection forced"),
+ tr("Because of graphics performance issues caused by Intel drivers on Windows, "
+ "MultiMC java detection was forced. Please select a Java "
+ "version.<br/><br/>If you have custom java versions set for your instances, "
+ "make sure you use the 'javaw.exe' executable."),
+ QMessageBox::Warning)->exec();
+ askForJava = true;
+ break;
+ }
+ #endif
+ } while (0);
+
+ if (askForJava)
+ {
+ qDebug() << "Java path needs resetting, showing Java selection dialog...";
+
+ JavaVersionPtr java;
+
+ VersionSelectDialog vselect(MMC->javalist().get(), tr("Select a Java version"), this,
+ false);
+ vselect.setResizeOn(2);
+ vselect.exec();
+
+ if (vselect.selectedVersion())
+ java = std::dynamic_pointer_cast<JavaVersion>(vselect.selectedVersion());
+ else
+ {
+ CustomMessageBox::selectable(
+ this, tr("Invalid version selected"),
+ tr("You didn't select a valid Java version, so MultiMC will "
+ "select the default. "
+ "You can change this in the settings dialog."),
+ QMessageBox::Warning)->show();
+
+ JavaUtils ju;
+ java = ju.GetDefaultJava();
+ }
+ if (java)
+ {
+ MMC->settings()->set("JavaPath", java->path);
+ MMC->settings()->set("JavaDetectionHack", javaHack);
+ }
+ else
+ MMC->settings()->set("JavaPath", QString("java"));
+ }
+}
+
+void MainWindow::checkInstancePathForProblems()
+{
+ QString instanceFolder = MMC->settings()->get("InstanceDir").toString();
+ if (checkProblemticPathJava(QDir(instanceFolder)))
+ {
+ QMessageBox warning;
+ warning.setText(tr(
+ "Your instance folder contains \'!\' and this is known to cause Java problems!"));
+ warning.setInformativeText(
+ tr("You have now three options: <br/>"
+ " - ignore this warning <br/>"
+ " - change the instance dir in the settings <br/>"
+ " - move this installation of MultiMC5 to a different folder"));
+ warning.setDefaultButton(QMessageBox::Ok);
+ warning.exec();
+ }
+}
diff --git a/application/MainWindow.h b/application/MainWindow.h
new file mode 100644
index 00000000..96d9c7bb
--- /dev/null
+++ b/application/MainWindow.h
@@ -0,0 +1,218 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QMainWindow>
+#include <QProcess>
+#include <QTimer>
+
+#include "BaseInstance.h"
+#include "auth/MojangAccount.h"
+#include "net/NetJob.h"
+#include "updater/GoUpdate.h"
+
+class NewsChecker;
+class NotificationChecker;
+class QToolButton;
+class InstanceProxyModel;
+class LabeledToolButton;
+class QLabel;
+class MinecraftProcess;
+class ConsoleWindow;
+class BaseProfilerFactory;
+class GenericPageProvider;
+
+namespace Ui
+{
+class MainWindow;
+}
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ explicit MainWindow(QWidget *parent = 0);
+ ~MainWindow();
+
+ void closeEvent(QCloseEvent *event);
+
+ // Browser Dialog
+ void openWebPage(QUrl url);
+
+ void checkSetDefaultJava();
+ void checkInstancePathForProblems();
+
+private
+slots:
+ void onCatToggled(bool);
+
+ void on_actionAbout_triggered();
+
+ void on_actionAddInstance_triggered();
+
+ void on_actionCopyInstance_triggered();
+
+ void on_actionChangeInstGroup_triggered();
+
+ void on_actionChangeInstIcon_triggered();
+
+ void on_actionViewInstanceFolder_triggered();
+
+ void on_actionConfig_Folder_triggered();
+
+ void on_actionViewSelectedInstFolder_triggered();
+
+ void on_actionRefresh_triggered();
+
+ void on_actionViewCentralModsFolder_triggered();
+
+ void on_actionCheckUpdate_triggered();
+
+ void on_actionSettings_triggered();
+
+ void on_actionInstanceSettings_triggered();
+
+ void on_actionManageAccounts_triggered();
+
+ void on_actionReportBug_triggered();
+
+ void on_actionPatreon_triggered();
+
+ void on_actionMoreNews_triggered();
+
+ void newsButtonClicked();
+
+ void on_mainToolBar_visibilityChanged(bool);
+
+ // void on_instanceView_customContextMenuRequested(const QPoint &pos);
+
+ void on_actionLaunchInstance_triggered();
+
+ void on_actionLaunchInstanceOffline_triggered();
+
+ void on_actionDeleteInstance_triggered();
+
+ void on_actionExportInstance_triggered();
+
+ void on_actionRenameInstance_triggered();
+
+ void on_actionEditInstance_triggered();
+
+ void on_actionEditInstNotes_triggered();
+
+ void on_actionScreenshots_triggered();
+
+ /*!
+ * Launches the currently selected instance with the default account.
+ * If no default account is selected, prompts the user to pick an account.
+ */
+ void doLaunch(bool online = true, BaseProfilerFactory *profiler = 0);
+
+ /*!
+ * Launches the given instance with the given account.
+ * This function assumes that the given account has a valid, usable access token.
+ */
+ void launchInstance(InstancePtr instance, AuthSessionPtr session, BaseProfilerFactory *profiler = 0);
+
+ /*!
+ * Prepares the given instance for launch with the given account.
+ */
+ void updateInstance(InstancePtr instance, AuthSessionPtr account, BaseProfilerFactory *profiler = 0);
+
+ void onGameUpdateError(QString error);
+
+ void taskStart();
+ void taskEnd();
+
+ void instanceEnded();
+
+ // called when an icon is changed in the icon model.
+ void iconUpdated(QString);
+
+ void showInstanceContextMenu(const QPoint &);
+
+ void updateToolsMenu();
+
+ void skinJobFinished();
+public
+slots:
+ void instanceActivated(QModelIndex);
+
+ void instanceChanged(const QModelIndex &current, const QModelIndex &previous);
+
+ void selectionBad();
+
+ void startTask(Task *task);
+
+ void updateAvailable(GoUpdate::Status status);
+
+ void updateNotAvailable();
+
+ void notificationsChanged();
+
+ void activeAccountChanged();
+
+ void changeActiveAccount();
+
+ void repopulateAccountsMenu();
+
+ void updateNewsLabel();
+
+ /*!
+ * Runs the DownloadTask and installs updates.
+ */
+ void downloadUpdates(GoUpdate::Status status, bool installOnExit = false);
+
+protected:
+ bool eventFilter(QObject *obj, QEvent *ev);
+ void setCatBackground(bool enabled);
+ void updateInstanceToolIcon(QString new_icon);
+
+ void setSelectedInstanceById(const QString &id);
+
+ void waitForMinecraftVersions();
+ void instanceFromVersion(QString instName, QString instGroup, QString instIcon, BaseVersionPtr version);
+ void instanceFromZipPack(QString instName, QString instGroup, QString instIcon, QUrl url);
+ void finalizeInstance(InstancePtr inst);
+
+private:
+ Ui::MainWindow *ui;
+ class GroupView *view;
+ InstanceProxyModel *proxymodel;
+ NetJobPtr skin_download_job;
+ MinecraftProcess *proc;
+ ConsoleWindow *console;
+ LabeledToolButton *renameButton;
+ QToolButton *changeIconButton;
+ QToolButton *newsLabel;
+
+ std::shared_ptr<GenericPageProvider> m_globalSettingsProvider;
+ std::shared_ptr<NewsChecker> m_newsChecker;
+ std::shared_ptr<NotificationChecker> m_notificationChecker;
+
+ InstancePtr m_selectedInstance;
+ QString m_currentInstIcon;
+
+ Task *m_versionLoadTask;
+
+ QLabel *m_statusLeft;
+ class ServerStatus *m_statusRight;
+
+ QMenu *accountMenu;
+ QToolButton *accountMenuButton;
+ QAction *manageAccountsAction;
+};
diff --git a/application/MultiMC.cpp b/application/MultiMC.cpp
new file mode 100644
index 00000000..ba6d7880
--- /dev/null
+++ b/application/MultiMC.cpp
@@ -0,0 +1,632 @@
+#include "MultiMC.h"
+#include "BuildConfig.h"
+
+#include <iostream>
+#include <QDir>
+#include <QFileInfo>
+#include <QNetworkAccessManager>
+#include <QTranslator>
+#include <QLibraryInfo>
+#include <QMessageBox>
+#include <QStringList>
+#include <QDesktopServices>
+#include <QDebug>
+
+#include "dialogs/VersionSelectDialog.h"
+#include "InstanceList.h"
+#include "auth/MojangAccountList.h"
+#include "icons/IconList.h"
+#include "minecraft/LwjglVersionList.h"
+#include "minecraft/MinecraftVersionList.h"
+#include "liteloader/LiteLoaderVersionList.h"
+
+#include "forge/ForgeVersionList.h"
+
+#include "net/HttpMetaCache.h"
+#include "net/URLConstants.h"
+#include "Env.h"
+
+#include "java/JavaUtils.h"
+
+#include "updater/UpdateChecker.h"
+
+#include "tools/JProfiler.h"
+#include "tools/JVisualVM.h"
+#include "tools/MCEditTool.h"
+
+#include "pathutils.h"
+#include "cmdutils.h"
+#include <xdgicon.h>
+#include "settings/INISettingsObject.h"
+#include "settings/Setting.h"
+
+#include "trans/TranslationDownloader.h"
+
+#include "ftb/FTBPlugin.h"
+
+using namespace Util::Commandline;
+
+MultiMC::MultiMC(int &argc, char **argv, bool test_mode) : QApplication(argc, argv)
+{
+ setOrganizationName("MultiMC");
+ setApplicationName("MultiMC5");
+
+ startTime = QDateTime::currentDateTime();
+
+ setAttribute(Qt::AA_UseHighDpiPixmaps);
+ // Don't quit on hiding the last window
+ this->setQuitOnLastWindowClosed(false);
+
+ // Commandline parsing
+ QHash<QString, QVariant> args;
+ {
+ Parser parser(FlagStyle::GNU, ArgumentStyle::SpaceAndEquals);
+
+ // --help
+ parser.addSwitch("help");
+ parser.addShortOpt("help", 'h');
+ parser.addDocumentation("help", "display this help and exit.");
+ // --version
+ parser.addSwitch("version");
+ parser.addShortOpt("version", 'V');
+ parser.addDocumentation("version", "display program version and exit.");
+ // --dir
+ parser.addOption("dir", applicationDirPath());
+ parser.addShortOpt("dir", 'd');
+ parser.addDocumentation("dir", "use the supplied directory as MultiMC root instead of "
+ "the binary location (use '.' for current)");
+
+ // parse the arguments
+ try
+ {
+ args = parser.parse(arguments());
+ }
+ catch (ParsingError e)
+ {
+ std::cerr << "CommandLineError: " << e.what() << std::endl;
+ std::cerr << "Try '%1 -h' to get help on MultiMC's command line parameters."
+ << std::endl;
+ m_status = MultiMC::Failed;
+ return;
+ }
+
+ // display help and exit
+ if (args["help"].toBool())
+ {
+ std::cout << qPrintable(parser.compileHelp(arguments()[0]));
+ m_status = MultiMC::Succeeded;
+ return;
+ }
+
+ // display version and exit
+ if (args["version"].toBool())
+ {
+ std::cout << "Version " << BuildConfig.VERSION_STR.toStdString() << std::endl;
+ std::cout << "Git " << BuildConfig.GIT_COMMIT.toStdString() << std::endl;
+ m_status = MultiMC::Succeeded;
+ return;
+ }
+ }
+
+ QString origcwdPath = QDir::currentPath();
+ QString binPath = applicationDirPath();
+ QString adjustedBy;
+ // change directory
+ QString dirParam = args["dir"].toString();
+ if (!dirParam.isEmpty())
+ {
+ // the dir param. it makes multimc data path point to whatever the user specified
+ // on command line
+ adjustedBy += "Command line " + dirParam;
+ dataPath = dirParam;
+ }
+ else
+ {
+ dataPath = applicationDirPath();
+ adjustedBy += "Fallback to binary path " + dataPath;
+ }
+
+ if (!ensureFolderPathExists(dataPath) || !QDir::setCurrent(dataPath))
+ {
+ // BAD STUFF. WHAT DO?
+ initLogger();
+ qCritical() << "Failed to set work path. Will exit. NOW.";
+ m_status = MultiMC::Failed;
+ return;
+ }
+
+ // in test mode, root path is the same as the binary path.
+ if (test_mode)
+ {
+ rootPath = binPath;
+ }
+ else
+ {
+#ifdef Q_OS_LINUX
+ QDir foo(PathCombine(binPath, ".."));
+ rootPath = foo.absolutePath();
+#elif defined(Q_OS_WIN32)
+ rootPath = binPath;
+#elif defined(Q_OS_MAC)
+ QDir foo(PathCombine(binPath, "../.."));
+ rootPath = foo.absolutePath();
+#endif
+ }
+
+// static data paths... mostly just for translations
+#ifdef Q_OS_LINUX
+ QDir foo(PathCombine(binPath, ".."));
+ staticDataPath = foo.absolutePath();
+#elif defined(Q_OS_WIN32)
+ staticDataPath = binPath;
+#elif defined(Q_OS_MAC)
+ QDir foo(PathCombine(rootPath, "Contents/Resources"));
+ staticDataPath = foo.absolutePath();
+#endif
+
+ // init the logger
+ initLogger();
+
+ qDebug() << "MultiMC 5, (c) 2013-2015 MultiMC Contributors";
+ qDebug() << "Version : " << BuildConfig.VERSION_STR;
+ qDebug() << "Git commit : " << BuildConfig.GIT_COMMIT;
+ if (adjustedBy.size())
+ {
+ qDebug() << "Work dir before adjustment : " << origcwdPath;
+ qDebug() << "Work dir after adjustment : " << QDir::currentPath();
+ qDebug() << "Adjusted by : " << adjustedBy;
+ }
+ else
+ {
+ qDebug() << "Work dir : " << QDir::currentPath();
+ }
+ qDebug() << "Binary path : " << binPath;
+ qDebug() << "Application root path : " << rootPath;
+ qDebug() << "Static data path : " << staticDataPath;
+
+ // load settings
+ initGlobalSettings(test_mode);
+
+ // load translations
+ initTranslations();
+
+ // initialize the updater
+ m_updateChecker.reset(new UpdateChecker(BuildConfig.CHANLIST_URL, BuildConfig.VERSION_CHANNEL, BuildConfig.VERSION_BUILD));
+
+ m_translationChecker.reset(new TranslationDownloader());
+
+ // load icons
+ initIcons();
+
+ // and instances
+ auto InstDirSetting = m_settings->getSetting("InstanceDir");
+ // instance path: check for problems with '!' in instance path and warn the user in the log
+ // and rememer that we have to show him a dialog when the gui starts (if it does so)
+ QString instDir = m_settings->get("InstanceDir").toString();
+ qDebug() << "Instance path : " << instDir;
+ if (checkProblemticPathJava(QDir(instDir)))
+ {
+ qWarning()
+ << "Your instance path contains \'!\' and this is known to cause java problems";
+ }
+ m_instances.reset(new InstanceList(m_settings, InstDirSetting->get().toString(), this));
+ qDebug() << "Loading Instances...";
+ m_instances->loadList();
+ connect(InstDirSetting.get(), SIGNAL(SettingChanged(const Setting &, QVariant)),
+ m_instances.get(), SLOT(on_InstFolderChanged(const Setting &, QVariant)));
+
+ // and accounts
+ m_accounts.reset(new MojangAccountList(this));
+ qDebug() << "Loading accounts...";
+ m_accounts->setListFilePath("accounts.json", true);
+ m_accounts->loadList();
+
+ // init the http meta cache
+ ENV.initHttpMetaCache(rootPath, staticDataPath);
+
+ // create the global network manager
+ ENV.m_qnam.reset(new QNetworkAccessManager(this));
+
+ // init proxy settings
+ {
+ QString proxyTypeStr = settings()->get("ProxyType").toString();
+ QString addr = settings()->get("ProxyAddr").toString();
+ int port = settings()->get("ProxyPort").value<qint16>();
+ QString user = settings()->get("ProxyUser").toString();
+ QString pass = settings()->get("ProxyPass").toString();
+ ENV.updateProxySettings(proxyTypeStr, addr, port, user, pass);
+ }
+
+ m_translationChecker->downloadTranslations();
+
+ //FIXME: what to do with these?
+ m_profilers.insert("jprofiler",
+ std::shared_ptr<BaseProfilerFactory>(new JProfilerFactory()));
+ m_profilers.insert("jvisualvm",
+ std::shared_ptr<BaseProfilerFactory>(new JVisualVMFactory()));
+ for (auto profiler : m_profilers.values())
+ {
+ profiler->registerSettings(m_settings);
+ }
+
+ //FIXME: what to do with these?
+ m_tools.insert("mcedit", std::shared_ptr<BaseDetachedToolFactory>(new MCEditFactory()));
+ for (auto tool : m_tools.values())
+ {
+ tool->registerSettings(m_settings);
+ }
+
+ connect(this, SIGNAL(aboutToQuit()), SLOT(onExit()));
+ m_status = MultiMC::Initialized;
+}
+
+MultiMC::~MultiMC()
+{
+ if (m_mmc_translator)
+ {
+ removeTranslator(m_mmc_translator.get());
+ }
+ if (m_qt_translator)
+ {
+ removeTranslator(m_qt_translator.get());
+ }
+}
+
+void MultiMC::initTranslations()
+{
+ QLocale locale(m_settings->get("Language").toString());
+ QLocale::setDefault(locale);
+ qDebug() << "Your language is" << locale.bcp47Name();
+ m_qt_translator.reset(new QTranslator());
+ if (m_qt_translator->load("qt_" + locale.bcp47Name(),
+ QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
+ {
+ qDebug() << "Loading Qt Language File for"
+ << locale.bcp47Name().toLocal8Bit().constData() << "...";
+ if (!installTranslator(m_qt_translator.get()))
+ {
+ qCritical() << "Loading Qt Language File failed.";
+ m_qt_translator.reset();
+ }
+ }
+ else
+ {
+ m_qt_translator.reset();
+ }
+
+ m_mmc_translator.reset(new QTranslator());
+ if (m_mmc_translator->load("mmc_" + locale.bcp47Name(), staticDataPath + "/translations"))
+ {
+ qDebug() << "Loading MMC Language File for"
+ << locale.bcp47Name().toLocal8Bit().constData() << "...";
+ if (!installTranslator(m_mmc_translator.get()))
+ {
+ qCritical() << "Loading MMC Language File failed.";
+ m_mmc_translator.reset();
+ }
+ }
+ else
+ {
+ m_mmc_translator.reset();
+ }
+}
+
+void MultiMC::initIcons()
+{
+ auto setting = MMC->settings()->getSetting("IconsDir");
+ ENV.m_icons.reset(new IconList(QString(":/icons/instances/"), setting->get().toString()));
+ connect(setting.get(), &Setting::SettingChanged,[&](const Setting &, QVariant value)
+ {
+ ENV.m_icons->directoryChanged(value.toString());
+ });
+}
+
+
+void moveFile(const QString &oldName, const QString &newName)
+{
+ QFile::remove(newName);
+ QFile::copy(oldName, newName);
+ QFile::remove(oldName);
+}
+
+
+void appDebugOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
+{
+ const char *levels = "DWCF";
+ const QString format("%1 %2 %3\n");
+
+ qint64 msecstotal = MMC->timeSinceStart();
+ qint64 seconds = msecstotal / 1000;
+ qint64 msecs = msecstotal % 1000;
+ QString foo;
+ char buf[1025] = {0};
+ ::snprintf(buf, 1024, "%5lld.%03lld", seconds, msecs);
+
+ QString out = format.arg(buf).arg(levels[type]).arg(msg);
+
+ MMC->logFile->write(out.toUtf8());
+ MMC->logFile->flush();
+ QTextStream(stderr) << out.toLocal8Bit();
+ fflush(stderr);
+}
+
+void MultiMC::initLogger()
+{
+ static const QString logBase = "MultiMC-%0.log";
+
+ moveFile(logBase.arg(3), logBase.arg(4));
+ moveFile(logBase.arg(2), logBase.arg(3));
+ moveFile(logBase.arg(1), logBase.arg(2));
+ moveFile(logBase.arg(0), logBase.arg(1));
+
+ qInstallMessageHandler(appDebugOutput);
+
+ logFile = std::make_shared<QFile>(logBase.arg(0));
+ logFile->open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate);
+}
+
+void MultiMC::initGlobalSettings(bool test_mode)
+{
+ m_settings.reset(new INISettingsObject("multimc.cfg", this));
+ // Updates
+ m_settings->registerSetting("UpdateChannel", BuildConfig.VERSION_CHANNEL);
+ m_settings->registerSetting("AutoUpdate", true);
+ m_settings->registerSetting("IconTheme", QString("multimc"));
+
+ // Notifications
+ m_settings->registerSetting("ShownNotifications", QString());
+
+ // Remembered state
+ m_settings->registerSetting("LastUsedGroupForNewInstance", QString());
+
+ QString defaultMonospace;
+ int defaultSize = 11;
+#ifdef Q_OS_WIN32
+ defaultMonospace = "Courier";
+ defaultSize = 10;
+#elif defined(Q_OS_MAC)
+ defaultMonospace = "Menlo";
+#else
+ defaultMonospace = "Monospace";
+#endif
+ if(!test_mode)
+ {
+ // resolve the font so the default actually matches
+ QFont consoleFont;
+ consoleFont.setFamily(defaultMonospace);
+ consoleFont.setStyleHint(QFont::Monospace);
+ consoleFont.setFixedPitch(true);
+ QFontInfo consoleFontInfo(consoleFont);
+ QString resolvedDefaultMonospace = consoleFontInfo.family();
+ QFont resolvedFont(resolvedDefaultMonospace);
+ qDebug() << "Detected default console font:" << resolvedDefaultMonospace
+ << ", substitutions:" << resolvedFont.substitutions().join(',');
+ m_settings->registerSetting("ConsoleFont", resolvedDefaultMonospace);
+ }
+ else
+ {
+ // in test mode, we don't have UI, so we don't do any font resolving
+ m_settings->registerSetting("ConsoleFont", defaultMonospace);
+ }
+ m_settings->registerSetting("ConsoleFontSize", defaultSize);
+
+ FTBPlugin::initialize(m_settings);
+
+ // Folders
+ m_settings->registerSetting("InstanceDir", "instances");
+ m_settings->registerSetting({"CentralModsDir", "ModsDir"}, "mods");
+ m_settings->registerSetting({"LWJGLDir", "LwjglDir"}, "lwjgl");
+ m_settings->registerSetting("IconsDir", "icons");
+
+ // Editors
+ m_settings->registerSetting("JsonEditor", QString());
+
+ // Language
+ m_settings->registerSetting("Language", QLocale(QLocale::system().language()).bcp47Name());
+
+ // Console
+ m_settings->registerSetting("ShowConsole", true);
+ m_settings->registerSetting("RaiseConsole", true);
+ m_settings->registerSetting("AutoCloseConsole", true);
+ m_settings->registerSetting("LogPrePostOutput", true);
+
+ // Console Colors
+ // m_settings->registerSetting("SysMessageColor", QColor(Qt::blue));
+ // m_settings->registerSetting("StdOutColor", QColor(Qt::black));
+ // m_settings->registerSetting("StdErrColor", QColor(Qt::red));
+
+ // Window Size
+ m_settings->registerSetting({"LaunchMaximized", "MCWindowMaximize"}, false);
+ m_settings->registerSetting({"MinecraftWinWidth", "MCWindowWidth"}, 854);
+ m_settings->registerSetting({"MinecraftWinHeight", "MCWindowHeight"}, 480);
+
+ // Proxy Settings
+ m_settings->registerSetting("ProxyType", "None");
+ m_settings->registerSetting({"ProxyAddr", "ProxyHostName"}, "127.0.0.1");
+ m_settings->registerSetting("ProxyPort", 8080);
+ m_settings->registerSetting({"ProxyUser", "ProxyUsername"}, "");
+ m_settings->registerSetting({"ProxyPass", "ProxyPassword"}, "");
+
+ // Memory
+ m_settings->registerSetting({"MinMemAlloc", "MinMemoryAlloc"}, 512);
+ m_settings->registerSetting({"MaxMemAlloc", "MaxMemoryAlloc"}, 1024);
+ m_settings->registerSetting("PermGen", 128);
+
+ // Java Settings
+ m_settings->registerSetting("JavaPath", "");
+ m_settings->registerSetting("LastHostname", "");
+ m_settings->registerSetting("JavaDetectionHack", "");
+ m_settings->registerSetting("JvmArgs", "");
+
+ // Custom Commands
+ m_settings->registerSetting({"PreLaunchCommand", "PreLaunchCmd"}, "");
+ m_settings->registerSetting({"PostExitCommand", "PostExitCmd"}, "");
+
+ // The cat
+ m_settings->registerSetting("TheCat", false);
+
+ m_settings->registerSetting("InstSortMode", "Name");
+ m_settings->registerSetting("SelectedInstance", QString());
+
+ // Window state and geometry
+ m_settings->registerSetting("MainWindowState", "");
+ m_settings->registerSetting("MainWindowGeometry", "");
+
+ m_settings->registerSetting("ConsoleWindowState", "");
+ m_settings->registerSetting("ConsoleWindowGeometry", "");
+
+ m_settings->registerSetting("SettingsGeometry", "");
+
+ m_settings->registerSetting("PagedGeometry", "");
+}
+
+std::shared_ptr<LWJGLVersionList> MultiMC::lwjgllist()
+{
+ if (!m_lwjgllist)
+ {
+ m_lwjgllist.reset(new LWJGLVersionList());
+ ENV.registerVersionList("org.lwjgl.legacy", m_lwjgllist);
+ }
+ return m_lwjgllist;
+}
+
+std::shared_ptr<ForgeVersionList> MultiMC::forgelist()
+{
+ if (!m_forgelist)
+ {
+ m_forgelist.reset(new ForgeVersionList());
+ ENV.registerVersionList("net.minecraftforge", m_forgelist);
+ }
+ return m_forgelist;
+}
+
+std::shared_ptr<LiteLoaderVersionList> MultiMC::liteloaderlist()
+{
+ if (!m_liteloaderlist)
+ {
+ m_liteloaderlist.reset(new LiteLoaderVersionList());
+ ENV.registerVersionList("com.mumfrey.liteloader", m_liteloaderlist);
+ }
+ return m_liteloaderlist;
+}
+
+std::shared_ptr<MinecraftVersionList> MultiMC::minecraftlist()
+{
+ if (!m_minecraftlist)
+ {
+ m_minecraftlist.reset(new MinecraftVersionList());
+ ENV.registerVersionList("net.minecraft", m_minecraftlist);
+ }
+ return m_minecraftlist;
+}
+
+std::shared_ptr<JavaVersionList> MultiMC::javalist()
+{
+ if (!m_javalist)
+ {
+ m_javalist.reset(new JavaVersionList());
+ ENV.registerVersionList("com.java", m_javalist);
+ }
+ return m_javalist;
+}
+
+void MultiMC::installUpdates(const QString updateFilesDir, UpdateFlags flags)
+{
+ // if we are going to update on exit, save the params now
+ if (flags & OnExit)
+ {
+ m_updateOnExitPath = updateFilesDir;
+ m_updateOnExitFlags = flags & ~OnExit;
+ return;
+ }
+ // otherwise if there already were some params for on exit update, clear them and continue
+ else if (m_updateOnExitPath.size())
+ {
+ m_updateOnExitFlags = None;
+ m_updateOnExitPath.clear();
+ }
+ qDebug() << "Installing updates.";
+#ifdef WINDOWS
+ QString finishCmd = applicationFilePath();
+ QString updaterBinary = PathCombine(applicationDirPath(), "updater.exe");
+#elif LINUX
+ QString finishCmd = PathCombine(root(), "MultiMC");
+ QString updaterBinary = PathCombine(applicationDirPath(), "updater");
+#elif OSX
+ QString finishCmd = applicationFilePath();
+ QString updaterBinary = PathCombine(applicationDirPath(), "updater");
+#else
+#error Unsupported operating system.
+#endif
+
+ QStringList args;
+ // ./updater --install-dir $INSTALL_DIR --package-dir $UPDATEFILES_DIR --script
+ // $UPDATEFILES_DIR/file_list.xml --wait $PID --mode main
+ args << "--install-dir" << root();
+ args << "--package-dir" << updateFilesDir;
+ args << "--script" << PathCombine(updateFilesDir, "file_list.xml");
+ args << "--wait" << QString::number(applicationPid());
+ if (flags & DryRun)
+ args << "--dry-run";
+ if (flags & RestartOnFinish)
+ {
+ args << "--finish-cmd" << finishCmd;
+ args << "--finish-dir" << dataPath;
+ }
+ qDebug() << "Running updater with command" << updaterBinary << args.join(" ");
+ QFile::setPermissions(updaterBinary, (QFileDevice::Permission)0x7755);
+
+ if (!QProcess::startDetached(updaterBinary, args /*, root()*/))
+ {
+ qCritical() << "Failed to start the updater process!";
+ return;
+ }
+
+ ENV.destroy();
+ // Now that we've started the updater, quit MultiMC.
+ quit();
+}
+
+void MultiMC::setIconTheme(const QString& name)
+{
+ XdgIcon::setThemeName(name);
+}
+
+QIcon MultiMC::getThemedIcon(const QString& name)
+{
+ return XdgIcon::fromTheme(name);
+}
+
+void MultiMC::onExit()
+{
+ if(m_instances)
+ {
+ m_instances->saveGroupList();
+ }
+ if (m_updateOnExitPath.size())
+ {
+ installUpdates(m_updateOnExitPath, m_updateOnExitFlags);
+ }
+ ENV.destroy();
+ if(logFile)
+ {
+ logFile->flush();
+ logFile->close();
+ }
+}
+
+bool MultiMC::openJsonEditor(const QString &filename)
+{
+ const QString file = QDir::current().absoluteFilePath(filename);
+ if (m_settings->get("JsonEditor").toString().isEmpty())
+ {
+ return QDesktopServices::openUrl(QUrl::fromLocalFile(file));
+ }
+ else
+ {
+ return QProcess::startDetached(m_settings->get("JsonEditor").toString(), QStringList()
+ << file);
+ }
+}
+
+#include "MultiMC.moc"
diff --git a/application/MultiMC.h b/application/MultiMC.h
new file mode 100644
index 00000000..b78bbbd2
--- /dev/null
+++ b/application/MultiMC.h
@@ -0,0 +1,188 @@
+#pragma once
+
+#include <QApplication>
+#include <memory>
+#include <QDebug>
+#include <QFlag>
+#include <QIcon>
+#include <QDateTime>
+
+class QFile;
+class MinecraftVersionList;
+class LWJGLVersionList;
+class HttpMetaCache;
+class SettingsObject;
+class InstanceList;
+class MojangAccountList;
+class IconList;
+class QNetworkAccessManager;
+class ForgeVersionList;
+class LiteLoaderVersionList;
+class JavaVersionList;
+class UpdateChecker;
+class BaseProfilerFactory;
+class BaseDetachedToolFactory;
+class TranslationDownloader;
+
+#if defined(MMC)
+#undef MMC
+#endif
+#define MMC (static_cast<MultiMC *>(QCoreApplication::instance()))
+
+enum UpdateFlag
+{
+ None = 0x0,
+ RestartOnFinish = 0x1,
+ DryRun = 0x2,
+ OnExit = 0x4
+};
+Q_DECLARE_FLAGS(UpdateFlags, UpdateFlag);
+Q_DECLARE_OPERATORS_FOR_FLAGS(UpdateFlags);
+
+class MultiMC : public QApplication
+{
+ // friends for the purpose of limiting access to deprecated stuff
+ friend class MultiMCPage;
+ friend class MainWindow;
+ Q_OBJECT
+public:
+ enum Status
+ {
+ Failed,
+ Succeeded,
+ Initialized
+ };
+
+public:
+ MultiMC(int &argc, char **argv, bool test_mode = false);
+ virtual ~MultiMC();
+
+ // InstanceList, IconList, OneSixFTBInstance, LegacyUpdate, LegacyInstance, MCEditTool, JVisualVM, MinecraftInstance, JProfiler, BaseInstance
+ std::shared_ptr<SettingsObject> settings()
+ {
+ return m_settings;
+ }
+
+ qint64 timeSinceStart() const
+ {
+ return startTime.msecsTo(QDateTime::currentDateTime());
+ }
+
+ QIcon getThemedIcon(const QString& name);
+
+ void setIconTheme(const QString& name);
+
+ // DownloadUpdateTask
+ std::shared_ptr<UpdateChecker> updateChecker()
+ {
+ return m_updateChecker;
+ }
+
+ std::shared_ptr<MinecraftVersionList> minecraftlist();
+ std::shared_ptr<LWJGLVersionList> lwjgllist();
+ std::shared_ptr<ForgeVersionList> forgelist();
+ std::shared_ptr<LiteLoaderVersionList> liteloaderlist();
+ std::shared_ptr<JavaVersionList> javalist();
+
+ // APPLICATION ONLY
+ std::shared_ptr<InstanceList> instances()
+ {
+ return m_instances;
+ }
+
+ // APPLICATION ONLY
+ std::shared_ptr<MojangAccountList> accounts()
+ {
+ return m_accounts;
+ }
+
+ // APPLICATION ONLY
+ Status status()
+ {
+ return m_status;
+ }
+
+ // APPLICATION ONLY
+ QMap<QString, std::shared_ptr<BaseProfilerFactory>> profilers()
+ {
+ return m_profilers;
+ }
+
+ // APPLICATION ONLY
+ QMap<QString, std::shared_ptr<BaseDetachedToolFactory>> tools()
+ {
+ return m_tools;
+ }
+
+ // APPLICATION ONLY
+ void installUpdates(const QString updateFilesDir, UpdateFlags flags = None);
+
+ /*!
+ * Opens a json file using either a system default editor, or, if note empty, the editor
+ * specified in the settings
+ */
+ bool openJsonEditor(const QString &filename);
+
+protected: /* to be removed! */
+ // FIXME: remove. used by MultiMCPage to enumerate translations.
+ /// this is the static data. it stores things that don't move.
+ const QString &staticData()
+ {
+ return staticDataPath;
+ }
+
+ // FIXME: remove. used by MainWindow to create application update tasks
+ /// this is the root of the 'installation'. Used for automatic updates
+ const QString &root()
+ {
+ return rootPath;
+ }
+
+private slots:
+ /**
+ * Do all the things that should be done before we exit
+ */
+ void onExit();
+
+private:
+ void initLogger();
+
+ void initIcons();
+
+ void initGlobalSettings(bool test_mode);
+
+ void initTranslations();
+
+private:
+ friend class UpdateCheckerTest;
+ friend class DownloadTaskTest;
+
+ QDateTime startTime;
+
+ std::shared_ptr<QTranslator> m_qt_translator;
+ std::shared_ptr<QTranslator> m_mmc_translator;
+ std::shared_ptr<SettingsObject> m_settings;
+ std::shared_ptr<InstanceList> m_instances;
+ std::shared_ptr<UpdateChecker> m_updateChecker;
+ std::shared_ptr<MojangAccountList> m_accounts;
+ std::shared_ptr<LWJGLVersionList> m_lwjgllist;
+ std::shared_ptr<ForgeVersionList> m_forgelist;
+ std::shared_ptr<LiteLoaderVersionList> m_liteloaderlist;
+ std::shared_ptr<MinecraftVersionList> m_minecraftlist;
+ std::shared_ptr<JavaVersionList> m_javalist;
+ std::shared_ptr<TranslationDownloader> m_translationChecker;
+
+ QMap<QString, std::shared_ptr<BaseProfilerFactory>> m_profilers;
+ QMap<QString, std::shared_ptr<BaseDetachedToolFactory>> m_tools;
+
+ QString m_updateOnExitPath;
+ UpdateFlags m_updateOnExitFlags = None;
+
+ QString rootPath;
+ QString staticDataPath;
+ QString dataPath;
+
+ Status m_status = MultiMC::Failed;
+public:
+ std::shared_ptr<QFile> logFile;
+};
diff --git a/application/NagUtils.cpp b/application/NagUtils.cpp
new file mode 100644
index 00000000..41e2f63e
--- /dev/null
+++ b/application/NagUtils.cpp
@@ -0,0 +1,38 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "NagUtils.h"
+#include "dialogs/CustomMessageBox.h"
+
+namespace NagUtils
+{
+void checkJVMArgs(QString jvmargs, QWidget *parent)
+{
+ if (jvmargs.contains("-XX:PermSize=") || jvmargs.contains(QRegExp("-Xm[sx]")))
+ {
+ CustomMessageBox::selectable(
+ parent, QObject::tr("JVM arguments warning"),
+ QObject::tr("You tried to manually set a JVM memory option (using "
+ " \"-XX:PermSize\", \"-Xmx\" or \"-Xms\") - there"
+ " are dedicated boxes for these in the settings (Java"
+ " tab, in the Memory group at the top).\n"
+ "Your manual settings will be overridden by the"
+ " dedicated options.\n"
+ "This message will be displayed until you remove them"
+ " from the JVM arguments."),
+ QMessageBox::Warning)->exec();
+ }
+}
+}
diff --git a/application/NagUtils.h b/application/NagUtils.h
new file mode 100644
index 00000000..d757703a
--- /dev/null
+++ b/application/NagUtils.h
@@ -0,0 +1,23 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+namespace NagUtils
+{
+void checkJVMArgs(QString args, QWidget *parent);
+}
diff --git a/application/Platform.h b/application/Platform.h
new file mode 100644
index 00000000..349e5ecc
--- /dev/null
+++ b/application/Platform.h
@@ -0,0 +1,32 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Authors: Orochimarufan <orochimarufan.x3@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+/**
+ * @file Platform.h
+ * This file contains platform-specific functions, tweaks and fixes.
+ */
+
+#include <QWidget>
+
+class MultiMCPlatform
+{
+public:
+ // X11 WM_CLASS
+ static void fixWM_CLASS(QWidget *widget);
+};
diff --git a/application/Platform_Other.cpp b/application/Platform_Other.cpp
new file mode 100644
index 00000000..7eaf91d4
--- /dev/null
+++ b/application/Platform_Other.cpp
@@ -0,0 +1,27 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Authors: Orochimarufan <orochimarufan.x3@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Platform.h>
+/**
+ * Stub for non-X11 platforms
+ * @brief MultiMCPlatform::fixWM_CLASS
+ * @param widget
+ */
+void MultiMCPlatform::fixWM_CLASS(QWidget *widget)
+{
+ Q_UNUSED(widget);
+}
diff --git a/application/Platform_X11.cpp b/application/Platform_X11.cpp
new file mode 100644
index 00000000..baca15dd
--- /dev/null
+++ b/application/Platform_X11.cpp
@@ -0,0 +1,62 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Authors: Orochimarufan <orochimarufan.x3@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Platform.h>
+#include <QtX11Extras/QX11Info>
+#include <xcb/xcb.h>
+
+static QByteArray WM_CLASS = "MultiMC5\0MultiMC5";
+
+template <typename... ArgTypes, typename... ArgTypes2>
+static inline unsigned int XcbCallVoid(xcb_void_cookie_t (*func)(xcb_connection_t *, ArgTypes...), ArgTypes2... args...)
+{
+ return func(QX11Info::connection(), args...).sequence;
+}
+
+static void getAtoms(size_t n, xcb_atom_t *atoms, const char *const names[], bool create)
+{
+ xcb_connection_t *conn = QX11Info::connection();
+ xcb_intern_atom_cookie_t *cookies = (xcb_intern_atom_cookie_t *)malloc(sizeof(xcb_intern_atom_cookie_t) * 2);
+ for (size_t i = 0; i < n; ++i)
+ cookies[i] = xcb_intern_atom(conn, create, strlen(names[i]), names[i]);
+ memset(atoms, 0, sizeof(xcb_atom_t) * n);
+ for (size_t i = 0; i < n; ++i)
+ {
+ xcb_intern_atom_reply_t *r = xcb_intern_atom_reply(conn, cookies[i], 0);
+ if (r)
+ {
+ atoms[i] = r->atom;
+ free(r);
+ }
+ }
+ free(cookies);
+}
+
+static inline xcb_atom_t getAtom(const char *name, bool create=false)
+{
+ xcb_atom_t atom;
+ getAtoms(1, &atom, &name, create);
+ return atom;
+}
+
+void MultiMCPlatform::fixWM_CLASS(QWidget *widget)
+{
+ static const xcb_atom_t atom = getAtom("WM_CLASS");
+ XcbCallVoid(xcb_change_property, XCB_PROP_MODE_REPLACE,
+ widget->winId(), atom, XCB_ATOM_STRING, 8, WM_CLASS.count(),
+ WM_CLASS.constData());
+}
diff --git a/application/dialogs/AboutDialog.cpp b/application/dialogs/AboutDialog.cpp
new file mode 100644
index 00000000..abcc76f2
--- /dev/null
+++ b/application/dialogs/AboutDialog.cpp
@@ -0,0 +1,127 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "AboutDialog.h"
+#include "ui_AboutDialog.h"
+#include <QIcon>
+#include "MultiMC.h"
+#include "Platform.h"
+#include "BuildConfig.h"
+
+#include <net/NetJob.h>
+
+// Credits
+// This is a hack, but I can't think of a better way to do this easily without screwing with QTextDocument...
+QString getCreditsHtml(QStringList patrons)
+{
+ QString creditsHtml = QObject::tr(
+ "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0//EN' 'http://www.w3.org/TR/REC-html40/strict.dtd'>"
+ "<html>"
+ ""
+ "<head>"
+ "<meta name='qrichtext' content='1' />"
+ "<style type='text/css'>"
+ "p { white-space: pre-wrap; margin-top:2px; margin-bottom:2px; }"
+ "</style>"
+ "</head>"
+ ""
+ "<body style=' font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;'>"
+ ""
+ "<h3>MultiMC Developers</h3>"
+ "<p>Andrew Okin &lt;<a href='mailto:forkk@forkk.net'>forkk@forkk.net</a>&gt;</p>"
+ "<p>Petr Mrázek &lt;<a href='mailto:peterix@gmail.com'>peterix@gmail.com</a>&gt;</p>"
+ "<p>Sky Welch &lt;<a href='mailto:multimc@bunnies.io'>multimc@bunnies.io</a>&gt;</p>"
+ "<p>Jan (02JanDal) &lt;<a href='mailto:02jandal@gmail.com'>02jandal@gmail.com</a>&gt;</p>"
+ ""
+ "<h3>With thanks to</h3>"
+ "<p>Orochimarufan &lt;<a href='mailto:orochimarufan.x3@gmail.com'>orochimarufan.x3@gmail.com</a>&gt;</p>"
+ "<p>TakSuyu &lt;<a href='mailto:taksuyu@gmail.com'>taksuyu@gmail.com</a>&gt;</p>"
+ "<p>Kilobyte &lt;<a href='mailto:stiepen22@gmx.de'>stiepen22@gmx.de</a>&gt;</p>"
+ "<p>Robotbrain &lt;<a href='https://twitter.com/skylordelros'>@skylordelros</a>&gt;</p>"
+ "<p>Rootbear75 &lt;<a href='https://twitter.com/rootbear75'>@rootbear75</a>&gt; (build server)</p>"
+ ""
+ "<h3>Patreon Patrons</h3>"
+ "%1"
+ ""
+ "</body>"
+ "</html>");
+ if (patrons.isEmpty())
+ return creditsHtml.arg(QObject::tr("<p>Loading...</p>"));
+ else
+ {
+ QString patronsStr;
+ for (QString patron : patrons)
+ {
+ patronsStr.append(QString("<p>%1</p>").arg(patron));
+ }
+
+ return creditsHtml.arg(patronsStr);
+ }
+}
+
+AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent), ui(new Ui::AboutDialog)
+{
+ MultiMCPlatform::fixWM_CLASS(this);
+ ui->setupUi(this);
+
+ QString chtml = getCreditsHtml(QStringList());
+ ui->creditsText->setHtml(chtml);
+
+ ui->urlLabel->setOpenExternalLinks(true);
+
+ ui->icon->setPixmap(MMC->getThemedIcon("multimc").pixmap(64));
+ ui->title->setText("MultiMC 5");
+
+ ui->versionLabel->setText(tr("Version") +": " + BuildConfig.printableVersionString());
+ ui->platformLabel->setText(tr("Platform") +": " + BuildConfig.BUILD_PLATFORM);
+
+ if (BuildConfig.VERSION_BUILD >= 0)
+ ui->buildNumLabel->setText(tr("Build Number") +": " + QString::number(BuildConfig.VERSION_BUILD));
+ else
+ ui->buildNumLabel->setVisible(false);
+
+ if (!BuildConfig.VERSION_CHANNEL.isEmpty())
+ ui->channelLabel->setText(tr("Channel") +": " + BuildConfig.VERSION_CHANNEL);
+ else
+ ui->channelLabel->setVisible(false);
+
+ connect(ui->closeButton, SIGNAL(clicked()), SLOT(close()));
+
+ connect(ui->aboutQt, &QPushButton::clicked, &QApplication::aboutQt);
+
+ loadPatronList();
+}
+
+AboutDialog::~AboutDialog()
+{
+ delete ui;
+}
+
+void AboutDialog::loadPatronList()
+{
+ NetJob* job = new NetJob("Patreon Patron List");
+ patronListDownload = ByteArrayDownload::make(QUrl("http://files.multimc.org/patrons.txt"));
+ job->addNetAction(patronListDownload);
+ connect(job, &NetJob::succeeded, this, &AboutDialog::patronListLoaded);
+ job->start();
+}
+
+void AboutDialog::patronListLoaded()
+{
+ QString patronListStr(patronListDownload->m_data);
+ QString html = getCreditsHtml(patronListStr.split("\n", QString::SkipEmptyParts));
+ ui->creditsText->setHtml(html);
+}
+
diff --git a/application/dialogs/AboutDialog.h b/application/dialogs/AboutDialog.h
new file mode 100644
index 00000000..1885e9c0
--- /dev/null
+++ b/application/dialogs/AboutDialog.h
@@ -0,0 +1,47 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QDialog>
+
+#include <net/ByteArrayDownload.h>
+
+namespace Ui
+{
+class AboutDialog;
+}
+
+class AboutDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit AboutDialog(QWidget *parent = 0);
+ ~AboutDialog();
+
+public
+slots:
+ /// Starts loading a list of Patreon patrons.
+ void loadPatronList();
+
+ /// Slot for when the patron list loads successfully.
+ void patronListLoaded();
+
+private:
+ Ui::AboutDialog *ui;
+
+ ByteArrayDownloadPtr patronListDownload;
+};
diff --git a/application/dialogs/AboutDialog.ui b/application/dialogs/AboutDialog.ui
new file mode 100644
index 00000000..2b5f8b78
--- /dev/null
+++ b/application/dialogs/AboutDialog.ui
@@ -0,0 +1,544 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AboutDialog</class>
+ <widget class="QDialog" name="AboutDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>707</width>
+ <height>593</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>450</width>
+ <height>400</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>About MultiMC</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="icon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>64</width>
+ <height>64</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>64</width>
+ <height>64</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QLabel" name="title">
+ <property name="font">
+ <font>
+ <pointsize>15</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>MultiMC 5</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolBox" name="toolBox">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="aboutPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>695</width>
+ <height>297</height>
+ </rect>
+ </property>
+ <attribute name="label">
+ <string>About</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QLabel" name="versionLabel">
+ <property name="text">
+ <string>Version:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="platformLabel">
+ <property name="text">
+ <string>Platform:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="buildNumLabel">
+ <property name="text">
+ <string>Build Number:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="channelLabel">
+ <property name="text">
+ <string>Channel:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="aboutLabel">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;MultiMC is a custom launcher that makes managing Minecraft easier by allowing you to have multiple instances of Minecraft at once.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="copyLabel">
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ <kerning>true</kerning>
+ </font>
+ </property>
+ <property name="text">
+ <string>© 2013-2015 MultiMC Contributors</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="urlLabel">
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;http://github.com/MultiMC/MultiMC5&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;http://github.com/MultiMC/MultiMC5&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="creditsPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>695</width>
+ <height>297</height>
+ </rect>
+ </property>
+ <attribute name="label">
+ <string>Credits</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QTextEdit" name="creditsText">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="html">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Oxygen-Sans'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::TextBrowserInteraction</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="translationInfo">
+ <property name="text">
+ <string extracomment="Hey, Translator, feel free to put credit to you here">No Language file loaded.</string>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="licensePage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>695</width>
+ <height>297</height>
+ </rect>
+ </property>
+ <attribute name="label">
+ <string>License</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <item>
+ <widget class="QTextEdit" name="licenseText">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <family>DejaVu Sans Mono</family>
+ </font>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="html">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'DejaVu Sans Mono'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p align=&quot;center&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;&quot;&gt;MultiMC&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Copyright 2012-2014 MultiMC Contributors&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;you may not use this file except in compliance with the License.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;You may obtain a copy of the License at&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt; http://www.apache.org/licenses/LICENSE-2.0&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Unless required by applicable law or agreed to in writing, software&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;See the License for the specific language governing permissions and&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;limitations under the License.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p align=&quot;center&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;&quot;&gt;QSLog&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Copyright (c) 2010, Razvan Petru&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;All rights reserved.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Redistribution and use in source and binary forms, with or without modification,&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;are permitted provided that the following conditions are met:&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;* Redistributions of source code must retain the above copyright notice, this&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; list of conditions and the following disclaimer.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;* Redistributions in binary form must reproduce the above copyright notice, this&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; list of conditions and the following disclaimer in the documentation and/or other&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; materials provided with the distribution.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;* The name of the contributors may not be used to endorse or promote products&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; derived from this software without specific prior written permission.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot; AND&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;OF THE POSSIBILITY OF SUCH DAMAGE.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p align=&quot;center&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;&quot;&gt;Group View (instance view)&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; /*&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * Copyright (C) 2007 Rafael Fernández López &amp;lt;ereslibre@kde.org&amp;gt;&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * Copyright (C) 2007 John Tapsell &amp;lt;tapsell@kde.org&amp;gt;&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; *&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * This library is free software; you can redistribute it and/or&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * modify it under the terms of the GNU Library General Public&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * License as published by the Free Software Foundation; either&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * version 2 of the License, or (at your option) any later version.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; *&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * This library is distributed in the hope that it will be useful,&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * Library General Public License for more details.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; *&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * You should have received a copy of the GNU Library General Public License&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * along with this library; see the file COPYING.LIB. If not, write to&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * Boston, MA 02110-1301, USA.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; */&lt;/span&gt;&lt;/p&gt;
+&lt;p align=&quot;center&quot; style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p align=&quot;center&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;&quot;&gt;Batch icon set&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;You are free to use Batch (the &amp;quot;icon set&amp;quot;) or any part thereof (the &amp;quot;icons&amp;quot;)&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;in any personal, open-source or commercial work without obligation of payment&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;(monetary or otherwise) or attribution. Do not sell the icon set, host&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;the icon set or rent the icon set (either in existing or modified form).&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;While attribution is optional, it is always appreciated.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Intellectual property rights are not transferred with the download of the icons.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL ADAM WHITCROFT&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL,&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THE USE OF THE ICONS,&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://adamwhitcroft.com/batch/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#68a0df;&quot;&gt;http://adamwhitcroft.com/batch/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p align=&quot;center&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;&quot;&gt;Pack200&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;The GNU General Public License (GPL)&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Version 2, June 1991&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;+ &amp;quot;CLASSPATH&amp;quot; EXCEPTION TO THE GPL&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Certain source files distributed by Oracle America and/or its affiliates are&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;subject to the following clarification and special exception to the GPL, but&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;only where Oracle has expressly included in the particular source file's header&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;the words &amp;quot;Oracle designates this particular file as subject to the &amp;quot;Classpath&amp;quot;&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;exception as provided by Oracle in the LICENSE file that accompanied this code.&amp;quot;&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; Linking this library statically or dynamically with other modules is making&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; a combined work based on this library. Thus, the terms and conditions of&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; the GNU General Public License cover the whole combination.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; As a special exception, the copyright holders of this library give you&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; permission to link this library with independent modules to produce an&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; executable, regardless of the license terms of these independent modules,&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; and to copy and distribute the resulting executable under terms of your&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; choice, provided that you also meet, for each linked independent module,&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; the terms and conditions of the license of that module. An independent&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; module is a module which is not derived from or based on this library. If&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; you modify this library, you may extend this exception to your version of&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; the library, but you are not obligated to do so. If you do not wish to do&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; so, delete this exception statement from your version.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p align=&quot;center&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;&quot;&gt;Quazip&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Copyright (C) 2005-2011 Sergey A. Tachenov&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;This program is free software; you can redistribute it and/or modify it&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;under the terms of the GNU Lesser General Public License as published by&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;the Free Software Foundation; either version 2 of the License, or (at&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;your option) any later version.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;This program is distributed in the hope that it will be useful, but&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;WITHOUT ANY WARRANTY; without even the implied warranty of&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;General Public License for more details.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;You should have received a copy of the GNU Lesser General Public License&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;along with this program; if not, write to the Free Software Foundation,&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;See COPYING file for the full LGPL text.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Original ZIP package is copyrighted by Gilles Vollant, see&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;quazip/(un)zip.h files for details, basically it's zlib license.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p align=&quot;center&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;&quot;&gt;xz-minidec&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;/*&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * XZ decompressor&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; *&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * Authors: Lasse Collin &amp;lt;lasse.collin@tukaani.org&amp;gt;&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * Igor Pavlov &amp;lt;http://7-zip.org/&amp;gt;&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; *&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * This file has been put into the public domain.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * You can do whatever you want with this file.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; */&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p align=&quot;center&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;&quot;&gt;Java IconLoader class&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Copyright (c) 2011, Chris Molini&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;All rights reserved.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Redistribution and use in source and binary forms, with or without&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;modification, are permitted provided that the following conditions are met:&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * Redistributions of source code must retain the above copyright&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; notice, this list of conditions and the following disclaimer.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * Redistributions in binary form must reproduce the above copyright&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; notice, this list of conditions and the following disclaimer in the&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; documentation and/or other materials provided with the distribution.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * Neither the name of the &amp;lt;organization&amp;gt; nor the&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; names of its contributors may be used to endorse or promote products&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; derived from this software without specific prior written permission.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot; AND&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;DISCLAIMED. IN NO EVENT SHALL &amp;lt;COPYRIGHT HOLDER&amp;gt; BE LIABLE FOR ANY&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;/span&gt;&lt;/p&gt;
+&lt;p align=&quot;center&quot; style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p align=&quot;center&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;&quot;&gt;ColumnResizer&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;/*&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * Copyright 2011 Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; * License: LGPL v2.1 or later (see COPYING)&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; */&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::TextBrowserInteraction</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="forkPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>695</width>
+ <height>297</height>
+ </rect>
+ </property>
+ <attribute name="label">
+ <string>Forking/Redistribution</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_33">
+ <item>
+ <widget class="QTextEdit" name="textEdit">
+ <property name="html">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Oxygen-Sans'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Bitstream Vera Sans';&quot;&gt;We keep MultiMC open source because we think it's important to be able to see the source code for a project like this, and we do so using the Apache license.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Bitstream Vera Sans';&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Bitstream Vera Sans';&quot;&gt;Part of the reason for using the Apache license is we don't want people using the &amp;quot;MultiMC&amp;quot; name when redistributing the project. This means people must take the time to go through the source code and remove all references to &amp;quot;MultiMC&amp;quot;, including but not limited to the project icon and the title of windows, (no *MultiMC-fork* in the title).&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Bitstream Vera Sans';&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Bitstream Vera Sans';&quot;&gt;The Apache license covers reasonable use for the name - a mention of the project's origins in the About dialog and the license is acceptable. However, it should be abundantly clear that the project is a fork &lt;/span&gt;&lt;span style=&quot; font-family:'Bitstream Vera Sans'; font-weight:600;&quot;&gt;without&lt;/span&gt;&lt;span style=&quot; font-family:'Bitstream Vera Sans';&quot;&gt; implying that you have our blessing.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QPushButton" name="aboutQt">
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>About Qt</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="closeButton">
+ <property name="text">
+ <string>Close</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../../resources/multimc/multimc.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/application/dialogs/AccountSelectDialog.cpp b/application/dialogs/AccountSelectDialog.cpp
new file mode 100644
index 00000000..3bf83d62
--- /dev/null
+++ b/application/dialogs/AccountSelectDialog.cpp
@@ -0,0 +1,85 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "AccountSelectDialog.h"
+#include "ui_AccountSelectDialog.h"
+
+#include <QItemSelectionModel>
+
+#include <QDebug>
+
+#include <dialogs/ProgressDialog.h>
+
+#include <MultiMC.h>
+
+AccountSelectDialog::AccountSelectDialog(const QString &message, int flags, QWidget *parent)
+ : QDialog(parent), ui(new Ui::AccountSelectDialog)
+{
+ ui->setupUi(this);
+
+ m_accounts = MMC->accounts();
+ ui->listView->setModel(m_accounts.get());
+ ui->listView->hideColumn(MojangAccountList::ActiveColumn);
+
+ // Set the message label.
+ ui->msgLabel->setVisible(!message.isEmpty());
+ ui->msgLabel->setText(message);
+
+ // Flags...
+ ui->globalDefaultCheck->setVisible(flags & GlobalDefaultCheckbox);
+ ui->instDefaultCheck->setVisible(flags & InstanceDefaultCheckbox);
+ qDebug() << flags;
+
+ // Select the first entry in the list.
+ ui->listView->setCurrentIndex(ui->listView->model()->index(0, 0));
+
+ connect(ui->listView, SIGNAL(doubleClicked(QModelIndex)), SLOT(on_buttonBox_accepted()));
+}
+
+AccountSelectDialog::~AccountSelectDialog()
+{
+ delete ui;
+}
+
+MojangAccountPtr AccountSelectDialog::selectedAccount() const
+{
+ return m_selected;
+}
+
+bool AccountSelectDialog::useAsGlobalDefault() const
+{
+ return ui->globalDefaultCheck->isChecked();
+}
+
+bool AccountSelectDialog::useAsInstDefaullt() const
+{
+ return ui->instDefaultCheck->isChecked();
+}
+
+void AccountSelectDialog::on_buttonBox_accepted()
+{
+ QModelIndexList selection = ui->listView->selectionModel()->selectedIndexes();
+ if (selection.size() > 0)
+ {
+ QModelIndex selected = selection.first();
+ m_selected = selected.data(MojangAccountList::PointerRole).value<MojangAccountPtr>();
+ }
+ close();
+}
+
+void AccountSelectDialog::on_buttonBox_rejected()
+{
+ close();
+}
diff --git a/application/dialogs/AccountSelectDialog.h b/application/dialogs/AccountSelectDialog.h
new file mode 100644
index 00000000..21784032
--- /dev/null
+++ b/application/dialogs/AccountSelectDialog.h
@@ -0,0 +1,90 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QDialog>
+
+#include <memory>
+
+#include "auth/MojangAccountList.h"
+
+namespace Ui
+{
+class AccountSelectDialog;
+}
+
+class AccountSelectDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ enum Flags
+ {
+ NoFlags = 0,
+
+ /*!
+ * Shows a check box on the dialog that allows the user to specify that the account
+ * they've selected should be used as the global default for all instances.
+ */
+ GlobalDefaultCheckbox,
+
+ /*!
+ * Shows a check box on the dialog that allows the user to specify that the account
+ * they've selected should be used as the default for the instance they are currently launching.
+ * This is not currently implemented.
+ */
+ InstanceDefaultCheckbox,
+ };
+
+ /*!
+ * Constructs a new account select dialog with the given parent and message.
+ * The message will be shown at the top of the dialog. It is an empty string by default.
+ */
+ explicit AccountSelectDialog(const QString& message="", int flags=0, QWidget *parent = 0);
+ ~AccountSelectDialog();
+
+ /*!
+ * Gets a pointer to the account that the user selected.
+ * This is null if the user clicked cancel or hasn't clicked OK yet.
+ */
+ MojangAccountPtr selectedAccount() const;
+
+ /*!
+ * Returns true if the user checked the "use as global default" checkbox.
+ * If the checkbox wasn't shown, this function returns false.
+ */
+ bool useAsGlobalDefault() const;
+
+ /*!
+ * Returns true if the user checked the "use as instance default" checkbox.
+ * If the checkbox wasn't shown, this function returns false.
+ */
+ bool useAsInstDefaullt() const;
+
+public
+slots:
+ void on_buttonBox_accepted();
+
+ void on_buttonBox_rejected();
+
+protected:
+ std::shared_ptr<MojangAccountList> m_accounts;
+
+ //! The account that was selected when the user clicked OK.
+ MojangAccountPtr m_selected;
+
+private:
+ Ui::AccountSelectDialog *ui;
+};
diff --git a/application/dialogs/AccountSelectDialog.ui b/application/dialogs/AccountSelectDialog.ui
new file mode 100644
index 00000000..7af1512a
--- /dev/null
+++ b/application/dialogs/AccountSelectDialog.ui
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AccountSelectDialog</class>
+ <widget class="QDialog" name="AccountSelectDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>413</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Select an Account</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="msgLabel">
+ <property name="text">
+ <string>Select an account.</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QTreeView" name="listView"/>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QCheckBox" name="globalDefaultCheck">
+ <property name="text">
+ <string>Use as default?</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="instDefaultCheck">
+ <property name="text">
+ <string>Use as default for this instance only?</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/application/dialogs/CopyInstanceDialog.cpp b/application/dialogs/CopyInstanceDialog.cpp
new file mode 100644
index 00000000..7c98978b
--- /dev/null
+++ b/application/dialogs/CopyInstanceDialog.cpp
@@ -0,0 +1,101 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <QLayout>
+#include <QPushButton>
+
+#include "MultiMC.h"
+#include "CopyInstanceDialog.h"
+#include "ui_CopyInstanceDialog.h"
+
+#include "Platform.h"
+#include "dialogs/VersionSelectDialog.h"
+#include "dialogs/ProgressDialog.h"
+#include "dialogs/IconPickerDialog.h"
+
+#include "BaseVersion.h"
+#include "icons/IconList.h"
+#include "tasks/Task.h"
+#include "BaseInstance.h"
+#include "InstanceList.h"
+
+CopyInstanceDialog::CopyInstanceDialog(InstancePtr original, QWidget *parent)
+ :QDialog(parent), ui(new Ui::CopyInstanceDialog), m_original(original)
+{
+ MultiMCPlatform::fixWM_CLASS(this);
+ ui->setupUi(this);
+ resize(minimumSizeHint());
+ layout()->setSizeConstraint(QLayout::SetFixedSize);
+
+ InstIconKey = original->iconKey();
+ ui->iconButton->setIcon(ENV.icons()->getIcon(InstIconKey));
+ ui->instNameTextBox->setText(original->name());
+ ui->instNameTextBox->setFocus();
+ auto groups = MMC->instances()->getGroups().toSet();
+ auto groupList = QStringList(groups.toList());
+ groupList.sort(Qt::CaseInsensitive);
+ groupList.removeOne("");
+ groupList.push_front("");
+ ui->groupBox->addItems(groupList);
+ int index = groupList.indexOf(m_original->group());
+ if(index == -1)
+ {
+ index = 0;
+ }
+ ui->groupBox->setCurrentIndex(index);
+ ui->groupBox->lineEdit()->setPlaceholderText(tr("No group"));
+}
+
+CopyInstanceDialog::~CopyInstanceDialog()
+{
+ delete ui;
+}
+
+void CopyInstanceDialog::updateDialogState()
+{
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!instName().isEmpty());
+}
+
+QString CopyInstanceDialog::instName() const
+{
+ return ui->instNameTextBox->text();
+}
+
+QString CopyInstanceDialog::iconKey() const
+{
+ return InstIconKey;
+}
+
+QString CopyInstanceDialog::instGroup() const
+{
+ return ui->groupBox->currentText();
+}
+
+void CopyInstanceDialog::on_iconButton_clicked()
+{
+ IconPickerDialog dlg(this);
+ dlg.exec(InstIconKey);
+
+ if (dlg.result() == QDialog::Accepted)
+ {
+ InstIconKey = dlg.selectedIconKey;
+ ui->iconButton->setIcon(ENV.icons()->getIcon(InstIconKey));
+ }
+}
+
+void CopyInstanceDialog::on_instNameTextBox_textChanged(const QString &arg1)
+{
+ updateDialogState();
+}
diff --git a/application/dialogs/CopyInstanceDialog.h b/application/dialogs/CopyInstanceDialog.h
new file mode 100644
index 00000000..faa20615
--- /dev/null
+++ b/application/dialogs/CopyInstanceDialog.h
@@ -0,0 +1,52 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QDialog>
+#include "BaseVersion.h"
+#include <BaseInstance.h>
+
+class BaseInstance;
+
+namespace Ui
+{
+class CopyInstanceDialog;
+}
+
+class CopyInstanceDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit CopyInstanceDialog(InstancePtr original, QWidget *parent = 0);
+ ~CopyInstanceDialog();
+
+ void updateDialogState();
+
+ QString instName() const;
+ QString instGroup() const;
+ QString iconKey() const;
+
+private
+slots:
+ void on_iconButton_clicked();
+ void on_instNameTextBox_textChanged(const QString &arg1);
+
+private:
+ Ui::CopyInstanceDialog *ui;
+ QString InstIconKey;
+ InstancePtr m_original;
+};
diff --git a/application/dialogs/CopyInstanceDialog.ui b/application/dialogs/CopyInstanceDialog.ui
new file mode 100644
index 00000000..2615168c
--- /dev/null
+++ b/application/dialogs/CopyInstanceDialog.ui
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>CopyInstanceDialog</class>
+ <widget class="QDialog" name="CopyInstanceDialog">
+ <property name="windowModality">
+ <enum>Qt::ApplicationModal</enum>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>345</width>
+ <height>205</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Copy Instance</string>
+ </property>
+ <property name="windowIcon">
+ <iconset>
+ <normaloff>:/icons/toolbar/copy</normaloff>:/icons/toolbar/copy</iconset>
+ </property>
+ <property name="modal">
+ <bool>true</bool>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="iconBtnLayout">
+ <item>
+ <spacer name="iconBtnLeftSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QToolButton" name="iconButton">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/instances/infinity</normaloff>:/icons/instances/infinity</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>80</width>
+ <height>80</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="iconBtnRightSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="instNameTextBox">
+ <property name="placeholderText">
+ <string>Name</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="labelVersion_3">
+ <property name="text">
+ <string>Group</string>
+ </property>
+ <property name="buddy">
+ <cstring>groupBox</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="2">
+ <widget class="QComboBox" name="groupBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../../graphics.qrc"/>
+ </resources>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>CopyInstanceDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>CopyInstanceDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/application/dialogs/CustomMessageBox.cpp b/application/dialogs/CustomMessageBox.cpp
new file mode 100644
index 00000000..0fb5bd19
--- /dev/null
+++ b/application/dialogs/CustomMessageBox.cpp
@@ -0,0 +1,35 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "CustomMessageBox.h"
+
+namespace CustomMessageBox
+{
+QMessageBox *selectable(QWidget *parent, const QString &title, const QString &text,
+ QMessageBox::Icon icon, QMessageBox::StandardButtons buttons,
+ QMessageBox::StandardButton defaultButton)
+{
+ QMessageBox *messageBox = new QMessageBox(parent);
+ messageBox->setWindowTitle(title);
+ messageBox->setText(text);
+ messageBox->setStandardButtons(buttons);
+ messageBox->setDefaultButton(defaultButton);
+ messageBox->setTextInteractionFlags(Qt::TextSelectableByMouse);
+ messageBox->setIcon(icon);
+ messageBox->setTextInteractionFlags(Qt::TextBrowserInteraction);
+
+ return messageBox;
+}
+}
diff --git a/application/dialogs/CustomMessageBox.h b/application/dialogs/CustomMessageBox.h
new file mode 100644
index 00000000..0a7202d7
--- /dev/null
+++ b/application/dialogs/CustomMessageBox.h
@@ -0,0 +1,26 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QMessageBox>
+
+namespace CustomMessageBox
+{
+QMessageBox *selectable(QWidget *parent, const QString &title, const QString &text,
+ QMessageBox::Icon icon = QMessageBox::NoIcon,
+ QMessageBox::StandardButtons buttons = QMessageBox::Ok,
+ QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
+}
diff --git a/application/dialogs/EditAccountDialog.cpp b/application/dialogs/EditAccountDialog.cpp
new file mode 100644
index 00000000..b78cebee
--- /dev/null
+++ b/application/dialogs/EditAccountDialog.cpp
@@ -0,0 +1,51 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "EditAccountDialog.h"
+#include "ui_EditAccountDialog.h"
+#include <QDesktopServices>
+#include <QUrl>
+
+EditAccountDialog::EditAccountDialog(const QString &text, QWidget *parent, int flags)
+ : QDialog(parent), ui(new Ui::EditAccountDialog)
+{
+ ui->setupUi(this);
+
+ ui->label->setText(text);
+ ui->label->setVisible(!text.isEmpty());
+
+ ui->userTextBox->setVisible(flags & UsernameField);
+ ui->passTextBox->setVisible(flags & PasswordField);
+}
+
+EditAccountDialog::~EditAccountDialog()
+{
+ delete ui;
+}
+
+void EditAccountDialog::on_label_linkActivated(const QString &link)
+{
+ QDesktopServices::openUrl(QUrl(link));
+}
+
+QString EditAccountDialog::username() const
+{
+ return ui->userTextBox->text();
+}
+
+QString EditAccountDialog::password() const
+{
+ return ui->passTextBox->text();
+}
diff --git a/application/dialogs/EditAccountDialog.h b/application/dialogs/EditAccountDialog.h
new file mode 100644
index 00000000..df8b21bf
--- /dev/null
+++ b/application/dialogs/EditAccountDialog.h
@@ -0,0 +1,60 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QDialog>
+
+namespace Ui
+{
+class EditAccountDialog;
+}
+
+class EditAccountDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit EditAccountDialog(const QString &text = "", QWidget *parent = 0,
+ int flags = UsernameField | PasswordField);
+ ~EditAccountDialog();
+
+ /*!
+ * Gets the text entered in the dialog's username field.
+ */
+ QString username() const;
+
+ /*!
+ * Gets the text entered in the dialog's password field.
+ */
+ QString password() const;
+
+ enum Flags
+ {
+ NoFlags = 0,
+
+ //! Specifies that the dialog should have a username field.
+ UsernameField,
+
+ //! Specifies that the dialog should have a password field.
+ PasswordField,
+ };
+
+private slots:
+ void on_label_linkActivated(const QString &link);
+
+private:
+ Ui::EditAccountDialog *ui;
+};
diff --git a/application/dialogs/EditAccountDialog.ui b/application/dialogs/EditAccountDialog.ui
new file mode 100644
index 00000000..5f727bd4
--- /dev/null
+++ b/application/dialogs/EditAccountDialog.ui
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>EditAccountDialog</class>
+ <widget class="QDialog" name="EditAccountDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>148</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Edit Account</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Message label placeholder.</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="userTextBox">
+ <property name="placeholderText">
+ <string>Email / Username</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="passTextBox">
+ <property name="echoMode">
+ <enum>QLineEdit::Password</enum>
+ </property>
+ <property name="placeholderText">
+ <string>Password</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>EditAccountDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>EditAccountDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/application/dialogs/IconPickerDialog.cpp b/application/dialogs/IconPickerDialog.cpp
new file mode 100644
index 00000000..cafd47b7
--- /dev/null
+++ b/application/dialogs/IconPickerDialog.cpp
@@ -0,0 +1,156 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <QKeyEvent>
+#include <QPushButton>
+#include <QFileDialog>
+
+#include "MultiMC.h"
+
+#include "IconPickerDialog.h"
+#include "ui_IconPickerDialog.h"
+
+#include "Platform.h"
+#include "groupview/InstanceDelegate.h"
+
+#include "icons/IconList.h"
+
+IconPickerDialog::IconPickerDialog(QWidget *parent)
+ : QDialog(parent), ui(new Ui::IconPickerDialog)
+{
+ MultiMCPlatform::fixWM_CLASS(this);
+ ui->setupUi(this);
+ setWindowModality(Qt::WindowModal);
+
+ auto contentsWidget = ui->iconView;
+ contentsWidget->setViewMode(QListView::IconMode);
+ contentsWidget->setFlow(QListView::LeftToRight);
+ contentsWidget->setIconSize(QSize(48, 48));
+ contentsWidget->setMovement(QListView::Static);
+ contentsWidget->setResizeMode(QListView::Adjust);
+ contentsWidget->setSelectionMode(QAbstractItemView::SingleSelection);
+ contentsWidget->setSpacing(5);
+ contentsWidget->setWordWrap(false);
+ contentsWidget->setWrapping(true);
+ contentsWidget->setUniformItemSizes(true);
+ contentsWidget->setTextElideMode(Qt::ElideRight);
+ contentsWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
+ contentsWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+ contentsWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ contentsWidget->setItemDelegate(new ListViewDelegate());
+
+ // contentsWidget->setAcceptDrops(true);
+ contentsWidget->setDropIndicatorShown(true);
+ contentsWidget->viewport()->setAcceptDrops(true);
+ contentsWidget->setDragDropMode(QAbstractItemView::DropOnly);
+ contentsWidget->setDefaultDropAction(Qt::CopyAction);
+
+ contentsWidget->installEventFilter(this);
+
+ contentsWidget->setModel(ENV.icons().get());
+
+ auto buttonAdd = ui->buttonBox->addButton(tr("Add Icon"), QDialogButtonBox::ResetRole);
+ auto buttonRemove =
+ ui->buttonBox->addButton(tr("Remove Icon"), QDialogButtonBox::ResetRole);
+
+ connect(buttonAdd, SIGNAL(clicked(bool)), SLOT(addNewIcon()));
+ connect(buttonRemove, SIGNAL(clicked(bool)), SLOT(removeSelectedIcon()));
+
+ connect(contentsWidget, SIGNAL(doubleClicked(QModelIndex)), SLOT(activated(QModelIndex)));
+
+ connect(contentsWidget->selectionModel(),
+ SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
+ SLOT(selectionChanged(QItemSelection, QItemSelection)));
+}
+bool IconPickerDialog::eventFilter(QObject *obj, QEvent *evt)
+{
+ if (obj != ui->iconView)
+ return QDialog::eventFilter(obj, evt);
+ if (evt->type() != QEvent::KeyPress)
+ {
+ return QDialog::eventFilter(obj, evt);
+ }
+ QKeyEvent *keyEvent = static_cast<QKeyEvent *>(evt);
+ switch (keyEvent->key())
+ {
+ case Qt::Key_Delete:
+ removeSelectedIcon();
+ return true;
+ case Qt::Key_Plus:
+ addNewIcon();
+ return true;
+ default:
+ break;
+ }
+ return QDialog::eventFilter(obj, evt);
+}
+
+void IconPickerDialog::addNewIcon()
+{
+ //: The title of the select icons open file dialog
+ QString selectIcons = tr("Select Icons");
+ //: The type of icon files
+ QStringList fileNames = QFileDialog::getOpenFileNames(this, selectIcons, QString(),
+ tr("Icons") + "(*.png *.jpg *.jpeg *.ico)");
+ ENV.icons()->installIcons(fileNames);
+}
+
+void IconPickerDialog::removeSelectedIcon()
+{
+ ENV.icons()->deleteIcon(selectedIconKey);
+}
+
+void IconPickerDialog::activated(QModelIndex index)
+{
+ selectedIconKey = index.data(Qt::UserRole).toString();
+ accept();
+}
+
+void IconPickerDialog::selectionChanged(QItemSelection selected, QItemSelection deselected)
+{
+ if (selected.empty())
+ return;
+
+ QString key = selected.first().indexes().first().data(Qt::UserRole).toString();
+ if (!key.isEmpty())
+ selectedIconKey = key;
+}
+
+int IconPickerDialog::exec(QString selection)
+{
+ auto list = ENV.icons();
+ auto contentsWidget = ui->iconView;
+ selectedIconKey = selection;
+
+ int index_nr = list->getIconIndex(selection);
+ auto model_index = list->index(index_nr);
+ contentsWidget->selectionModel()->select(
+ model_index, QItemSelectionModel::Current | QItemSelectionModel::Select);
+
+ QMetaObject::invokeMethod(this, "delayed_scroll", Qt::QueuedConnection,
+ Q_ARG(QModelIndex, model_index));
+ return QDialog::exec();
+}
+
+void IconPickerDialog::delayed_scroll(QModelIndex model_index)
+{
+ auto contentsWidget = ui->iconView;
+ contentsWidget->scrollTo(model_index);
+}
+
+IconPickerDialog::~IconPickerDialog()
+{
+ delete ui;
+}
diff --git a/application/dialogs/IconPickerDialog.h b/application/dialogs/IconPickerDialog.h
new file mode 100644
index 00000000..610d9306
--- /dev/null
+++ b/application/dialogs/IconPickerDialog.h
@@ -0,0 +1,48 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+#include <QDialog>
+#include <QItemSelection>
+
+namespace Ui
+{
+class IconPickerDialog;
+}
+
+class IconPickerDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit IconPickerDialog(QWidget *parent = 0);
+ ~IconPickerDialog();
+ int exec(QString selection);
+ QString selectedIconKey;
+
+protected:
+ virtual bool eventFilter(QObject *, QEvent *);
+
+private:
+ Ui::IconPickerDialog *ui;
+
+private
+slots:
+ void selectionChanged(QItemSelection, QItemSelection);
+ void activated(QModelIndex);
+ void delayed_scroll(QModelIndex);
+ void addNewIcon();
+ void removeSelectedIcon();
+};
diff --git a/application/dialogs/IconPickerDialog.ui b/application/dialogs/IconPickerDialog.ui
new file mode 100644
index 00000000..c548edfb
--- /dev/null
+++ b/application/dialogs/IconPickerDialog.ui
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>IconPickerDialog</class>
+ <widget class="QDialog" name="IconPickerDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>676</width>
+ <height>555</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Pick icon</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QListView" name="iconView"/>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>IconPickerDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>IconPickerDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/application/dialogs/LoginDialog.cpp b/application/dialogs/LoginDialog.cpp
new file mode 100644
index 00000000..3af5c702
--- /dev/null
+++ b/application/dialogs/LoginDialog.cpp
@@ -0,0 +1,110 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "LoginDialog.h"
+#include "ui_LoginDialog.h"
+
+#include "auth/YggdrasilTask.h"
+
+#include <QtWidgets/QPushButton>
+
+LoginDialog::LoginDialog(QWidget *parent) : QDialog(parent), ui(new Ui::LoginDialog)
+{
+ ui->setupUi(this);
+ ui->progressBar->setVisible(false);
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
+
+ connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
+ connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
+}
+
+LoginDialog::~LoginDialog()
+{
+ delete ui;
+}
+
+// Stage 1: User interaction
+void LoginDialog::accept()
+{
+ setUserInputsEnabled(false);
+ ui->progressBar->setVisible(true);
+
+ // Setup the login task and start it
+ m_account = MojangAccount::createFromUsername(ui->userTextBox->text());
+ m_loginTask = m_account->login(nullptr, ui->passTextBox->text());
+ connect(m_loginTask.get(), &ProgressProvider::failed, this, &LoginDialog::onTaskFailed);
+ connect(m_loginTask.get(), &ProgressProvider::succeeded, this,
+ &LoginDialog::onTaskSucceeded);
+ connect(m_loginTask.get(), &ProgressProvider::status, this, &LoginDialog::onTaskStatus);
+ connect(m_loginTask.get(), &ProgressProvider::progress, this, &LoginDialog::onTaskProgress);
+ m_loginTask->start();
+}
+
+void LoginDialog::setUserInputsEnabled(bool enable)
+{
+ ui->userTextBox->setEnabled(enable);
+ ui->passTextBox->setEnabled(enable);
+ ui->buttonBox->setEnabled(enable);
+}
+
+// Enable the OK button only when both textboxes contain something.
+void LoginDialog::on_userTextBox_textEdited(const QString &newText)
+{
+ ui->buttonBox->button(QDialogButtonBox::Ok)
+ ->setEnabled(!newText.isEmpty() && !ui->passTextBox->text().isEmpty());
+}
+void LoginDialog::on_passTextBox_textEdited(const QString &newText)
+{
+ ui->buttonBox->button(QDialogButtonBox::Ok)
+ ->setEnabled(!newText.isEmpty() && !ui->userTextBox->text().isEmpty());
+}
+
+void LoginDialog::onTaskFailed(const QString &reason)
+{
+ // Set message
+ ui->label->setText("<span style='color:red'>" + reason + "</span>");
+
+ // Re-enable user-interaction
+ setUserInputsEnabled(true);
+ ui->progressBar->setVisible(false);
+}
+
+void LoginDialog::onTaskSucceeded()
+{
+ QDialog::accept();
+}
+
+void LoginDialog::onTaskStatus(const QString &status)
+{
+ ui->label->setText(status);
+}
+
+void LoginDialog::onTaskProgress(qint64 current, qint64 total)
+{
+ ui->progressBar->setMaximum(total);
+ ui->progressBar->setValue(current);
+}
+
+// Public interface
+MojangAccountPtr LoginDialog::newAccount(QWidget *parent, QString msg)
+{
+ LoginDialog dlg(parent);
+ dlg.ui->label->setText(msg);
+ if (dlg.exec() == QDialog::Accepted)
+ {
+ return dlg.m_account;
+ }
+ return 0;
+}
diff --git a/application/dialogs/LoginDialog.h b/application/dialogs/LoginDialog.h
new file mode 100644
index 00000000..63c95fb8
--- /dev/null
+++ b/application/dialogs/LoginDialog.h
@@ -0,0 +1,58 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QtWidgets/QDialog>
+#include <QtCore/QEventLoop>
+
+#include "auth/MojangAccount.h"
+
+namespace Ui
+{
+class LoginDialog;
+}
+
+class LoginDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ ~LoginDialog();
+
+ static MojangAccountPtr newAccount(QWidget *parent, QString message);
+
+private:
+ explicit LoginDialog(QWidget *parent = 0);
+
+ void setUserInputsEnabled(bool enable);
+
+protected
+slots:
+ void accept();
+
+ void onTaskFailed(const QString &reason);
+ void onTaskSucceeded();
+ void onTaskStatus(const QString &status);
+ void onTaskProgress(qint64 current, qint64 total);
+
+ void on_userTextBox_textEdited(const QString &newText);
+ void on_passTextBox_textEdited(const QString &newText);
+
+private:
+ Ui::LoginDialog *ui;
+ MojangAccountPtr m_account;
+ std::shared_ptr<Task> m_loginTask;
+};
diff --git a/application/dialogs/LoginDialog.ui b/application/dialogs/LoginDialog.ui
new file mode 100644
index 00000000..b24b1c0c
--- /dev/null
+++ b/application/dialogs/LoginDialog.ui
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>LoginDialog</class>
+ <widget class="QDialog" name="LoginDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>162</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Add Account</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Message label placeholder.</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="userTextBox">
+ <property name="placeholderText">
+ <string>Email / Username</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="passTextBox">
+ <property name="echoMode">
+ <enum>QLineEdit::Password</enum>
+ </property>
+ <property name="placeholderText">
+ <string>Password</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QProgressBar" name="progressBar">
+ <property name="value">
+ <number>24</number>
+ </property>
+ <property name="textVisible">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/application/dialogs/ModEditDialogCommon.cpp b/application/dialogs/ModEditDialogCommon.cpp
new file mode 100644
index 00000000..4a2115d8
--- /dev/null
+++ b/application/dialogs/ModEditDialogCommon.cpp
@@ -0,0 +1,40 @@
+#include "ModEditDialogCommon.h"
+#include "CustomMessageBox.h"
+#include <QUrl>
+
+bool lastfirst(QModelIndexList &list, int &first, int &last)
+{
+ if (list.isEmpty())
+ return false;
+ first = last = list[0].row();
+ for (auto item : list)
+ {
+ int row = item.row();
+ if (row < first)
+ first = row;
+ if (row > last)
+ last = row;
+ }
+ return true;
+}
+
+void showWebsiteForMod(QWidget *parentDlg, Mod &m)
+{
+ QString url = m.homeurl();
+ if (url.size())
+ {
+ // catch the cases where the protocol is missing
+ if (!url.startsWith("http"))
+ {
+ url = "http://" + url;
+ }
+ QDesktopServices::openUrl(url);
+ }
+ else
+ {
+ CustomMessageBox::selectable(
+ parentDlg, QObject::tr("How sad!"),
+ QObject::tr("The mod author didn't provide a website link for this mod."),
+ QMessageBox::Warning);
+ }
+}
diff --git a/application/dialogs/ModEditDialogCommon.h b/application/dialogs/ModEditDialogCommon.h
new file mode 100644
index 00000000..e2afb98a
--- /dev/null
+++ b/application/dialogs/ModEditDialogCommon.h
@@ -0,0 +1,9 @@
+#pragma once
+#include <QModelIndex>
+#include <QDesktopServices>
+#include <QWidget>
+#include <minecraft/Mod.h>
+
+bool lastfirst(QModelIndexList &list, int &first, int &last);
+
+void showWebsiteForMod(QWidget *parentDlg, Mod &m);
diff --git a/application/dialogs/NewInstanceDialog.cpp b/application/dialogs/NewInstanceDialog.cpp
new file mode 100644
index 00000000..b3aa805b
--- /dev/null
+++ b/application/dialogs/NewInstanceDialog.cpp
@@ -0,0 +1,207 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "MultiMC.h"
+#include "NewInstanceDialog.h"
+#include "ui_NewInstanceDialog.h"
+
+#include <BaseVersion.h>
+#include <icons/IconList.h>
+#include <minecraft/MinecraftVersionList.h>
+#include <tasks/Task.h>
+#include <InstanceList.h>
+
+#include "Platform.h"
+#include "VersionSelectDialog.h"
+#include "ProgressDialog.h"
+#include "IconPickerDialog.h"
+
+#include <QLayout>
+#include <QPushButton>
+#include <QFileDialog>
+#include <QValidator>
+
+class UrlValidator : public QValidator
+{
+public:
+ using QValidator::QValidator;
+
+ State validate(QString &in, int &pos) const
+ {
+ const QUrl url(in);
+ if (url.isValid() && !url.isRelative() && !url.isEmpty())
+ {
+ return Acceptable;
+ }
+ else if (QFile::exists(in))
+ {
+ return Acceptable;
+ }
+ else
+ {
+ return Intermediate;
+ }
+ }
+};
+
+NewInstanceDialog::NewInstanceDialog(QWidget *parent)
+ : QDialog(parent), ui(new Ui::NewInstanceDialog)
+{
+ MultiMCPlatform::fixWM_CLASS(this);
+ ui->setupUi(this);
+ resize(minimumSizeHint());
+ layout()->setSizeConstraint(QLayout::SetFixedSize);
+
+ setSelectedVersion(MMC->minecraftlist()->getLatestStable(), true);
+ InstIconKey = "infinity";
+ ui->iconButton->setIcon(ENV.icons()->getIcon(InstIconKey));
+
+ ui->modpackEdit->setValidator(new UrlValidator(ui->modpackEdit));
+ connect(ui->modpackEdit, &QLineEdit::textChanged, this, &NewInstanceDialog::updateDialogState);
+ connect(ui->modpackBox, &QRadioButton::clicked, this, &NewInstanceDialog::updateDialogState);
+ connect(ui->versionBox, &QRadioButton::clicked, this, &NewInstanceDialog::updateDialogState);
+
+ auto groups = MMC->instances()->getGroups().toSet();
+ auto groupList = QStringList(groups.toList());
+ groupList.sort(Qt::CaseInsensitive);
+ groupList.removeOne("");
+ QString oldValue = MMC->settings()->get("LastUsedGroupForNewInstance").toString();
+ groupList.push_front(oldValue);
+ groupList.push_front("");
+ ui->groupBox->addItems(groupList);
+ int index = groupList.indexOf(oldValue);
+ if(index == -1)
+ {
+ index = 0;
+ }
+ ui->groupBox->setCurrentIndex(index);
+ ui->groupBox->lineEdit()->setPlaceholderText(tr("No group"));
+}
+
+NewInstanceDialog::~NewInstanceDialog()
+{
+ delete ui;
+}
+
+void NewInstanceDialog::updateDialogState()
+{
+ bool allowOK = !instName().isEmpty() &&
+ (ui->versionBox->isChecked() && m_selectedVersion ||
+ (ui->modpackBox->isChecked() && ui->modpackEdit->hasAcceptableInput()));
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(allowOK);
+}
+
+void NewInstanceDialog::setSelectedVersion(BaseVersionPtr version, bool initial)
+{
+ m_selectedVersion = version;
+
+ if (m_selectedVersion)
+ {
+ ui->versionTextBox->setText(version->name());
+ if(ui->instNameTextBox->text().isEmpty() && !initial)
+ {
+ ui->instNameTextBox->setText(version->name());
+ }
+ }
+ else
+ {
+ ui->versionTextBox->setText("");
+ }
+
+ updateDialogState();
+}
+
+QString NewInstanceDialog::instName() const
+{
+ return ui->instNameTextBox->text();
+}
+QString NewInstanceDialog::instGroup() const
+{
+ return ui->groupBox->currentText();
+}
+QString NewInstanceDialog::iconKey() const
+{
+ return InstIconKey;
+}
+QUrl NewInstanceDialog::modpackUrl() const
+{
+ if (ui->modpackBox->isChecked())
+ {
+ const QUrl url(ui->modpackEdit->text());
+ if (url.isValid() && !url.isRelative() && !url.host().isEmpty())
+ {
+ return url;
+ }
+ else
+ {
+ return QUrl::fromLocalFile(ui->modpackEdit->text());
+ }
+ }
+ else
+ {
+ return QUrl();
+ }
+}
+
+BaseVersionPtr NewInstanceDialog::selectedVersion() const
+{
+ return m_selectedVersion;
+}
+
+void NewInstanceDialog::on_btnChangeVersion_clicked()
+{
+ VersionSelectDialog vselect(MMC->minecraftlist().get(), tr("Change Minecraft version"),
+ this);
+ vselect.exec();
+ if (vselect.result() == QDialog::Accepted)
+ {
+ BaseVersionPtr version = vselect.selectedVersion();
+ if (version)
+ setSelectedVersion(version);
+ }
+}
+
+void NewInstanceDialog::on_iconButton_clicked()
+{
+ IconPickerDialog dlg(this);
+ dlg.exec(InstIconKey);
+
+ if (dlg.result() == QDialog::Accepted)
+ {
+ InstIconKey = dlg.selectedIconKey;
+ ui->iconButton->setIcon(ENV.icons()->getIcon(InstIconKey));
+ }
+}
+
+void NewInstanceDialog::on_instNameTextBox_textChanged(const QString &arg1)
+{
+ updateDialogState();
+}
+
+void NewInstanceDialog::on_modpackBtn_clicked()
+{
+ const QUrl url = QFileDialog::getOpenFileUrl(this, tr("Choose modpack"), modpackUrl(), tr("Zip (*.zip)"));
+ if (url.isValid())
+ {
+ if (url.isLocalFile())
+ {
+ ui->modpackEdit->setText(url.toLocalFile());
+ }
+ else
+ {
+ ui->modpackEdit->setText(url.toString());
+ }
+ }
+}
diff --git a/application/dialogs/NewInstanceDialog.h b/application/dialogs/NewInstanceDialog.h
new file mode 100644
index 00000000..bc3152b9
--- /dev/null
+++ b/application/dialogs/NewInstanceDialog.h
@@ -0,0 +1,59 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QDialog>
+
+#include "BaseVersion.h"
+
+namespace Ui
+{
+class NewInstanceDialog;
+}
+
+class NewInstanceDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit NewInstanceDialog(QWidget *parent = 0);
+ ~NewInstanceDialog();
+
+ void updateDialogState();
+
+ void setSelectedVersion(BaseVersionPtr version, bool initial = false);
+
+ void loadVersionList();
+
+ QString instName() const;
+ QString instGroup() const;
+ QString iconKey() const;
+ QUrl modpackUrl() const;
+ BaseVersionPtr selectedVersion() const;
+
+private
+slots:
+ void on_btnChangeVersion_clicked();
+ void on_iconButton_clicked();
+ void on_modpackBtn_clicked();
+ void on_instNameTextBox_textChanged(const QString &arg1);
+
+private:
+ Ui::NewInstanceDialog *ui;
+
+ BaseVersionPtr m_selectedVersion;
+ QString InstIconKey;
+};
diff --git a/application/dialogs/NewInstanceDialog.ui b/application/dialogs/NewInstanceDialog.ui
new file mode 100644
index 00000000..6cb0c97c
--- /dev/null
+++ b/application/dialogs/NewInstanceDialog.ui
@@ -0,0 +1,309 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>NewInstanceDialog</class>
+ <widget class="QDialog" name="NewInstanceDialog">
+ <property name="windowModality">
+ <enum>Qt::ApplicationModal</enum>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>277</width>
+ <height>404</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>New Instance</string>
+ </property>
+ <property name="windowIcon">
+ <iconset>
+ <normaloff>:/icons/toolbar/new</normaloff>:/icons/toolbar/new</iconset>
+ </property>
+ <property name="modal">
+ <bool>true</bool>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="iconBtnLayout">
+ <item>
+ <spacer name="iconBtnLeftSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QToolButton" name="iconButton">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/instances/infinity</normaloff>:/icons/instances/infinity</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>80</width>
+ <height>80</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="iconBtnRightSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="instNameTextBox">
+ <property name="placeholderText">
+ <string>Name</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="labelVersion_3">
+ <property name="text">
+ <string>&amp;Group:</string>
+ </property>
+ <property name="buddy">
+ <cstring>groupBox</cstring>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="groupBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="4" column="2">
+ <widget class="QToolButton" name="modpackBtn">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" colspan="2">
+ <widget class="QLineEdit" name="modpackEdit">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>http://</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QLineEdit" name="versionTextBox">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QToolButton" name="btnChangeVersion">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="3">
+ <widget class="QRadioButton" name="modpackBox">
+ <property name="text">
+ <string>Impor&amp;t Modpack (local file or link):</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="3">
+ <widget class="QRadioButton" name="versionBox">
+ <property name="text">
+ <string>Vani&amp;lla Minecraft (select version):</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="Line" name="line_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>instNameTextBox</tabstop>
+ <tabstop>groupBox</tabstop>
+ <tabstop>versionBox</tabstop>
+ <tabstop>versionTextBox</tabstop>
+ <tabstop>btnChangeVersion</tabstop>
+ <tabstop>modpackBox</tabstop>
+ <tabstop>modpackEdit</tabstop>
+ <tabstop>modpackBtn</tabstop>
+ <tabstop>iconButton</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>NewInstanceDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>257</x>
+ <y>333</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>NewInstanceDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>325</x>
+ <y>333</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>modpackBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>modpackEdit</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>81</x>
+ <y>229</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>236</x>
+ <y>221</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>modpackBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>modpackBtn</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>129</x>
+ <y>225</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>328</x>
+ <y>229</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>versionBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>versionTextBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>93</x>
+ <y>195</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>213</x>
+ <y>191</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>versionBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>btnChangeVersion</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>104</x>
+ <y>198</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>322</x>
+ <y>192</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/application/dialogs/NotificationDialog.cpp b/application/dialogs/NotificationDialog.cpp
new file mode 100644
index 00000000..8f920371
--- /dev/null
+++ b/application/dialogs/NotificationDialog.cpp
@@ -0,0 +1,84 @@
+#include "NotificationDialog.h"
+#include "ui_NotificationDialog.h"
+
+#include <QTimerEvent>
+
+NotificationDialog::NotificationDialog(const NotificationChecker::NotificationEntry &entry, QWidget *parent) :
+ QDialog(parent, Qt::MSWindowsFixedSizeDialogHint | Qt::WindowTitleHint | Qt::CustomizeWindowHint),
+ ui(new Ui::NotificationDialog)
+{
+ ui->setupUi(this);
+
+ QStyle::StandardPixmap icon;
+ switch (entry.type)
+ {
+ case NotificationChecker::NotificationEntry::Critical:
+ icon = QStyle::SP_MessageBoxCritical;
+ break;
+ case NotificationChecker::NotificationEntry::Warning:
+ icon = QStyle::SP_MessageBoxWarning;
+ break;
+ case NotificationChecker::NotificationEntry::Information:
+ icon = QStyle::SP_MessageBoxInformation;
+ break;
+ }
+ ui->iconLabel->setPixmap(style()->standardPixmap(icon, 0, this));
+ ui->messageLabel->setText(entry.message);
+
+ m_dontShowAgainText = tr("Don't show again");
+ m_closeText = tr("Close");
+
+ ui->dontShowAgainBtn->setText(m_dontShowAgainText + QString(" (%1)").arg(m_dontShowAgainTime));
+ ui->closeBtn->setText(m_closeText + QString(" (%1)").arg(m_closeTime));
+
+ startTimer(1000);
+}
+
+NotificationDialog::~NotificationDialog()
+{
+ delete ui;
+}
+
+void NotificationDialog::timerEvent(QTimerEvent *event)
+{
+ if (m_dontShowAgainTime > 0)
+ {
+ m_dontShowAgainTime--;
+ if (m_dontShowAgainTime == 0)
+ {
+ ui->dontShowAgainBtn->setText(m_dontShowAgainText);
+ ui->dontShowAgainBtn->setEnabled(true);
+ }
+ else
+ {
+ ui->dontShowAgainBtn->setText(m_dontShowAgainText + QString(" (%1)").arg(m_dontShowAgainTime));
+ }
+ }
+ if (m_closeTime > 0)
+ {
+ m_closeTime--;
+ if (m_closeTime == 0)
+ {
+ ui->closeBtn->setText(m_closeText);
+ ui->closeBtn->setEnabled(true);
+ }
+ else
+ {
+ ui->closeBtn->setText(m_closeText + QString(" (%1)").arg(m_closeTime));
+ }
+ }
+
+ if (m_closeTime == 0 && m_dontShowAgainTime == 0)
+ {
+ killTimer(event->timerId());
+ }
+}
+
+void NotificationDialog::on_dontShowAgainBtn_clicked()
+{
+ done(DontShowAgain);
+}
+void NotificationDialog::on_closeBtn_clicked()
+{
+ done(Normal);
+}
diff --git a/application/dialogs/NotificationDialog.h b/application/dialogs/NotificationDialog.h
new file mode 100644
index 00000000..27b9e853
--- /dev/null
+++ b/application/dialogs/NotificationDialog.h
@@ -0,0 +1,44 @@
+#ifndef NOTIFICATIONDIALOG_H
+#define NOTIFICATIONDIALOG_H
+
+#include <QDialog>
+
+#include "notifications/NotificationChecker.h"
+
+namespace Ui {
+class NotificationDialog;
+}
+
+class NotificationDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit NotificationDialog(const NotificationChecker::NotificationEntry &entry, QWidget *parent = 0);
+ ~NotificationDialog();
+
+ enum ExitCode
+ {
+ Normal,
+ DontShowAgain
+ };
+
+protected:
+ void timerEvent(QTimerEvent *event);
+
+private:
+ Ui::NotificationDialog *ui;
+
+ int m_dontShowAgainTime = 10;
+ int m_closeTime = 5;
+
+ QString m_dontShowAgainText;
+ QString m_closeText;
+
+private
+slots:
+ void on_dontShowAgainBtn_clicked();
+ void on_closeBtn_clicked();
+};
+
+#endif // NOTIFICATIONDIALOG_H
diff --git a/application/dialogs/NotificationDialog.ui b/application/dialogs/NotificationDialog.ui
new file mode 100644
index 00000000..a2a276e9
--- /dev/null
+++ b/application/dialogs/NotificationDialog.ui
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>NotificationDialog</class>
+ <widget class="QDialog" name="NotificationDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>320</width>
+ <height>240</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Dialog</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout" stretch="1,0">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,1">
+ <item>
+ <widget class="QLabel" name="iconLabel">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="messageLabel">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::TextBrowserInteraction</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="dontShowAgainBtn">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Don't show again</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="closeBtn">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Close</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/application/dialogs/ProgressDialog.cpp b/application/dialogs/ProgressDialog.cpp
new file mode 100644
index 00000000..61ebaa28
--- /dev/null
+++ b/application/dialogs/ProgressDialog.cpp
@@ -0,0 +1,125 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ProgressDialog.h"
+#include "ui_ProgressDialog.h"
+
+#include <QKeyEvent>
+
+#include "tasks/Task.h"
+#include "Platform.h"
+
+ProgressDialog::ProgressDialog(QWidget *parent) : QDialog(parent), ui(new Ui::ProgressDialog)
+{
+ MultiMCPlatform::fixWM_CLASS(this);
+ ui->setupUi(this);
+ this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
+ setSkipButton(false);
+ changeProgress(0, 100);
+}
+
+void ProgressDialog::setSkipButton(bool present, QString label)
+{
+ ui->skipButton->setEnabled(present);
+ ui->skipButton->setVisible(present);
+ ui->skipButton->setText(label);
+ updateSize();
+}
+
+void ProgressDialog::on_skipButton_clicked(bool checked)
+{
+ Q_UNUSED(checked);
+ task->abort();
+}
+
+ProgressDialog::~ProgressDialog()
+{
+ delete ui;
+}
+
+void ProgressDialog::updateSize()
+{
+ resize(QSize(480, minimumSizeHint().height()));
+}
+
+int ProgressDialog::exec(ProgressProvider *task)
+{
+ this->task = task;
+
+ // Connect signals.
+ connect(task, SIGNAL(started()), SLOT(onTaskStarted()));
+ connect(task, SIGNAL(failed(QString)), SLOT(onTaskFailed(QString)));
+ connect(task, SIGNAL(succeeded()), SLOT(onTaskSucceeded()));
+ connect(task, SIGNAL(status(QString)), SLOT(changeStatus(const QString &)));
+ connect(task, SIGNAL(progress(qint64, qint64)), SLOT(changeProgress(qint64, qint64)));
+
+ // if this didn't connect to an already running task, invoke start
+ if(!task->isRunning())
+ task->start();
+ if(task->isRunning())
+ return QDialog::exec();
+ else
+ return QDialog::Accepted;
+}
+
+ProgressProvider *ProgressDialog::getTask()
+{
+ return task;
+}
+
+void ProgressDialog::onTaskStarted()
+{
+}
+
+void ProgressDialog::onTaskFailed(QString failure)
+{
+ reject();
+}
+
+void ProgressDialog::onTaskSucceeded()
+{
+ accept();
+}
+
+void ProgressDialog::changeStatus(const QString &status)
+{
+ ui->statusLabel->setText(status);
+ updateSize();
+}
+
+void ProgressDialog::changeProgress(qint64 current, qint64 total)
+{
+ ui->taskProgressBar->setMaximum(total);
+ ui->taskProgressBar->setValue(current);
+}
+
+void ProgressDialog::keyPressEvent(QKeyEvent *e)
+{
+ if (e->key() == Qt::Key_Escape)
+ return;
+ QDialog::keyPressEvent(e);
+}
+
+void ProgressDialog::closeEvent(QCloseEvent *e)
+{
+ if (task && task->isRunning())
+ {
+ e->ignore();
+ }
+ else
+ {
+ QDialog::closeEvent(e);
+ }
+}
diff --git a/application/dialogs/ProgressDialog.h b/application/dialogs/ProgressDialog.h
new file mode 100644
index 00000000..d5153680
--- /dev/null
+++ b/application/dialogs/ProgressDialog.h
@@ -0,0 +1,65 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QDialog>
+
+class ProgressProvider;
+
+namespace Ui
+{
+class ProgressDialog;
+}
+
+class ProgressDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit ProgressDialog(QWidget *parent = 0);
+ ~ProgressDialog();
+
+ void updateSize();
+
+ int exec(ProgressProvider *task);
+
+ void setSkipButton(bool present, QString label = QString());
+
+ ProgressProvider *getTask();
+
+public
+slots:
+ void onTaskStarted();
+ void onTaskFailed(QString failure);
+ void onTaskSucceeded();
+
+ void changeStatus(const QString &status);
+ void changeProgress(qint64 current, qint64 total);
+
+
+private
+slots:
+ void on_skipButton_clicked(bool checked);
+
+protected:
+ virtual void keyPressEvent(QKeyEvent *e);
+ virtual void closeEvent(QCloseEvent *e);
+
+private:
+ Ui::ProgressDialog *ui;
+
+ ProgressProvider *task;
+};
diff --git a/application/dialogs/ProgressDialog.ui b/application/dialogs/ProgressDialog.ui
new file mode 100644
index 00000000..04b8fef3
--- /dev/null
+++ b/application/dialogs/ProgressDialog.ui
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ProgressDialog</class>
+ <widget class="QDialog" name="ProgressDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>100</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>400</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>600</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>Please wait...</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="statusLabel">
+ <property name="text">
+ <string>Task Status...</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QProgressBar" name="taskProgressBar">
+ <property name="value">
+ <number>24</number>
+ </property>
+ <property name="textVisible">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QPushButton" name="skipButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Skip</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/application/dialogs/UpdateDialog.cpp b/application/dialogs/UpdateDialog.cpp
new file mode 100644
index 00000000..f7e0bcd6
--- /dev/null
+++ b/application/dialogs/UpdateDialog.cpp
@@ -0,0 +1,186 @@
+#include "UpdateDialog.h"
+#include "ui_UpdateDialog.h"
+#include "Platform.h"
+#include <QDebug>
+#include "MultiMC.h"
+#include <settings/SettingsObject.h>
+
+UpdateDialog::UpdateDialog(bool hasUpdate, QWidget *parent) : QDialog(parent), ui(new Ui::UpdateDialog)
+{
+ MultiMCPlatform::fixWM_CLASS(this);
+ ui->setupUi(this);
+ auto channel = MMC->settings()->get("UpdateChannel").toString();
+ if(hasUpdate)
+ {
+ ui->label->setText(tr("A new %1 update is available!").arg(channel));
+ }
+ else
+ {
+ ui->label->setText(tr("No %1 updates found. You are running the latest version.").arg(channel));
+ ui->btnUpdateNow->setDisabled(true);
+ ui->btnUpdateOnExit->setDisabled(true);
+ }
+ loadChangelog();
+}
+
+UpdateDialog::~UpdateDialog()
+{
+}
+
+void UpdateDialog::loadChangelog()
+{
+ auto channel = MMC->settings()->get("UpdateChannel").toString();
+ dljob.reset(new NetJob("Changelog"));
+ auto url = QString("https://raw.githubusercontent.com/MultiMC/MultiMC5/%1/changelog.md").arg(channel);
+ changelogDownload = ByteArrayDownload::make(QUrl(url));
+ dljob->addNetAction(changelogDownload);
+ connect(dljob.get(), &NetJob::succeeded, this, &UpdateDialog::changelogLoaded);
+ connect(dljob.get(), &NetJob::failed, this, &UpdateDialog::changelogFailed);
+ dljob->start();
+}
+
+// TODO: this will be replaced.
+QString reprocessMarkdown(QString markdown)
+{
+ QString htmlData;
+ QTextStream html(&htmlData);
+ auto lines = markdown.split(QRegExp("[\r]?[\n]"),QString::KeepEmptyParts);
+ enum
+ {
+ BASE,
+ LIST1,
+ LIST2
+ }state = BASE;
+ html << "<html>";
+ int i = 0;
+ auto procLine = [&](QString line) -> QString
+ {
+ // [GitHub issues](https://github.com/MultiMC/MultiMC5/issues)
+ line.replace(QRegExp("\\[([^\\]]+)\\]\\(([^\\)]+)\\)"), "<a href=\"\\2\">\\1</a>");
+ return line;
+ };
+ for(auto line: lines)
+ {
+ if(line.isEmpty())
+ {
+ // html << "<br />\n";
+ }
+ else switch (state)
+ {
+ case BASE:
+ if(line.startsWith("##"))
+ {
+ html << "<h2>" << procLine(line.mid(2)) << "</h2>\n";
+ }
+ else if(line.startsWith("#"))
+ {
+ html << "<h1>" << procLine(line.mid(1)) << "</h1>\n";
+ }
+ else if(line.startsWith("- "))
+ {
+ state = LIST1;
+ html << "<ul>\n";
+ html << "<li>" << procLine(line.mid(2)) << "</li>\n";
+ }
+ else qCritical() << "Invalid input on line " << i << ": " << line;
+ break;
+ case LIST1:
+ if(line.startsWith("##"))
+ {
+ state = BASE;
+ html << "</ul>\n";
+ html << "<h2>" << procLine(line.mid(2)) << "</h2>\n";
+ }
+ else if(line.startsWith("#"))
+ {
+ state = BASE;
+ html << "</ul>\n";
+ html << "<h1>" << procLine(line.mid(1)) << "</h1>\n";
+ }
+ else if(line.startsWith("- "))
+ {
+ html << "<li>" << procLine(line.mid(2)) << "</li>\n";
+ }
+ else if(line.startsWith(" - "))
+ {
+ state = LIST2;
+ html << "<ul>\n";
+ html << "<li>" << procLine(line.mid(4)) << "</li>\n";
+ }
+ else qCritical() << "Invalid input on line " << i << ": " << line;
+ break;
+ case LIST2:
+ if(line.startsWith("##"))
+ {
+ state = BASE;
+ html << "</ul>\n";
+ html << "</ul>\n";
+ html << "<h2>" << procLine(line.mid(2)) << "</h2>\n";
+ }
+ else if(line.startsWith("#"))
+ {
+ state = BASE;
+ html << "</ul>\n";
+ html << "</ul>\n";
+ html << "<h1>" << procLine(line.mid(1)) << "</h1>\n";
+ }
+ else if(line.startsWith("- "))
+ {
+ state = LIST1;
+ html << "</ul>\n";
+ html << "<li>" << procLine(line.mid(2)) << "</li>\n";
+ }
+ else if(line.startsWith(" - "))
+ {
+ html << "<li>" << procLine(line.mid(4)) << "</li>\n";
+ }
+ else qCritical() << "Invalid input on line " << i << ": " << line;
+ break;
+ }
+ i++;
+ }
+ if(state == LIST2)
+ {
+ html << "</ul>\n";
+ state = LIST1;
+ }
+ if(state == LIST1)
+ {
+ html << "</ul>\n";
+ state = BASE;
+ }
+ if (state != BASE)
+ {
+ qCritical() << "Reprocessing markdown didn't end in a final state!";
+ }
+ html << "</html>\n";
+ qDebug() << htmlData;
+ return htmlData;
+}
+
+void UpdateDialog::changelogLoaded()
+{
+ auto rawMarkdown = QString::fromUtf8(changelogDownload->m_data);
+ auto html = reprocessMarkdown(rawMarkdown);
+ ui->changelogBrowser->setHtml(html);
+}
+
+void UpdateDialog::changelogFailed()
+{
+ ui->changelogBrowser->setHtml(tr("<p align=\"center\" <span style=\"font-size:22pt;\">Failed to fetch changelog...</span></p>"));
+}
+
+void UpdateDialog::on_btnUpdateLater_clicked()
+{
+ reject();
+}
+
+void UpdateDialog::on_btnUpdateNow_clicked()
+{
+ done(UPDATE_NOW);
+}
+
+void UpdateDialog::on_btnUpdateOnExit_clicked()
+{
+ done(UPDATE_ONEXIT);
+}
diff --git a/application/dialogs/UpdateDialog.h b/application/dialogs/UpdateDialog.h
new file mode 100644
index 00000000..2ab2ff7c
--- /dev/null
+++ b/application/dialogs/UpdateDialog.h
@@ -0,0 +1,61 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QDialog>
+#include "net/ByteArrayDownload.h"
+#include "net/NetJob.h"
+
+namespace Ui
+{
+class UpdateDialog;
+}
+
+enum UpdateAction
+{
+ UPDATE_LATER = QDialog::Rejected,
+ UPDATE_NOW = QDialog::Accepted,
+ UPDATE_ONEXIT = 2
+};
+
+class UpdateDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit UpdateDialog(bool hasUpdate = true, QWidget *parent = 0);
+ ~UpdateDialog();
+
+private:
+ Ui::UpdateDialog *ui;
+public slots:
+ void on_btnUpdateNow_clicked();
+ void on_btnUpdateOnExit_clicked();
+ void on_btnUpdateLater_clicked();
+
+ /// Starts loading the changelog
+ void loadChangelog();
+
+ /// Slot for when the chengelog loads successfully.
+ void changelogLoaded();
+
+ /// Slot for when the chengelog fails to load...
+ void changelogFailed();
+
+private:
+ ByteArrayDownloadPtr changelogDownload;
+ NetJobPtr dljob;
+};
diff --git a/application/dialogs/UpdateDialog.ui b/application/dialogs/UpdateDialog.ui
new file mode 100644
index 00000000..06f4f086
--- /dev/null
+++ b/application/dialogs/UpdateDialog.ui
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>UpdateDialog</class>
+ <widget class="QDialog" name="UpdateDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>657</width>
+ <height>673</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>MultiMC Update</string>
+ </property>
+ <property name="windowIcon">
+ <iconset>
+ <normaloff>:/icons/toolbar/checkupdate</normaloff>:/icons/toolbar/checkupdate</iconset>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="font">
+ <font>
+ <pointsize>14</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ <property name="buddy">
+ <cstring>changelogBrowser</cstring>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QTextBrowser" name="changelogBrowser">
+ <property name="html">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Bitstream Vera Sans'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p align=&quot;center&quot; style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:22pt;&quot;&gt;Loading changelog...&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QPushButton" name="btnUpdateNow">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Update now</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnUpdateOnExit">
+ <property name="text">
+ <string>Update after MultiMC closes</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnUpdateLater">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Don't update yet</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>changelogBrowser</tabstop>
+ <tabstop>btnUpdateNow</tabstop>
+ <tabstop>btnUpdateOnExit</tabstop>
+ <tabstop>btnUpdateLater</tabstop>
+ </tabstops>
+ <resources>
+ <include location="../../resources/multimc/multimc.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/application/dialogs/VersionSelectDialog.cpp b/application/dialogs/VersionSelectDialog.cpp
new file mode 100644
index 00000000..d1be4ad0
--- /dev/null
+++ b/application/dialogs/VersionSelectDialog.cpp
@@ -0,0 +1,177 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "VersionSelectDialog.h"
+#include "ui_VersionSelectDialog.h"
+
+#include <QHeaderView>
+
+#include <dialogs/ProgressDialog.h>
+#include "Platform.h"
+
+#include <BaseVersion.h>
+#include <BaseVersionList.h>
+#include <tasks/Task.h>
+#include <modutils.h>
+#include <QDebug>
+
+class VersionSelectProxyModel : public QSortFilterProxyModel
+{
+ Q_OBJECT
+public:
+ VersionSelectProxyModel(QObject *parent = 0) : QSortFilterProxyModel(parent)
+ {
+ }
+
+ struct Filter
+ {
+ QString string;
+ bool exact = false;
+ };
+
+ QHash<int, Filter> filters() const
+ {
+ return m_filters;
+ }
+ void setFilter(const int column, const QString &filter, const bool exact)
+ {
+ Filter f;
+ f.string = filter;
+ f.exact = exact;
+ m_filters[column] = f;
+ invalidateFilter();
+ }
+ void clearFilters()
+ {
+ m_filters.clear();
+ invalidateFilter();
+ }
+
+protected:
+ bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
+ {
+ for (auto it = m_filters.begin(); it != m_filters.end(); ++it)
+ {
+ const QString version =
+ sourceModel()->index(source_row, it.key()).data().toString();
+
+ if (it.value().exact)
+ {
+ if (version != it.value().string)
+ {
+ return false;
+ }
+ continue;
+ }
+
+ if (!Util::versionIsInInterval(version, it.value().string))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ QHash<int, Filter> m_filters;
+};
+
+VersionSelectDialog::VersionSelectDialog(BaseVersionList *vlist, QString title, QWidget *parent,
+ bool cancelable)
+ : QDialog(parent), ui(new Ui::VersionSelectDialog)
+{
+ MultiMCPlatform::fixWM_CLASS(this);
+ ui->setupUi(this);
+ setWindowModality(Qt::WindowModal);
+ setWindowTitle(title);
+
+ m_vlist = vlist;
+
+ m_proxyModel = new VersionSelectProxyModel(this);
+ m_proxyModel->setSourceModel(vlist);
+
+ ui->listView->setModel(m_proxyModel);
+ ui->listView->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
+ ui->listView->header()->setSectionResizeMode(resizeOnColumn, QHeaderView::Stretch);
+
+ if (!cancelable)
+ {
+ ui->buttonBox->button(QDialogButtonBox::Cancel)->setEnabled(false);
+ }
+}
+
+void VersionSelectDialog::setEmptyString(QString emptyString)
+{
+ ui->listView->setEmptyString(emptyString);
+}
+
+VersionSelectDialog::~VersionSelectDialog()
+{
+ delete ui;
+}
+
+void VersionSelectDialog::setResizeOn(int column)
+{
+ ui->listView->header()->setSectionResizeMode(resizeOnColumn, QHeaderView::ResizeToContents);
+ resizeOnColumn = column;
+ ui->listView->header()->setSectionResizeMode(resizeOnColumn, QHeaderView::Stretch);
+}
+
+int VersionSelectDialog::exec()
+{
+ QDialog::open();
+ if (!m_vlist->isLoaded())
+ {
+ loadList();
+ }
+ m_proxyModel->invalidate();
+ return QDialog::exec();
+}
+
+void VersionSelectDialog::loadList()
+{
+ Task *loadTask = m_vlist->getLoadTask();
+ if (!loadTask)
+ {
+ return;
+ }
+ ProgressDialog *taskDlg = new ProgressDialog(this);
+ loadTask->setParent(taskDlg);
+ taskDlg->exec(loadTask);
+ delete taskDlg;
+}
+
+BaseVersionPtr VersionSelectDialog::selectedVersion() const
+{
+ auto currentIndex = ui->listView->selectionModel()->currentIndex();
+ auto variant = m_proxyModel->data(currentIndex, BaseVersionList::VersionPointerRole);
+ return variant.value<BaseVersionPtr>();
+}
+
+void VersionSelectDialog::on_refreshButton_clicked()
+{
+ loadList();
+}
+
+void VersionSelectDialog::setExactFilter(int column, QString filter)
+{
+ m_proxyModel->setFilter(column, filter, true);
+}
+
+void VersionSelectDialog::setFuzzyFilter(int column, QString filter)
+{
+ m_proxyModel->setFilter(column, filter, false);
+}
+
+#include "VersionSelectDialog.moc"
diff --git a/application/dialogs/VersionSelectDialog.h b/application/dialogs/VersionSelectDialog.h
new file mode 100644
index 00000000..69e52fe6
--- /dev/null
+++ b/application/dialogs/VersionSelectDialog.h
@@ -0,0 +1,66 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QDialog>
+#include <QSortFilterProxyModel>
+
+#include "BaseVersion.h"
+
+class BaseVersionList;
+
+namespace Ui
+{
+class VersionSelectDialog;
+}
+
+class VersionSelectProxyModel;
+
+class VersionSelectDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit VersionSelectDialog(BaseVersionList *vlist, QString title, QWidget *parent = 0,
+ bool cancelable = true);
+ ~VersionSelectDialog();
+
+ virtual int exec();
+
+ //! Starts a task that loads the list.
+ void loadList();
+
+ BaseVersionPtr selectedVersion() const;
+
+ void setFuzzyFilter(int column, QString filter);
+ void setExactFilter(int column, QString filter);
+ void setEmptyString(QString emptyString);
+ void setResizeOn(int column);
+ void setUseLatest(const bool useLatest);
+
+private
+slots:
+ void on_refreshButton_clicked();
+
+private:
+ Ui::VersionSelectDialog *ui;
+
+ BaseVersionList *m_vlist;
+
+ VersionSelectProxyModel *m_proxyModel;
+
+ int resizeOnColumn = 0;
+};
diff --git a/application/dialogs/VersionSelectDialog.ui b/application/dialogs/VersionSelectDialog.ui
new file mode 100644
index 00000000..e4014e11
--- /dev/null
+++ b/application/dialogs/VersionSelectDialog.ui
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>VersionSelectDialog</class>
+ <widget class="QDialog" name="VersionSelectDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>347</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Choose Version</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="VersionListView" name="listView">
+ <property name="horizontalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOff</enum>
+ </property>
+ <property name="alternatingRowColors">
+ <bool>true</bool>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>false</bool>
+ </property>
+ <property name="itemsExpandable">
+ <bool>false</bool>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <attribute name="headerCascadingSectionResizes">
+ <bool>true</bool>
+ </attribute>
+ <attribute name="headerStretchLastSection">
+ <bool>false</bool>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QPushButton" name="refreshButton">
+ <property name="toolTip">
+ <string>Reloads the version list.</string>
+ </property>
+ <property name="text">
+ <string>&amp;Refresh</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>VersionListView</class>
+ <extends>QTreeView</extends>
+ <header>widgets/VersionListView.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>VersionSelectDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>257</x>
+ <y>290</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>VersionSelectDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>325</x>
+ <y>290</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/application/groupview/GroupView.cpp b/application/groupview/GroupView.cpp
new file mode 100644
index 00000000..89694b87
--- /dev/null
+++ b/application/groupview/GroupView.cpp
@@ -0,0 +1,1003 @@
+#include "GroupView.h"
+
+#include <QPainter>
+#include <QApplication>
+#include <QtMath>
+#include <QMouseEvent>
+#include <QListView>
+#include <QPersistentModelIndex>
+#include <QDrag>
+#include <QMimeData>
+#include <QCache>
+#include <QScrollBar>
+
+#include "VisualGroup.h"
+#include <QDebug>
+
+template <typename T> bool listsIntersect(const QList<T> &l1, const QList<T> t2)
+{
+ for (auto &item : l1)
+ {
+ if (t2.contains(item))
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+GroupView::GroupView(QWidget *parent)
+ : QAbstractItemView(parent)
+{
+ setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+ setAcceptDrops(true);
+ setAutoScroll(true);
+}
+
+GroupView::~GroupView()
+{
+ qDeleteAll(m_groups);
+ m_groups.clear();
+}
+
+void GroupView::setModel(QAbstractItemModel *model)
+{
+ QAbstractItemView::setModel(model);
+ connect(model, &QAbstractItemModel::modelReset, this, &GroupView::modelReset);
+}
+
+void GroupView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight,
+ const QVector<int> &roles)
+{
+ scheduleDelayedItemsLayout();
+}
+void GroupView::rowsInserted(const QModelIndex &parent, int start, int end)
+{
+ scheduleDelayedItemsLayout();
+}
+
+void GroupView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
+{
+ scheduleDelayedItemsLayout();
+}
+
+class LocaleString : public QString
+{
+public:
+ LocaleString(const char *s) : QString(s)
+ {
+ }
+ LocaleString(const QString &s) : QString(s)
+ {
+ }
+};
+
+inline bool operator<(const LocaleString &lhs, const LocaleString &rhs)
+{
+ return (QString::localeAwareCompare(lhs, rhs) < 0);
+}
+
+void GroupView::updateGeometries()
+{
+ geometryCache.clear();
+ int previousScroll = verticalScrollBar()->value();
+
+ QMap<LocaleString, VisualGroup *> cats;
+
+ for (int i = 0; i < model()->rowCount(); ++i)
+ {
+ const QString groupName =
+ model()->index(i, 0).data(GroupViewRoles::GroupRole).toString();
+ if (!cats.contains(groupName))
+ {
+ VisualGroup *old = this->category(groupName);
+ if (old)
+ {
+ cats.insert(groupName, new VisualGroup(old));
+ }
+ else
+ {
+ cats.insert(groupName, new VisualGroup(groupName, this));
+ }
+ }
+ }
+
+ /*if (m_editedCategory)
+ {
+ m_editedCategory = cats[m_editedCategory->text];
+ }*/
+
+ qDeleteAll(m_groups);
+ m_groups = cats.values();
+
+ for (auto cat : m_groups)
+ {
+ cat->update();
+ }
+
+ if (m_groups.isEmpty())
+ {
+ verticalScrollBar()->setRange(0, 0);
+ }
+ else
+ {
+ int totalHeight = 0;
+ // top margin
+ totalHeight += m_categoryMargin;
+ int itemScroll = 0;
+ for (auto category : m_groups)
+ {
+ category->m_verticalPosition = totalHeight;
+ totalHeight += category->totalHeight() + m_categoryMargin;
+ if(!itemScroll && category->totalHeight() != 0)
+ {
+ itemScroll = category->contentHeight() / category->numRows();
+ }
+ }
+ // do not divide by zero
+ if(itemScroll == 0)
+ itemScroll = 64;
+
+ totalHeight += m_bottomMargin;
+ verticalScrollBar()->setSingleStep ( itemScroll );
+ const int rowsPerPage = qMax ( viewport()->height() / itemScroll, 1 );
+ verticalScrollBar()->setPageStep ( rowsPerPage * itemScroll );
+
+ verticalScrollBar()->setRange(0, totalHeight - height());
+ }
+
+ verticalScrollBar()->setValue(qMin(previousScroll, verticalScrollBar()->maximum()));
+
+ viewport()->update();
+}
+
+void GroupView::modelReset()
+{
+ scheduleDelayedItemsLayout();
+ executeDelayedItemsLayout();
+}
+
+bool GroupView::isIndexHidden(const QModelIndex &index) const
+{
+ VisualGroup *cat = category(index);
+ if (cat)
+ {
+ return cat->collapsed;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+VisualGroup *GroupView::category(const QModelIndex &index) const
+{
+ return category(index.data(GroupViewRoles::GroupRole).toString());
+}
+
+VisualGroup *GroupView::category(const QString &cat) const
+{
+ for (auto group : m_groups)
+ {
+ if (group->text == cat)
+ {
+ return group;
+ }
+ }
+ return nullptr;
+}
+
+VisualGroup *GroupView::categoryAt(const QPoint &pos) const
+{
+ for (auto group : m_groups)
+ {
+ if(group->hitScan(pos) & VisualGroup::CheckboxHit)
+ {
+ return group;
+ }
+ }
+ return nullptr;
+}
+
+int GroupView::calculateItemsPerRow() const
+{
+ return qFloor((qreal)(contentWidth()) / (qreal)(itemWidth() + m_spacing));
+}
+
+int GroupView::contentWidth() const
+{
+ return width() - m_leftMargin - m_rightMargin;
+}
+
+int GroupView::itemWidth() const
+{
+ return m_itemWidth;
+}
+
+void GroupView::mousePressEvent(QMouseEvent *event)
+{
+ // endCategoryEditor();
+
+ QPoint visualPos = event->pos();
+ QPoint geometryPos = event->pos() + offset();
+
+ QPersistentModelIndex index = indexAt(visualPos);
+
+ m_pressedIndex = index;
+ m_pressedAlreadySelected = selectionModel()->isSelected(m_pressedIndex);
+ m_pressedPosition = geometryPos;
+
+ m_pressedCategory = categoryAt(geometryPos);
+ if (m_pressedCategory)
+ {
+ setState(m_pressedCategory->collapsed ? ExpandingState : CollapsingState);
+ event->accept();
+ return;
+ }
+
+ if (index.isValid() && (index.flags() & Qt::ItemIsEnabled))
+ {
+ if(index != currentIndex())
+ {
+ // FIXME: better!
+ m_currentCursorColumn = -1;
+ }
+ // we disable scrollTo for mouse press so the item doesn't change position
+ // when the user is interacting with it (ie. clicking on it)
+ bool autoScroll = hasAutoScroll();
+ setAutoScroll(false);
+ selectionModel()->setCurrentIndex(index, QItemSelectionModel::NoUpdate);
+
+ setAutoScroll(autoScroll);
+ QRect rect(visualPos, visualPos);
+ setSelection(rect, QItemSelectionModel::ClearAndSelect);
+
+ // signal handlers may change the model
+ emit pressed(index);
+ }
+ else
+ {
+ // Forces a finalize() even if mouse is pressed, but not on a item
+ selectionModel()->select(QModelIndex(), QItemSelectionModel::Select);
+ }
+}
+
+void GroupView::mouseMoveEvent(QMouseEvent *event)
+{
+ QPoint topLeft;
+ QPoint visualPos = event->pos();
+ QPoint geometryPos = event->pos() + offset();
+
+ if (state() == ExpandingState || state() == CollapsingState)
+ {
+ return;
+ }
+
+ if (state() == DraggingState)
+ {
+ topLeft = m_pressedPosition - offset();
+ if ((topLeft - event->pos()).manhattanLength() > QApplication::startDragDistance())
+ {
+ m_pressedIndex = QModelIndex();
+ startDrag(model()->supportedDragActions());
+ setState(NoState);
+ stopAutoScroll();
+ }
+ return;
+ }
+
+ if (selectionMode() != SingleSelection)
+ {
+ topLeft = m_pressedPosition - offset();
+ }
+ else
+ {
+ topLeft = geometryPos;
+ }
+
+ if (m_pressedIndex.isValid() && (state() != DragSelectingState) &&
+ (event->buttons() != Qt::NoButton) && !selectedIndexes().isEmpty())
+ {
+ setState(DraggingState);
+ return;
+ }
+
+ if ((event->buttons() & Qt::LeftButton) && selectionModel())
+ {
+ setState(DragSelectingState);
+
+ setSelection(QRect(visualPos, visualPos), QItemSelectionModel::ClearAndSelect);
+ QModelIndex index = indexAt(visualPos);
+
+ // set at the end because it might scroll the view
+ if (index.isValid() && (index != selectionModel()->currentIndex()) &&
+ (index.flags() & Qt::ItemIsEnabled))
+ {
+ selectionModel()->setCurrentIndex(index, QItemSelectionModel::NoUpdate);
+ }
+ }
+}
+
+void GroupView::mouseReleaseEvent(QMouseEvent *event)
+{
+ QPoint visualPos = event->pos();
+ QPoint geometryPos = event->pos() + offset();
+ QPersistentModelIndex index = indexAt(visualPos);
+
+ bool click = (index == m_pressedIndex && index.isValid()) ||
+ (m_pressedCategory && m_pressedCategory == categoryAt(geometryPos));
+
+ if (click && m_pressedCategory)
+ {
+ if (state() == ExpandingState)
+ {
+ m_pressedCategory->collapsed = false;
+ updateGeometries();
+ viewport()->update();
+ event->accept();
+ return;
+ }
+ else if (state() == CollapsingState)
+ {
+ m_pressedCategory->collapsed = true;
+ updateGeometries();
+ viewport()->update();
+ event->accept();
+ return;
+ }
+ }
+
+ m_ctrlDragSelectionFlag = QItemSelectionModel::NoUpdate;
+
+ setState(NoState);
+
+ if (click)
+ {
+ if (event->button() == Qt::LeftButton)
+ {
+ emit clicked(index);
+ }
+ QStyleOptionViewItem option = viewOptions();
+ if (m_pressedAlreadySelected)
+ {
+ option.state |= QStyle::State_Selected;
+ }
+ if ((model()->flags(index) & Qt::ItemIsEnabled) &&
+ style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, &option, this))
+ {
+ emit activated(index);
+ }
+ }
+}
+
+void GroupView::mouseDoubleClickEvent(QMouseEvent *event)
+{
+ QModelIndex index = indexAt(event->pos());
+ if (!index.isValid() || !(index.flags() & Qt::ItemIsEnabled) || (m_pressedIndex != index))
+ {
+ QMouseEvent me(QEvent::MouseButtonPress, event->localPos(), event->windowPos(),
+ event->screenPos(), event->button(), event->buttons(),
+ event->modifiers());
+ mousePressEvent(&me);
+ return;
+ }
+ // signal handlers may change the model
+ QPersistentModelIndex persistent = index;
+ emit doubleClicked(persistent);
+}
+
+void GroupView::paintEvent(QPaintEvent *event)
+{
+ executeDelayedItemsLayout();
+
+ QPainter painter(this->viewport());
+
+ QStyleOptionViewItemV4 option(viewOptions());
+ option.widget = this;
+
+ int wpWidth = viewport()->width();
+ option.rect.setWidth(wpWidth);
+ for (int i = 0; i < m_groups.size(); ++i)
+ {
+ VisualGroup *category = m_groups.at(i);
+ int y = category->verticalPosition();
+ y -= verticalOffset();
+ QRect backup = option.rect;
+ int height = category->totalHeight();
+ option.rect.setTop(y);
+ option.rect.setHeight(height);
+ option.rect.setLeft(m_leftMargin);
+ option.rect.setRight(wpWidth - m_rightMargin);
+ category->drawHeader(&painter, option);
+ y += category->totalHeight() + m_categoryMargin;
+ option.rect = backup;
+ }
+
+ for (int i = 0; i < model()->rowCount(); ++i)
+ {
+ const QModelIndex index = model()->index(i, 0);
+ if (isIndexHidden(index))
+ {
+ continue;
+ }
+ Qt::ItemFlags flags = index.flags();
+ option.rect = visualRect(index);
+ option.features |=
+ QStyleOptionViewItemV2::WrapText; // FIXME: what is the meaning of this anyway?
+ if (flags & Qt::ItemIsSelectable && selectionModel()->isSelected(index))
+ {
+ option.state |= selectionModel()->isSelected(index) ? QStyle::State_Selected
+ : QStyle::State_None;
+ }
+ else
+ {
+ option.state &= ~QStyle::State_Selected;
+ }
+ option.state |= (index == currentIndex()) ? QStyle::State_HasFocus : QStyle::State_None;
+ if (!(flags & Qt::ItemIsEnabled))
+ {
+ option.state &= ~QStyle::State_Enabled;
+ }
+ itemDelegate()->paint(&painter, option, index);
+ }
+
+ /*
+ * Drop indicators for manual reordering...
+ */
+#if 0
+ if (!m_lastDragPosition.isNull())
+ {
+ QPair<Group *, int> pair = rowDropPos(m_lastDragPosition);
+ Group *category = pair.first;
+ int row = pair.second;
+ if (category)
+ {
+ int internalRow = row - category->firstItemIndex;
+ QLine line;
+ if (internalRow >= category->numItems())
+ {
+ QRect toTheRightOfRect = visualRect(category->lastItem());
+ line = QLine(toTheRightOfRect.topRight(), toTheRightOfRect.bottomRight());
+ }
+ else
+ {
+ QRect toTheLeftOfRect = visualRect(model()->index(row, 0));
+ line = QLine(toTheLeftOfRect.topLeft(), toTheLeftOfRect.bottomLeft());
+ }
+ painter.save();
+ painter.setPen(QPen(Qt::black, 3));
+ painter.drawLine(line);
+ painter.restore();
+ }
+ }
+#endif
+}
+
+void GroupView::resizeEvent(QResizeEvent *event)
+{
+ int newItemsPerRow = calculateItemsPerRow();
+ if(newItemsPerRow != m_currentItemsPerRow)
+ {
+ m_currentCursorColumn = -1;
+ m_currentItemsPerRow = newItemsPerRow;
+ updateGeometries();
+ }
+}
+
+void GroupView::dragEnterEvent(QDragEnterEvent *event)
+{
+ if (!isDragEventAccepted(event))
+ {
+ return;
+ }
+ m_lastDragPosition = event->pos() + offset();
+ viewport()->update();
+ event->accept();
+}
+
+void GroupView::dragMoveEvent(QDragMoveEvent *event)
+{
+ if (!isDragEventAccepted(event))
+ {
+ return;
+ }
+ m_lastDragPosition = event->pos() + offset();
+ viewport()->update();
+ event->accept();
+}
+
+void GroupView::dragLeaveEvent(QDragLeaveEvent *event)
+{
+ m_lastDragPosition = QPoint();
+ viewport()->update();
+}
+
+void GroupView::dropEvent(QDropEvent *event)
+{
+ m_lastDragPosition = QPoint();
+
+ stopAutoScroll();
+ setState(NoState);
+
+ if (event->source() != this || !(event->possibleActions() & Qt::MoveAction))
+ {
+ return;
+ }
+
+ QPair<VisualGroup *, int> dropPos = rowDropPos(event->pos() + offset());
+ const VisualGroup *category = dropPos.first;
+ const int row = dropPos.second;
+
+ if (row == -1)
+ {
+ viewport()->update();
+ return;
+ }
+
+ const QString categoryText = category->text;
+ if (model()->dropMimeData(event->mimeData(), Qt::MoveAction, row, 0, QModelIndex()))
+ {
+ model()->setData(model()->index(row, 0), categoryText,
+ GroupViewRoles::GroupRole);
+ event->setDropAction(Qt::MoveAction);
+ event->accept();
+ }
+ updateGeometries();
+ viewport()->update();
+}
+
+void GroupView::startDrag(Qt::DropActions supportedActions)
+{
+ QModelIndexList indexes = selectionModel()->selectedIndexes();
+ if(indexes.count() == 0)
+ return;
+
+ QMimeData *data = model()->mimeData(indexes);
+ if (!data)
+ {
+ return;
+ }
+ QRect rect;
+ QPixmap pixmap = renderToPixmap(indexes, &rect);
+ //rect.translate(offset());
+ // rect.adjust(horizontalOffset(), verticalOffset(), 0, 0);
+ QDrag *drag = new QDrag(this);
+ drag->setPixmap(pixmap);
+ drag->setMimeData(data);
+ Qt::DropAction defaultDropAction = Qt::IgnoreAction;
+ if (this->defaultDropAction() != Qt::IgnoreAction &&
+ (supportedActions & this->defaultDropAction()))
+ {
+ defaultDropAction = this->defaultDropAction();
+ }
+ if (drag->exec(supportedActions, defaultDropAction) == Qt::MoveAction)
+ {
+ const QItemSelection selection = selectionModel()->selection();
+
+ for (auto it = selection.constBegin(); it != selection.constEnd(); ++it)
+ {
+ QModelIndex parent = (*it).parent();
+ if ((*it).left() != 0)
+ {
+ continue;
+ }
+ if ((*it).right() != (model()->columnCount(parent) - 1))
+ {
+ continue;
+ }
+ int count = (*it).bottom() - (*it).top() + 1;
+ model()->removeRows((*it).top(), count, parent);
+ }
+ }
+}
+
+QRect GroupView::visualRect(const QModelIndex &index) const
+{
+ return geometryRect(index).translated(-offset());
+}
+
+QRect GroupView::geometryRect(const QModelIndex &index) const
+{
+ if (!index.isValid() || isIndexHidden(index) || index.column() > 0)
+ {
+ return QRect();
+ }
+
+ int row = index.row();
+ if(geometryCache.contains(row))
+ {
+ return *geometryCache[row];
+ }
+
+ const VisualGroup *cat = category(index);
+ QPair<int, int> pos = cat->positionOf(index);
+ int x = pos.first;
+ // int y = pos.second;
+
+ QRect out;
+ out.setTop(cat->verticalPosition() + cat->headerHeight() + 5 + cat->rowTopOf(index));
+ out.setLeft(m_spacing + x * (itemWidth() + m_spacing));
+ out.setSize(itemDelegate()->sizeHint(viewOptions(), index));
+ geometryCache.insert(row, new QRect(out));
+ return out;
+}
+
+QModelIndex GroupView::indexAt(const QPoint &point) const
+{
+ for (int i = 0; i < model()->rowCount(); ++i)
+ {
+ QModelIndex index = model()->index(i, 0);
+ if (visualRect(index).contains(point))
+ {
+ return index;
+ }
+ }
+ return QModelIndex();
+}
+
+void GroupView::setSelection(const QRect &rect,
+ const QItemSelectionModel::SelectionFlags commands)
+{
+ for (int i = 0; i < model()->rowCount(); ++i)
+ {
+ QModelIndex index = model()->index(i, 0);
+ QRect itemRect = visualRect(index);
+ if (itemRect.intersects(rect))
+ {
+ selectionModel()->select(index, commands);
+ update(itemRect.translated(-offset()));
+ }
+ }
+}
+
+QPixmap GroupView::renderToPixmap(const QModelIndexList &indices, QRect *r) const
+{
+ Q_ASSERT(r);
+ auto paintPairs = draggablePaintPairs(indices, r);
+ if (paintPairs.isEmpty())
+ {
+ return QPixmap();
+ }
+ QPixmap pixmap(r->size());
+ pixmap.fill(Qt::transparent);
+ QPainter painter(&pixmap);
+ QStyleOptionViewItem option = viewOptions();
+ option.state |= QStyle::State_Selected;
+ for (int j = 0; j < paintPairs.count(); ++j)
+ {
+ option.rect = paintPairs.at(j).first.translated(-r->topLeft());
+ const QModelIndex &current = paintPairs.at(j).second;
+ itemDelegate()->paint(&painter, option, current);
+ }
+ return pixmap;
+}
+
+QList<QPair<QRect, QModelIndex>> GroupView::draggablePaintPairs(const QModelIndexList &indices,
+ QRect *r) const
+{
+ Q_ASSERT(r);
+ QRect &rect = *r;
+ QList<QPair<QRect, QModelIndex>> ret;
+ for (int i = 0; i < indices.count(); ++i)
+ {
+ const QModelIndex &index = indices.at(i);
+ const QRect current = geometryRect(index);
+ ret += qMakePair(current, index);
+ rect |= current;
+ }
+ return ret;
+}
+
+bool GroupView::isDragEventAccepted(QDropEvent *event)
+{
+ return false;
+}
+
+QPair<VisualGroup *, int> GroupView::rowDropPos(const QPoint &pos)
+{
+ return qMakePair<VisualGroup*, int>(nullptr, -1);
+ // FIXME: PIXIE DUST.
+ /*
+ // check that we aren't on a category header and calculate which category we're in
+ VisualGroup *category = 0;
+ {
+ int y = 0;
+ for (auto cat : m_groups)
+ {
+ if (pos.y() > y && pos.y() < (y + cat->headerHeight()))
+ {
+ return qMakePair<VisualGroup*, int>(nullptr, -1);
+ }
+ y += cat->totalHeight() + m_categoryMargin;
+ if (pos.y() < y)
+ {
+ category = cat;
+ break;
+ }
+ }
+ if (category == 0)
+ {
+ return qMakePair<VisualGroup*, int>(nullptr, -1);
+ }
+ }
+
+ QList<QModelIndex> indices = category->items();
+
+ // calculate the internal column
+ int internalColumn = -1;
+ {
+ const int itemWidth = this->itemWidth();
+ if (pos.x() >= (itemWidth * itemsPerRow()))
+ {
+ internalColumn = itemsPerRow();
+ }
+ else
+ {
+ for (int i = 0, c = 0; i < contentWidth(); i += itemWidth + 10 , ++c)
+ {
+ if (pos.x() > (i - itemWidth / 2) && pos.x() <= (i + itemWidth / 2))
+ {
+ internalColumn = c;
+ break;
+ }
+ }
+ }
+ if (internalColumn == -1)
+ {
+ return qMakePair<VisualGroup*, int>(nullptr, -1);
+ }
+ }
+
+ // calculate the internal row
+ int internalRow = -1;
+ {
+ // FIXME rework the drag and drop code
+ const int top = category->verticalPosition();
+ for (int r = 0, h = top; r < category->numRows();
+ h += itemHeightForCategoryRow(category, r), ++r)
+ {
+ if (pos.y() > h && pos.y() < (h + itemHeightForCategoryRow(category, r)))
+ {
+ internalRow = r;
+ break;
+ }
+ }
+ if (internalRow == -1)
+ {
+ return qMakePair<VisualGroup*, int>(nullptr, -1);
+ }
+ // this happens if we're in the margin between a one category and another
+ // categories header
+ if (internalRow > (indices.size() / itemsPerRow()))
+ {
+ return qMakePair<VisualGroup*, int>(nullptr, -1);
+ }
+ }
+
+ // flaten the internalColumn/internalRow to one row
+ int categoryRow = internalRow * itemsPerRow() + internalColumn;
+
+ // this is used if we're past the last item
+ if (categoryRow >= indices.size())
+ {
+ return qMakePair(category, indices.last().row() + 1);
+ }
+
+ return qMakePair(category, indices.at(categoryRow).row());
+ */
+}
+
+QPoint GroupView::offset() const
+{
+ return QPoint(horizontalOffset(), verticalOffset());
+}
+
+QRegion GroupView::visualRegionForSelection(const QItemSelection &selection) const
+{
+ QRegion region;
+ for (auto &range : selection)
+ {
+ int start_row = range.top();
+ int end_row = range.bottom();
+ for (int row = start_row; row <= end_row; ++row)
+ {
+ int start_column = range.left();
+ int end_column = range.right();
+ for (int column = start_column; column <= end_column; ++column)
+ {
+ QModelIndex index = model()->index(row, column, rootIndex());
+ region += visualRect(index); // OK
+ }
+ }
+ }
+ return region;
+}
+
+QModelIndex GroupView::moveCursor(QAbstractItemView::CursorAction cursorAction,
+ Qt::KeyboardModifiers modifiers)
+{
+ auto current = currentIndex();
+ if(!current.isValid())
+ {
+ return current;
+ }
+ auto cat = category(current);
+ int group_index = m_groups.indexOf(cat);
+ if(group_index < 0)
+ return current;
+
+ auto real_group = m_groups[group_index];
+ int beginning_row = 0;
+ for(auto group: m_groups)
+ {
+ if(group == real_group)
+ break;
+ beginning_row += group->numRows();
+ }
+
+ QPair<int, int> pos = cat->positionOf(current);
+ int column = pos.first;
+ int row = pos.second;
+ if(m_currentCursorColumn < 0)
+ {
+ m_currentCursorColumn = column;
+ }
+ switch(cursorAction)
+ {
+ case MoveUp:
+ {
+ if(row == 0)
+ {
+ int prevgroupindex = group_index-1;
+ while(prevgroupindex >= 0)
+ {
+ auto prevgroup = m_groups[prevgroupindex];
+ if(prevgroup->collapsed)
+ {
+ prevgroupindex--;
+ continue;
+ }
+ int newRow = prevgroup->numRows() - 1;
+ int newRowSize = prevgroup->rows[newRow].size();
+ int newColumn = m_currentCursorColumn;
+ if (m_currentCursorColumn >= newRowSize)
+ {
+ newColumn = newRowSize - 1;
+ }
+ return prevgroup->rows[newRow][newColumn];
+ }
+ }
+ else
+ {
+ int newRow = row - 1;
+ int newRowSize = cat->rows[newRow].size();
+ int newColumn = m_currentCursorColumn;
+ if (m_currentCursorColumn >= newRowSize)
+ {
+ newColumn = newRowSize - 1;
+ }
+ return cat->rows[newRow][newColumn];
+ }
+ return current;
+ }
+ case MoveDown:
+ {
+ if(row == cat->rows.size() - 1)
+ {
+ int nextgroupindex = group_index+1;
+ while (nextgroupindex < m_groups.size())
+ {
+ auto nextgroup = m_groups[nextgroupindex];
+ if(nextgroup->collapsed)
+ {
+ nextgroupindex++;
+ continue;
+ }
+ int newRowSize = nextgroup->rows[0].size();
+ int newColumn = m_currentCursorColumn;
+ if (m_currentCursorColumn >= newRowSize)
+ {
+ newColumn = newRowSize - 1;
+ }
+ return nextgroup->rows[0][newColumn];
+ }
+ }
+ else
+ {
+ int newRow = row + 1;
+ int newRowSize = cat->rows[newRow].size();
+ int newColumn = m_currentCursorColumn;
+ if (m_currentCursorColumn >= newRowSize)
+ {
+ newColumn = newRowSize - 1;
+ }
+ return cat->rows[newRow][newColumn];
+ }
+ return current;
+ }
+ case MoveLeft:
+ {
+ if(column > 0)
+ {
+ m_currentCursorColumn = column - 1;
+ return cat->rows[row][column - 1];
+ }
+ // TODO: moving to previous line
+ return current;
+ }
+ case MoveRight:
+ {
+ if(column < cat->rows[row].size() - 1)
+ {
+ m_currentCursorColumn = column + 1;
+ return cat->rows[row][column + 1];
+ }
+ // TODO: moving to next line
+ return current;
+ }
+ case MoveHome:
+ {
+ m_currentCursorColumn = 0;
+ return cat->rows[row][0];
+ }
+ case MoveEnd:
+ {
+ auto last = cat->rows[row].size() - 1;
+ m_currentCursorColumn = last;
+ return cat->rows[row][last];
+ }
+ default:
+ break;
+ }
+ return current;
+}
+
+int GroupView::horizontalOffset() const
+{
+ return horizontalScrollBar()->value();
+}
+
+int GroupView::verticalOffset() const
+{
+ return verticalScrollBar()->value();
+}
+
+void GroupView::scrollContentsBy(int dx, int dy)
+{
+ scrollDirtyRegion(dx, dy);
+ viewport()->scroll(dx, dy);
+}
+
+void GroupView::scrollTo(const QModelIndex &index, ScrollHint hint)
+{
+ if (!index.isValid())
+ return;
+
+ const QRect rect = visualRect(index);
+ if (hint == EnsureVisible && viewport()->rect().contains(rect))
+ {
+ viewport()->update(rect);
+ return;
+ }
+
+ verticalScrollBar()->setValue(verticalScrollToValue(index, rect, hint));
+}
+
+int GroupView::verticalScrollToValue(const QModelIndex &index, const QRect &rect,
+ QListView::ScrollHint hint) const
+{
+ const QRect area = viewport()->rect();
+ const bool above = (hint == QListView::EnsureVisible && rect.top() < area.top());
+ const bool below = (hint == QListView::EnsureVisible && rect.bottom() > area.bottom());
+
+ int verticalValue = verticalScrollBar()->value();
+ QRect adjusted = rect.adjusted(-spacing(), -spacing(), spacing(), spacing());
+ if (hint == QListView::PositionAtTop || above)
+ verticalValue += adjusted.top();
+ else if (hint == QListView::PositionAtBottom || below)
+ verticalValue += qMin(adjusted.top(), adjusted.bottom() - area.height() + 1);
+ else if (hint == QListView::PositionAtCenter)
+ verticalValue += adjusted.top() - ((area.height() - adjusted.height()) / 2);
+ return verticalValue;
+}
diff --git a/application/groupview/GroupView.h b/application/groupview/GroupView.h
new file mode 100644
index 00000000..93e45ed7
--- /dev/null
+++ b/application/groupview/GroupView.h
@@ -0,0 +1,125 @@
+#pragma once
+
+#include <QListView>
+#include <QLineEdit>
+#include <QScrollBar>
+#include <QCache>
+
+struct GroupViewRoles
+{
+ enum
+ {
+ GroupRole = Qt::UserRole,
+ ProgressValueRole,
+ ProgressMaximumRole
+ };
+};
+
+struct VisualGroup;
+
+class GroupView : public QAbstractItemView
+{
+ Q_OBJECT
+
+public:
+ GroupView(QWidget *parent = 0);
+ ~GroupView();
+
+ void setModel(QAbstractItemModel *model) override;
+
+ /// return geometry rectangle occupied by the specified model item
+ QRect geometryRect(const QModelIndex &index) const;
+ /// return visual rectangle occupied by the specified model item
+ virtual QRect visualRect(const QModelIndex &index) const override;
+ /// get the model index at the specified visual point
+ virtual QModelIndex indexAt(const QPoint &point) const override;
+ void setSelection(const QRect &rect,
+ const QItemSelectionModel::SelectionFlags commands) override;
+
+ virtual int horizontalOffset() const override;
+ virtual int verticalOffset() const override;
+ virtual void scrollContentsBy(int dx, int dy) override;
+ virtual void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) override;
+
+ virtual QModelIndex moveCursor(CursorAction cursorAction,
+ Qt::KeyboardModifiers modifiers) override;
+
+ virtual QRegion visualRegionForSelection(const QItemSelection &selection) const override;
+
+ int spacing() const
+ {
+ return m_spacing;
+ };
+protected
+slots:
+ virtual void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight,
+ const QVector<int> &roles) override;
+ virtual void rowsInserted(const QModelIndex &parent, int start, int end) override;
+ virtual void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) override;
+ virtual void updateGeometries() override;
+ void modelReset();
+
+protected:
+ virtual bool isIndexHidden(const QModelIndex &index) const override;
+ void mousePressEvent(QMouseEvent *event) override;
+ void mouseMoveEvent(QMouseEvent *event) override;
+ void mouseReleaseEvent(QMouseEvent *event) override;
+ void mouseDoubleClickEvent(QMouseEvent *event) override;
+ void paintEvent(QPaintEvent *event) override;
+ void resizeEvent(QResizeEvent *event) override;
+
+ void dragEnterEvent(QDragEnterEvent *event) override;
+ void dragMoveEvent(QDragMoveEvent *event) override;
+ void dragLeaveEvent(QDragLeaveEvent *event) override;
+ void dropEvent(QDropEvent *event) override;
+
+ void startDrag(Qt::DropActions supportedActions) override;
+
+private:
+ friend struct VisualGroup;
+ QList<VisualGroup *> m_groups;
+
+ // geometry
+ int m_leftMargin = 5;
+ int m_rightMargin = 5;
+ int m_bottomMargin = 5;
+ int m_categoryMargin = 5;
+ int m_spacing = 5;
+ int m_itemWidth = 100;
+ int m_currentItemsPerRow = -1;
+ int m_currentCursorColumn= -1;
+ mutable QCache<int, QRect> geometryCache;
+
+ // point where the currently active mouse action started in geometry coordinates
+ QPoint m_pressedPosition;
+ QPersistentModelIndex m_pressedIndex;
+ bool m_pressedAlreadySelected;
+ VisualGroup *m_pressedCategory;
+ QItemSelectionModel::SelectionFlag m_ctrlDragSelectionFlag;
+ QPoint m_lastDragPosition;
+
+ VisualGroup *category(const QModelIndex &index) const;
+ VisualGroup *category(const QString &cat) const;
+ VisualGroup *categoryAt(const QPoint &pos) const;
+
+ int itemsPerRow() const
+ {
+ return m_currentItemsPerRow;
+ };
+ int contentWidth() const;
+
+private: /* methods */
+ int itemWidth() const;
+ int calculateItemsPerRow() const;
+ int verticalScrollToValue(const QModelIndex &index, const QRect &rect,
+ QListView::ScrollHint hint) const;
+ QPixmap renderToPixmap(const QModelIndexList &indices, QRect *r) const;
+ QList<QPair<QRect, QModelIndex>> draggablePaintPairs(const QModelIndexList &indices,
+ QRect *r) const;
+
+ bool isDragEventAccepted(QDropEvent *event);
+
+ QPair<VisualGroup *, int> rowDropPos(const QPoint &pos);
+
+ QPoint offset() const;
+};
diff --git a/application/groupview/GroupedProxyModel.cpp b/application/groupview/GroupedProxyModel.cpp
new file mode 100644
index 00000000..a45c5ae9
--- /dev/null
+++ b/application/groupview/GroupedProxyModel.cpp
@@ -0,0 +1,42 @@
+#include "GroupedProxyModel.h"
+
+#include "GroupView.h"
+#include <QDebug>
+
+GroupedProxyModel::GroupedProxyModel(QObject *parent) : QSortFilterProxyModel(parent)
+{
+}
+
+bool GroupedProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
+{
+ const QString leftCategory = left.data(GroupViewRoles::GroupRole).toString();
+ const QString rightCategory = right.data(GroupViewRoles::GroupRole).toString();
+ if (leftCategory == rightCategory)
+ {
+ return subSortLessThan(left, right);
+ }
+ else
+ {
+ // FIXME: real group sorting happens in GroupView::updateGeometries(), see LocaleString
+ auto result = leftCategory.localeAwareCompare(rightCategory);
+ if(result < 0)
+ {
+ qDebug() << leftCategory << "<" << rightCategory;
+ }
+ if(result == 0)
+ {
+ qDebug() << leftCategory << "=" << rightCategory;
+ return subSortLessThan(left, right);
+ }
+ if(result > 0)
+ {
+ qDebug() << leftCategory << ">" << rightCategory;
+ }
+ return result < 0;
+ }
+}
+
+bool GroupedProxyModel::subSortLessThan(const QModelIndex &left, const QModelIndex &right) const
+{
+ return left.row() < right.row();
+}
diff --git a/application/groupview/GroupedProxyModel.h b/application/groupview/GroupedProxyModel.h
new file mode 100644
index 00000000..12edee0f
--- /dev/null
+++ b/application/groupview/GroupedProxyModel.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include <QSortFilterProxyModel>
+
+class GroupedProxyModel : public QSortFilterProxyModel
+{
+ Q_OBJECT
+
+public:
+ GroupedProxyModel(QObject *parent = 0);
+
+protected:
+ virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const override;
+ virtual bool subSortLessThan(const QModelIndex &left, const QModelIndex &right) const;
+};
diff --git a/application/groupview/InstanceDelegate.cpp b/application/groupview/InstanceDelegate.cpp
new file mode 100644
index 00000000..b9ad353c
--- /dev/null
+++ b/application/groupview/InstanceDelegate.cpp
@@ -0,0 +1,362 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "InstanceDelegate.h"
+#include <QPainter>
+#include <QTextOption>
+#include <QTextLayout>
+#include <QApplication>
+#include <QtMath>
+
+#include "GroupView.h"
+#include "BaseInstance.h"
+#include "InstanceList.h"
+
+QCache<QString, QPixmap> ListViewDelegate::m_pixmapCache;
+
+// Origin: Qt
+static void viewItemTextLayout(QTextLayout &textLayout, int lineWidth, qreal &height,
+ qreal &widthUsed)
+{
+ height = 0;
+ widthUsed = 0;
+ textLayout.beginLayout();
+ QString str = textLayout.text();
+ while (true)
+ {
+ QTextLine line = textLayout.createLine();
+ if (!line.isValid())
+ break;
+ if (line.textLength() == 0)
+ break;
+ line.setLineWidth(lineWidth);
+ line.setPosition(QPointF(0, height));
+ height += line.height();
+ widthUsed = qMax(widthUsed, line.naturalTextWidth());
+ }
+ textLayout.endLayout();
+}
+
+ListViewDelegate::ListViewDelegate(QObject *parent) : QStyledItemDelegate(parent)
+{
+}
+
+void drawSelectionRect(QPainter *painter, const QStyleOptionViewItemV4 &option,
+ const QRect &rect)
+{
+ if ((option.state & QStyle::State_Selected))
+ painter->fillRect(rect, option.palette.brush(QPalette::Highlight));
+ else
+ {
+ QColor backgroundColor = option.palette.color(QPalette::Background);
+ backgroundColor.setAlpha(160);
+ painter->fillRect(rect, QBrush(backgroundColor));
+ }
+}
+
+void drawFocusRect(QPainter *painter, const QStyleOptionViewItemV4 &option, const QRect &rect)
+{
+ if (!(option.state & QStyle::State_HasFocus))
+ return;
+ QStyleOptionFocusRect opt;
+ opt.direction = option.direction;
+ opt.fontMetrics = option.fontMetrics;
+ opt.palette = option.palette;
+ opt.rect = rect;
+ // opt.state = option.state | QStyle::State_KeyboardFocusChange |
+ // QStyle::State_Item;
+ auto col = option.state & QStyle::State_Selected ? QPalette::Highlight : QPalette::Base;
+ opt.backgroundColor = option.palette.color(col);
+ // Apparently some widget styles expect this hint to not be set
+ painter->setRenderHint(QPainter::Antialiasing, false);
+
+ QStyle *style = option.widget ? option.widget->style() : QApplication::style();
+
+ style->drawPrimitive(QStyle::PE_FrameFocusRect, &opt, painter, option.widget);
+
+ painter->setRenderHint(QPainter::Antialiasing);
+}
+
+// TODO this can be made a lot prettier
+void drawProgressOverlay(QPainter *painter, const QStyleOptionViewItemV4 &option,
+ const int value, const int maximum)
+{
+ if (maximum == 0 || value == maximum)
+ {
+ return;
+ }
+
+ painter->save();
+
+ qreal percent = (qreal)value / (qreal)maximum;
+ QColor color = option.palette.color(QPalette::Dark);
+ color.setAlphaF(0.70f);
+ painter->setBrush(color);
+ painter->setPen(QPen(QBrush(), 0));
+ painter->drawPie(option.rect, 90 * 16, -percent * 360 * 16);
+
+ painter->restore();
+}
+
+void drawBadges(QPainter *painter, const QStyleOptionViewItemV4 &option, BaseInstance *instance)
+{
+ QList<QString> pixmaps;
+ const BaseInstance::InstanceFlags flags = instance->flags();
+ if (flags & BaseInstance::VersionBrokenFlag)
+ {
+ pixmaps.append("broken");
+ }
+ if (flags & BaseInstance::UpdateAvailable)
+ {
+ pixmaps.append("updateavailable");
+ }
+
+ // begin easter eggs
+ if (instance->name().contains("btw", Qt::CaseInsensitive) ||
+ instance->name().contains("better then wolves", Qt::CaseInsensitive) ||
+ instance->name().contains("better than wolves", Qt::CaseInsensitive))
+ {
+ pixmaps.append("herobrine");
+ }
+ if (instance->name().contains("direwolf", Qt::CaseInsensitive))
+ {
+ pixmaps.append("enderman");
+ }
+ if (instance->name().contains("kitten", Qt::CaseInsensitive))
+ {
+ pixmaps.append("kitten");
+ }
+ if (instance->name().contains("derp", Qt::CaseInsensitive))
+ {
+ pixmaps.append("derp");
+ }
+ // end easter eggs
+
+ static const int itemSide = 24;
+ static const int spacing = 1;
+ const int itemsPerRow = qMax(1, qFloor(double(option.rect.width() + spacing) / double(itemSide + spacing)));
+ const int rows = qCeil((double)pixmaps.size() / (double)itemsPerRow);
+ QListIterator<QString> it(pixmaps);
+ painter->translate(option.rect.topLeft());
+ for (int y = 0; y < rows; ++y)
+ {
+ for (int x = 0; x < itemsPerRow; ++x)
+ {
+ if (!it.hasNext())
+ {
+ return;
+ }
+ const QPixmap pixmap = ListViewDelegate::requestBadgePixmap(it.next()).scaled(
+ itemSide, itemSide, Qt::KeepAspectRatio, Qt::FastTransformation);
+ painter->drawPixmap(option.rect.width() - x * itemSide + qMax(x - 1, 0) * spacing - itemSide,
+ y * itemSide + qMax(y - 1, 0) * spacing, itemSide, itemSide,
+ pixmap);
+ }
+ }
+ painter->translate(-option.rect.topLeft());
+}
+
+static QSize viewItemTextSize(const QStyleOptionViewItemV4 *option)
+{
+ QStyle *style = option->widget ? option->widget->style() : QApplication::style();
+ QTextOption textOption;
+ textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
+ QTextLayout textLayout;
+ textLayout.setTextOption(textOption);
+ textLayout.setFont(option->font);
+ textLayout.setText(option->text);
+ const int textMargin =
+ style->pixelMetric(QStyle::PM_FocusFrameHMargin, option, option->widget) + 1;
+ QRect bounds(0, 0, 100 - 2 * textMargin, 600);
+ qreal height = 0, widthUsed = 0;
+ viewItemTextLayout(textLayout, bounds.width(), height, widthUsed);
+ const QSize size(qCeil(widthUsed), qCeil(height));
+ return QSize(size.width() + 2 * textMargin, size.height());
+}
+
+void ListViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
+ const QModelIndex &index) const
+{
+ QStyleOptionViewItemV4 opt = option;
+ initStyleOption(&opt, index);
+ painter->save();
+ painter->setClipRect(opt.rect);
+
+ opt.features |= QStyleOptionViewItem::WrapText;
+ opt.text = index.data().toString();
+ opt.textElideMode = Qt::ElideRight;
+ opt.displayAlignment = Qt::AlignTop | Qt::AlignHCenter;
+
+ QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
+
+ // const int iconSize = style->pixelMetric(QStyle::PM_IconViewIconSize);
+ const int iconSize = 48;
+ QRect iconbox = opt.rect;
+ const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, 0, opt.widget) + 1;
+ QRect textRect = opt.rect;
+ QRect textHighlightRect = textRect;
+ // clip the decoration on top, remove width padding
+ textRect.adjust(textMargin, iconSize + textMargin + 5, -textMargin, 0);
+
+ textHighlightRect.adjust(0, iconSize + 5, 0, 0);
+
+ // draw background
+ {
+ // FIXME: unused
+ // QSize textSize = viewItemTextSize ( &opt );
+ QPalette::ColorGroup cg;
+ QStyleOptionViewItemV4 opt2(opt);
+
+ if ((opt.widget && opt.widget->isEnabled()) || (opt.state & QStyle::State_Enabled))
+ {
+ if (!(opt.state & QStyle::State_Active))
+ cg = QPalette::Inactive;
+ else
+ cg = QPalette::Normal;
+ }
+ else
+ {
+ cg = QPalette::Disabled;
+ }
+ opt2.palette.setCurrentColorGroup(cg);
+
+ // fill in background, if any
+
+ if (opt.backgroundBrush.style() != Qt::NoBrush)
+ {
+ QPointF oldBO = painter->brushOrigin();
+ painter->setBrushOrigin(opt.rect.topLeft());
+ painter->fillRect(opt.rect, opt.backgroundBrush);
+ painter->setBrushOrigin(oldBO);
+ }
+
+ drawSelectionRect(painter, opt2, textHighlightRect);
+
+ /*
+ if (opt.showDecorationSelected)
+ {
+ drawSelectionRect(painter, opt2, opt.rect);
+ drawFocusRect(painter, opt2, opt.rect);
+ // painter->fillRect ( opt.rect, opt.palette.brush ( cg, QPalette::Highlight ) );
+ }
+ else
+ {
+
+ // if ( opt.state & QStyle::State_Selected )
+ {
+ // QRect textRect = subElementRect ( QStyle::SE_ItemViewItemText, opt,
+ // opt.widget );
+ // painter->fillRect ( textHighlightRect, opt.palette.brush ( cg,
+ // QPalette::Highlight ) );
+ drawSelectionRect(painter, opt2, textHighlightRect);
+ drawFocusRect(painter, opt2, textHighlightRect);
+ }
+ }
+ */
+ }
+
+ // draw the icon
+ {
+ QIcon::Mode mode = QIcon::Normal;
+ if (!(opt.state & QStyle::State_Enabled))
+ mode = QIcon::Disabled;
+ else if (opt.state & QStyle::State_Selected)
+ mode = QIcon::Selected;
+ QIcon::State state = opt.state & QStyle::State_Open ? QIcon::On : QIcon::Off;
+
+ iconbox.setHeight(iconSize);
+ opt.icon.paint(painter, iconbox, Qt::AlignCenter, mode, state);
+ }
+ // set the text colors
+ QPalette::ColorGroup cg =
+ opt.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled;
+ if (cg == QPalette::Normal && !(opt.state & QStyle::State_Active))
+ cg = QPalette::Inactive;
+ if (opt.state & QStyle::State_Selected)
+ {
+ painter->setPen(opt.palette.color(cg, QPalette::HighlightedText));
+ }
+ else
+ {
+ painter->setPen(opt.palette.color(cg, QPalette::Text));
+ }
+
+ // draw the text
+ QTextOption textOption;
+ textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
+ textOption.setTextDirection(opt.direction);
+ textOption.setAlignment(QStyle::visualAlignment(opt.direction, opt.displayAlignment));
+ QTextLayout textLayout;
+ textLayout.setTextOption(textOption);
+ textLayout.setFont(opt.font);
+ textLayout.setText(opt.text);
+
+ qreal width, height;
+ viewItemTextLayout(textLayout, textRect.width(), height, width);
+
+ const int lineCount = textLayout.lineCount();
+
+ const QRect layoutRect = QStyle::alignedRect(
+ opt.direction, opt.displayAlignment, QSize(textRect.width(), int(height)), textRect);
+ const QPointF position = layoutRect.topLeft();
+ for (int i = 0; i < lineCount; ++i)
+ {
+ const QTextLine line = textLayout.lineAt(i);
+ line.draw(painter, position);
+ }
+
+ // FIXME: this really has no business of being here. Make generic.
+ auto instance = (BaseInstance*)index.data(InstanceList::InstancePointerRole)
+ .value<void *>();
+ if (instance)
+ {
+ drawBadges(painter, opt, instance);
+ }
+
+ drawProgressOverlay(painter, opt, index.data(GroupViewRoles::ProgressValueRole).toInt(),
+ index.data(GroupViewRoles::ProgressMaximumRole).toInt());
+
+ painter->restore();
+}
+
+QSize ListViewDelegate::sizeHint(const QStyleOptionViewItem &option,
+ const QModelIndex &index) const
+{
+ QStyleOptionViewItemV4 opt = option;
+ initStyleOption(&opt, index);
+ opt.features |= QStyleOptionViewItem::WrapText;
+ opt.text = index.data().toString();
+ opt.textElideMode = Qt::ElideRight;
+ opt.displayAlignment = Qt::AlignTop | Qt::AlignHCenter;
+
+ QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
+ const int textMargin =
+ style->pixelMetric(QStyle::PM_FocusFrameHMargin, &option, opt.widget) + 1;
+ int height = 48 + textMargin * 2 + 5; // TODO: turn constants into variables
+ QSize szz = viewItemTextSize(&opt);
+ height += szz.height();
+ // FIXME: maybe the icon items could scale and keep proportions?
+ QSize sz(100, height);
+ return sz;
+}
+
+QPixmap ListViewDelegate::requestBadgePixmap(const QString &key)
+{
+ if (!m_pixmapCache.contains(key))
+ {
+ m_pixmapCache.insert(key, new QPixmap(":/icons/badges/" + key + ".png"));
+ }
+ return *m_pixmapCache.object(key);
+}
diff --git a/application/groupview/InstanceDelegate.h b/application/groupview/InstanceDelegate.h
new file mode 100644
index 00000000..2b5439cb
--- /dev/null
+++ b/application/groupview/InstanceDelegate.h
@@ -0,0 +1,35 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QStyledItemDelegate>
+#include <QCache>
+
+class ListViewDelegate : public QStyledItemDelegate
+{
+public:
+ explicit ListViewDelegate(QObject *parent = 0);
+
+ static QPixmap requestBadgePixmap(const QString &key);
+
+protected:
+ void paint(QPainter *painter, const QStyleOptionViewItem &option,
+ const QModelIndex &index) const;
+ QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
+
+private:
+ static QCache<QString, QPixmap> m_pixmapCache;
+};
diff --git a/application/groupview/VisualGroup.cpp b/application/groupview/VisualGroup.cpp
new file mode 100644
index 00000000..560fc9ca
--- /dev/null
+++ b/application/groupview/VisualGroup.cpp
@@ -0,0 +1,301 @@
+#include "VisualGroup.h"
+
+#include <QModelIndex>
+#include <QPainter>
+#include <QtMath>
+#include <QApplication>
+
+#include "GroupView.h"
+
+VisualGroup::VisualGroup(const QString &text, GroupView *view) : view(view), text(text), collapsed(false)
+{
+}
+
+VisualGroup::VisualGroup(const VisualGroup *other)
+ : view(other->view), text(other->text), collapsed(other->collapsed)
+{
+}
+
+void VisualGroup::update()
+{
+ auto temp_items = items();
+ auto itemsPerRow = view->itemsPerRow();
+
+ int numRows = qMax(1, qCeil((qreal)temp_items.size() / (qreal)itemsPerRow));
+ rows = QVector<VisualRow>(numRows);
+
+ int maxRowHeight = 0;
+ int positionInRow = 0;
+ int currentRow = 0;
+ int offsetFromTop = 0;
+ for (auto item: temp_items)
+ {
+ if(positionInRow == itemsPerRow)
+ {
+ rows[currentRow].height = maxRowHeight;
+ rows[currentRow].top = offsetFromTop;
+ currentRow ++;
+ offsetFromTop += maxRowHeight + 5;
+ positionInRow = 0;
+ maxRowHeight = 0;
+ }
+ auto itemHeight = view->itemDelegate()->sizeHint(view->viewOptions(), item).height();
+ if(itemHeight > maxRowHeight)
+ {
+ maxRowHeight = itemHeight;
+ }
+ rows[currentRow].items.append(item);
+ positionInRow++;
+ }
+ rows[currentRow].height = maxRowHeight;
+ rows[currentRow].top = offsetFromTop;
+}
+
+QPair<int, int> VisualGroup::positionOf(const QModelIndex &index) const
+{
+ int x = 0;
+ int y = 0;
+ for (auto & row: rows)
+ {
+ for(auto x = 0; x < row.items.size(); x++)
+ {
+ if(row.items[x] == index)
+ {
+ return qMakePair(x,y);
+ }
+ }
+ y++;
+ }
+ return qMakePair(x, y);
+}
+
+int VisualGroup::rowTopOf(const QModelIndex &index) const
+{
+ auto position = positionOf(index);
+ return rows[position.second].top;
+}
+
+int VisualGroup::rowHeightOf(const QModelIndex &index) const
+{
+ auto position = positionOf(index);
+ return rows[position.second].height;
+}
+
+VisualGroup::HitResults VisualGroup::hitScan(const QPoint &pos) const
+{
+ VisualGroup::HitResults results = VisualGroup::NoHit;
+ int y_start = verticalPosition();
+ int body_start = y_start + headerHeight();
+ int body_end = body_start + contentHeight() + 5; // FIXME: wtf is this 5?
+ int y = pos.y();
+ // int x = pos.x();
+ if (y < y_start)
+ {
+ results = VisualGroup::NoHit;
+ }
+ else if (y < body_start)
+ {
+ results = VisualGroup::HeaderHit;
+ int collapseSize = headerHeight() - 4;
+
+ // the icon
+ QRect iconRect = QRect(view->m_leftMargin + 2, 2 + y_start, collapseSize, collapseSize);
+ if (iconRect.contains(pos))
+ {
+ results |= VisualGroup::CheckboxHit;
+ }
+ }
+ else if (y < body_end)
+ {
+ results |= VisualGroup::BodyHit;
+ }
+ return results;
+}
+
+void VisualGroup::drawHeader(QPainter *painter, const QStyleOptionViewItem &option)
+{
+ painter->setRenderHint(QPainter::Antialiasing);
+
+ const QRect optRect = option.rect;
+ QFont font(QApplication::font());
+ font.setBold(true);
+ const QFontMetrics fontMetrics = QFontMetrics(font);
+
+ QColor outlineColor = option.palette.text().color();
+ outlineColor.setAlphaF(0.35);
+
+ //BEGIN: top left corner
+ {
+ painter->save();
+ painter->setPen(outlineColor);
+ const QPointF topLeft(optRect.topLeft());
+ QRectF arc(topLeft, QSizeF(4, 4));
+ arc.translate(0.5, 0.5);
+ painter->drawArc(arc, 1440, 1440);
+ painter->restore();
+ }
+ //END: top left corner
+
+ //BEGIN: left vertical line
+ {
+ QPoint start(optRect.topLeft());
+ start.ry() += 3;
+ QPoint verticalGradBottom(optRect.topLeft());
+ verticalGradBottom.ry() += fontMetrics.height() + 5;
+ QLinearGradient gradient(start, verticalGradBottom);
+ gradient.setColorAt(0, outlineColor);
+ gradient.setColorAt(1, Qt::transparent);
+ painter->fillRect(QRect(start, QSize(1, fontMetrics.height() + 5)), gradient);
+ }
+ //END: left vertical line
+
+ //BEGIN: horizontal line
+ {
+ QPoint start(optRect.topLeft());
+ start.rx() += 3;
+ QPoint horizontalGradTop(optRect.topLeft());
+ horizontalGradTop.rx() += optRect.width() - 6;
+ painter->fillRect(QRect(start, QSize(optRect.width() - 6, 1)), outlineColor);
+ }
+ //END: horizontal line
+
+ //BEGIN: top right corner
+ {
+ painter->save();
+ painter->setPen(outlineColor);
+ QPointF topRight(optRect.topRight());
+ topRight.rx() -= 4;
+ QRectF arc(topRight, QSizeF(4, 4));
+ arc.translate(0.5, 0.5);
+ painter->drawArc(arc, 0, 1440);
+ painter->restore();
+ }
+ //END: top right corner
+
+ //BEGIN: right vertical line
+ {
+ QPoint start(optRect.topRight());
+ start.ry() += 3;
+ QPoint verticalGradBottom(optRect.topRight());
+ verticalGradBottom.ry() += fontMetrics.height() + 5;
+ QLinearGradient gradient(start, verticalGradBottom);
+ gradient.setColorAt(0, outlineColor);
+ gradient.setColorAt(1, Qt::transparent);
+ painter->fillRect(QRect(start, QSize(1, fontMetrics.height() + 5)), gradient);
+ }
+ //END: right vertical line
+
+ //BEGIN: checkboxy thing
+ {
+ painter->save();
+ painter->setRenderHint(QPainter::Antialiasing, false);
+ painter->setFont(font);
+ QColor penColor(option.palette.text().color());
+ penColor.setAlphaF(0.6);
+ painter->setPen(penColor);
+ QRect iconSubRect(option.rect);
+ iconSubRect.setTop(iconSubRect.top() + 7);
+ iconSubRect.setLeft(iconSubRect.left() + 7);
+
+ int sizing = fontMetrics.height();
+ int even = ( (sizing - 1) % 2 );
+
+ iconSubRect.setHeight(sizing - even);
+ iconSubRect.setWidth(sizing - even);
+ painter->drawRect(iconSubRect);
+
+
+ /*
+ if(collapsed)
+ painter->drawText(iconSubRect, Qt::AlignHCenter | Qt::AlignVCenter, "+");
+ else
+ painter->drawText(iconSubRect, Qt::AlignHCenter | Qt::AlignVCenter, "-");
+ */
+ painter->setBrush(option.palette.text());
+ painter->fillRect(iconSubRect.x(), iconSubRect.y() + iconSubRect.height() / 2,
+ iconSubRect.width(), 2, penColor);
+ if (collapsed)
+ {
+ painter->fillRect(iconSubRect.x() + iconSubRect.width() / 2, iconSubRect.y(), 2,
+ iconSubRect.height(), penColor);
+ }
+
+ painter->restore();
+ }
+ //END: checkboxy thing
+
+ //BEGIN: text
+ {
+ QRect textRect(option.rect);
+ textRect.setTop(textRect.top() + 7);
+ textRect.setLeft(textRect.left() + 7 + fontMetrics.height() + 7);
+ textRect.setHeight(fontMetrics.height());
+ textRect.setRight(textRect.right() - 7);
+
+ painter->save();
+ painter->setFont(font);
+ QColor penColor(option.palette.text().color());
+ penColor.setAlphaF(0.6);
+ painter->setPen(penColor);
+ painter->drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter, text);
+ painter->restore();
+ }
+ //END: text
+}
+
+int VisualGroup::totalHeight() const
+{
+ return headerHeight() + 5 + contentHeight(); // FIXME: wtf is that '5'?
+}
+
+int VisualGroup::headerHeight() const
+{
+ QFont font(QApplication::font());
+ font.setBold(true);
+ QFontMetrics fontMetrics(font);
+
+ const int height = fontMetrics.height() + 1 /* 1 pixel-width gradient */
+ + 11 /* top and bottom separation */;
+ return height;
+ /*
+ int raw = view->viewport()->fontMetrics().height() + 4;
+ // add english. maybe. depends on font height.
+ if (raw % 2 == 0)
+ raw++;
+ return std::min(raw, 25);
+ */
+}
+
+int VisualGroup::contentHeight() const
+{
+ if (collapsed)
+ {
+ return 0;
+ }
+ auto last = rows[numRows() - 1];
+ return last.top + last.height;
+}
+
+int VisualGroup::numRows() const
+{
+ return rows.size();
+}
+
+int VisualGroup::verticalPosition() const
+{
+ return m_verticalPosition;
+}
+
+QList<QModelIndex> VisualGroup::items() const
+{
+ QList<QModelIndex> indices;
+ for (int i = 0; i < view->model()->rowCount(); ++i)
+ {
+ const QModelIndex index = view->model()->index(i, 0);
+ if (index.data(GroupViewRoles::GroupRole).toString() == text)
+ {
+ indices.append(index);
+ }
+ }
+ return indices;
+}
diff --git a/application/groupview/VisualGroup.h b/application/groupview/VisualGroup.h
new file mode 100644
index 00000000..d8d1f145
--- /dev/null
+++ b/application/groupview/VisualGroup.h
@@ -0,0 +1,91 @@
+#pragma once
+
+#include <QString>
+#include <QRect>
+#include <QVector>
+#include <QStyleOption>
+
+class GroupView;
+class QPainter;
+class QModelIndex;
+
+struct VisualRow
+{
+ QList<QModelIndex> items;
+ int height = 0;
+ int top = 0;
+ inline int size() const
+ {
+ return items.size();
+ }
+ inline QModelIndex &operator[](int i)
+ {
+ return items[i];
+ }
+};
+
+struct VisualGroup
+{
+/* constructors */
+ VisualGroup(const QString &text, GroupView *view);
+ VisualGroup(const VisualGroup *other);
+
+/* data */
+ GroupView *view = nullptr;
+ QString text;
+ bool collapsed = false;
+ QVector<VisualRow> rows;
+ int firstItemIndex = 0;
+ int m_verticalPosition = 0;
+
+/* logic */
+ /// update the internal list of items and flow them into the rows.
+ void update();
+
+ /// draw the header at y-position.
+ void drawHeader(QPainter *painter, const QStyleOptionViewItem &option);
+
+ /// height of the group, in total. includes a small bit of padding.
+ int totalHeight() const;
+
+ /// height of the group header, in pixels
+ int headerHeight() const;
+
+ /// height of the group content, in pixels
+ int contentHeight() const;
+
+ /// the number of visual rows this group has
+ int numRows() const;
+
+ /// actually calculate the above value
+ int calculateNumRows() const;
+
+ /// the height at which this group starts, in pixels
+ int verticalPosition() const;
+
+ /// relative geometry - top of the row of the given item
+ int rowTopOf(const QModelIndex &index) const;
+
+ /// height of the row of the given item
+ int rowHeightOf(const QModelIndex &index) const;
+
+ /// x/y position of the given item inside the group (in items!)
+ QPair<int, int> positionOf(const QModelIndex &index) const;
+
+ enum HitResult
+ {
+ NoHit = 0x0,
+ TextHit = 0x1,
+ CheckboxHit = 0x2,
+ HeaderHit = 0x4,
+ BodyHit = 0x8
+ };
+ Q_DECLARE_FLAGS(HitResults, HitResult)
+
+ /// shoot! BANG! what did we hit?
+ HitResults hitScan (const QPoint &pos) const;
+
+ QList<QModelIndex> items() const;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(VisualGroup::HitResults)
diff --git a/application/install_prereqs.cmake.in b/application/install_prereqs.cmake.in
new file mode 100644
index 00000000..b8fa3177
--- /dev/null
+++ b/application/install_prereqs.cmake.in
@@ -0,0 +1,24 @@
+set(CMAKE_MODULE_PATH "@CMAKE_MODULE_PATH@")
+
+file(GLOB_RECURSE QTPLUGINS "${CMAKE_INSTALL_PREFIX}/@PLUGIN_DEST_DIR@/*@CMAKE_SHARED_LIBRARY_SUFFIX@")
+function(gp_resolved_file_type_override resolved_file type_var)
+ if(resolved_file MATCHES "^/usr/lib/libQt")
+ message("resolving ${resolved_file} as other")
+ set(${type_var} other PARENT_SCOPE)
+ elseif(resolved_file MATCHES "^/usr/lib(.+)?/libxcb")
+ message("resolving ${resolved_file} as other")
+ set(${type_var} other PARENT_SCOPE)
+ elseif(resolved_file MATCHES "^/usr/lib(.+)?/libicu")
+ message("resolving ${resolved_file} as other")
+ set(${type_var} other PARENT_SCOPE)
+ endif()
+endfunction()
+
+set(gp_tool "@CMAKE_GP_TOOL@")
+set(gp_cmd_paths ${gp_cmd_paths}
+ "@CMAKE_GP_CMD_PATHS@"
+)
+
+include(BundleUtilities)
+fixup_bundle("@APPS@" "${QTPLUGINS}" "@DIRS@")
+
diff --git a/application/main.cpp b/application/main.cpp
new file mode 100644
index 00000000..111a61ac
--- /dev/null
+++ b/application/main.cpp
@@ -0,0 +1,43 @@
+#include "MultiMC.h"
+#include "MainWindow.h"
+
+int main_gui(MultiMC &app)
+{
+ // show main window
+ app.setIconTheme(MMC->settings()->get("IconTheme").toString());
+ MainWindow mainWin;
+ mainWin.restoreState(QByteArray::fromBase64(MMC->settings()->get("MainWindowState").toByteArray()));
+ mainWin.restoreGeometry(QByteArray::fromBase64(MMC->settings()->get("MainWindowGeometry").toByteArray()));
+ mainWin.show();
+ mainWin.checkSetDefaultJava();
+ mainWin.checkInstancePathForProblems();
+ return app.exec();
+}
+
+int main(int argc, char *argv[])
+{
+ // initialize Qt
+ MultiMC app(argc, argv);
+
+ Q_INIT_RESOURCE(instances);
+ Q_INIT_RESOURCE(multimc);
+ Q_INIT_RESOURCE(backgrounds);
+ Q_INIT_RESOURCE(versions);
+
+ Q_INIT_RESOURCE(pe_dark);
+ Q_INIT_RESOURCE(pe_light);
+ Q_INIT_RESOURCE(pe_blue);
+ Q_INIT_RESOURCE(pe_colored);
+ Q_INIT_RESOURCE(OSX);
+ Q_INIT_RESOURCE(iOS);
+
+ switch (app.status())
+ {
+ case MultiMC::Initialized:
+ return main_gui(app);
+ case MultiMC::Failed:
+ return 1;
+ case MultiMC::Succeeded:
+ return 0;
+ }
+}
diff --git a/application/package/linux/MultiMC b/application/package/linux/MultiMC
new file mode 100755
index 00000000..80225e53
--- /dev/null
+++ b/application/package/linux/MultiMC
@@ -0,0 +1,80 @@
+#!/bin/bash
+# Basic start script for running MultiMC with the libs packaged with it.
+
+function printerror {
+ printf "$1"
+ if which zenity >/dev/null; then zenity --error --text="$1" &>/dev/null;
+ elif which kdialog >/dev/null; then kdialog --error "$1" &>/dev/null;
+ fi
+}
+
+if [[ $EUID -eq 0 ]]; then
+ printerror "This program should not be run using sudo or as the root user!\n"
+ exit 1
+fi
+
+
+MMC_DIR="$(dirname "$(readlink -f "$0")")"
+echo "MultiMC Dir: ${MMC_DIR}"
+
+# Set up env
+export LD_LIBRARY_PATH="${MMC_DIR}/bin":$LD_LIBRARY_PATH
+export QT_PLUGIN_PATH="${MMC_DIR}/plugins"
+export QT_FONTPATH="${MMC_DIR}/fonts"
+
+# Detect missing dependencies...
+DEPS_LIST=`ldd "${MMC_DIR}"/plugins/*/*.so 2>/dev/null | grep "not found" | awk -vORS=", " '{ print $1 }'`
+if [ "x$DEPS_LIST" = "x" ]; then
+ # We have all our dependencies. Run MultiMC.
+ echo "No missing dependencies found."
+
+ # Just to be sure...
+ chmod +x "${MMC_DIR}/bin/MultiMC"
+
+ # Run MultiMC
+ "${MMC_DIR}/bin/MultiMC" -d "${MMC_DIR}" $@
+
+ # Run MultiMC in valgrind
+ # valgrind --log-file="valgrind.log" --leak-check=full --track-origins=yes "${MMC_DIR}/bin/MultiMC" -d "${MMC_DIR}" $@
+
+ # Exit with MultiMC's exit code.
+ exit $?
+else
+ # apt
+ if which apt-file &>/dev/null; then
+ LIBRARIES=`echo "$DEPS_LIST" | grep -oP "[^, ]*"`
+ COMMAND_LIBS=`for LIBRARY in $LIBRARIES; do apt-file -l search $LIBRARY; done`
+ COMMAND_LIBS=`echo "$COMMAND_LIBS" | awk -vORS=" " '{ print $1 }'`
+ INSTALL_CMD="sudo apt-get install $COMMAND_LIBS"
+ # pacman
+ elif which pkgfile &>/dev/null; then
+ LIBRARIES=`echo "$DEPS_LIST" | grep -oP "[^, ]*"`
+ COMMAND_LIBS=`for LIBRARY in $LIBRARIES; do pkgfile $LIBRARY; done`
+ COMMAND_LIBS=`echo "$COMMAND_LIBS" | awk -vORS=" " '{ print $1 }'`
+ INSTALL_CMD="sudo pacman -S $COMMAND_LIBS"
+ # yum
+ elif which yum &>/dev/null; then
+ LIBRARIES=`echo "$DEPS_LIST" | grep -oP "[^, ]*"`
+ COMMAND_LIBS=`for LIBRARY in $LIBRARIES; do yum whatprovides $LIBRARY; done`
+ COMMAND_LIBS=`echo "$COMMAND_LIBS" | awk -vORS=" " '{ print $1 }'`
+ INSTALL_CMD="sudo yum install $COMMAND_LIBS"
+ # zypper
+ elif which zypper &>/dev/null; then
+ LIBRARIES=`echo "$DEPS_LIST" | grep -oP "[^, ]*"`
+ COMMAND_LIBS=`for LIBRARY in $LIBRARIES; do zypper wp $LIBRARY; done`
+ COMMAND_LIBS=`echo "$COMMAND_LIBS" | awk -vORS=" " '{ print $1 }'`
+ INSTALL_CMD="sudo zypper install $COMMAND_LIBS"
+ # emerge
+ elif which pfl &>/dev/null; then
+ LIBRARIES=`echo "$DEPS_LIST" | grep -oP "[^, ]*"`
+ COMMAND_LIBS=`for LIBRARY in $LIBRARIES; do pfl $LIBRARY; done`
+ COMMAND_LIBS=`echo "$COMMAND_LIBS" | awk -vORS=" " '{ print $1 }'`
+ INSTALL_CMD="sudo emerge $COMMAND_LIBS"
+ fi
+
+ MESSAGE="Error: MultiMC is missing the following libraries that it needs to work correctly:\n\t${DEPS_LIST}\nPlease install them from your distribution's package manager."
+ MESSAGE="$MESSAGE\n\nHint: $INSTALL_CMD\n"
+
+ printerror "$MESSAGE"
+ exit 1
+fi
diff --git a/application/pagedialog/PageDialog.cpp b/application/pagedialog/PageDialog.cpp
new file mode 100644
index 00000000..a930789e
--- /dev/null
+++ b/application/pagedialog/PageDialog.cpp
@@ -0,0 +1,62 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "PageDialog.h"
+
+#include <QDialogButtonBox>
+#include <QPushButton>
+#include <QVBoxLayout>
+#include <QKeyEvent>
+
+#include "MultiMC.h"
+#include "settings/SettingsObject.h"
+#include "Platform.h"
+#include "widgets/IconLabel.h"
+#include "widgets/PageContainer.h"
+
+PageDialog::PageDialog(BasePageProviderPtr pageProvider, QString defaultId, QWidget *parent)
+ : QDialog(parent)
+{
+ MultiMCPlatform::fixWM_CLASS(this);
+ setWindowTitle(pageProvider->dialogTitle());
+ m_container = new PageContainer(pageProvider, defaultId, this);
+
+ QVBoxLayout *mainLayout = new QVBoxLayout;
+ mainLayout->addWidget(m_container);
+ mainLayout->setSpacing(0);
+ mainLayout->setContentsMargins(0, 0, 0, 0);
+ setLayout(mainLayout);
+
+ QDialogButtonBox *buttons =
+ new QDialogButtonBox(QDialogButtonBox::Help | QDialogButtonBox::Close);
+ buttons->button(QDialogButtonBox::Close)->setDefault(true);
+ m_container->addButtons(buttons);
+
+ connect(buttons->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(close()));
+ connect(buttons->button(QDialogButtonBox::Help), SIGNAL(clicked()), m_container,
+ SLOT(help()));
+
+ restoreGeometry(
+ QByteArray::fromBase64(MMC->settings()->get("PagedGeometry").toByteArray()));
+}
+
+void PageDialog::closeEvent(QCloseEvent *event)
+{
+ if (m_container->requestClose(event))
+ {
+ MMC->settings()->set("PagedGeometry", saveGeometry().toBase64());
+ QDialog::closeEvent(event);
+ }
+}
diff --git a/application/pagedialog/PageDialog.h b/application/pagedialog/PageDialog.h
new file mode 100644
index 00000000..8a31cd0a
--- /dev/null
+++ b/application/pagedialog/PageDialog.h
@@ -0,0 +1,36 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QDialog>
+#include "pages/BasePageProvider.h"
+
+class PageContainer;
+class PageDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ explicit PageDialog(BasePageProviderPtr pageProvider, QString defaultId = QString(),
+ QWidget *parent = 0);
+ virtual ~PageDialog() {}
+
+private
+slots:
+ virtual void closeEvent(QCloseEvent *event);
+
+private:
+ PageContainer * m_container;
+};
diff --git a/application/pages/BasePage.h b/application/pages/BasePage.h
new file mode 100644
index 00000000..ecf0692c
--- /dev/null
+++ b/application/pages/BasePage.h
@@ -0,0 +1,38 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QString>
+#include <QIcon>
+#include <memory>
+
+class BasePage
+{
+public:
+ virtual ~BasePage() {}
+ virtual QString id() const = 0;
+ virtual QString displayName() const = 0;
+ virtual QIcon icon() const = 0;
+ virtual bool apply() { return true; }
+ virtual bool shouldDisplay() const { return true; }
+ virtual QString helpPage() const { return QString(); }
+ virtual void opened() {}
+ virtual void closed() {}
+ int stackIndex = -1;
+ int listIndex = -1;
+};
+
+typedef std::shared_ptr<BasePage> BasePagePtr;
diff --git a/application/pages/BasePageProvider.h b/application/pages/BasePageProvider.h
new file mode 100644
index 00000000..c55683e0
--- /dev/null
+++ b/application/pages/BasePageProvider.h
@@ -0,0 +1,69 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "BasePage.h"
+#include <memory>
+#include <functional>
+
+class BasePageProvider
+{
+public:
+ virtual QList<BasePage *> getPages() = 0;
+ virtual QString dialogTitle() = 0;
+};
+
+class GenericPageProvider : public BasePageProvider
+{
+ typedef std::function<BasePage *()> PageCreator;
+public:
+ explicit GenericPageProvider(const QString &dialogTitle)
+ : m_dialogTitle(dialogTitle)
+ {
+ }
+
+ QList<BasePage *> getPages() override
+ {
+ QList<BasePage *> pages;
+ for (PageCreator creator : m_creators)
+ {
+ pages.append(creator());
+ }
+ return pages;
+ }
+ QString dialogTitle() override { return m_dialogTitle; }
+
+ void setDialogTitle(const QString &title)
+ {
+ m_dialogTitle = title;
+ }
+ void addPageCreator(PageCreator page)
+ {
+ m_creators.append(page);
+ }
+
+ template<typename PageClass>
+ void addPage()
+ {
+ addPageCreator([](){return new PageClass();});
+ }
+
+private:
+ QList<PageCreator> m_creators;
+ QString m_dialogTitle;
+};
+
+typedef std::shared_ptr<BasePageProvider> BasePageProviderPtr;
diff --git a/application/pages/InstanceSettingsPage.cpp b/application/pages/InstanceSettingsPage.cpp
new file mode 100644
index 00000000..1e571eff
--- /dev/null
+++ b/application/pages/InstanceSettingsPage.cpp
@@ -0,0 +1,216 @@
+#include "InstanceSettingsPage.h"
+#include "ui_InstanceSettingsPage.h"
+
+#include <QFileDialog>
+#include <QDialog>
+#include <QMessageBox>
+
+#include "dialogs/VersionSelectDialog.h"
+#include "NagUtils.h"
+#include "java/JavaVersionList.h"
+#include "MultiMC.h"
+
+InstanceSettingsPage::InstanceSettingsPage(BaseInstance *inst, QWidget *parent)
+ : QWidget(parent), ui(new Ui::InstanceSettingsPage), m_instance(inst)
+{
+ m_settings = &(inst->settings());
+ ui->setupUi(this);
+ loadSettings();
+}
+
+bool InstanceSettingsPage::shouldDisplay() const
+{
+ return !m_instance->isRunning();
+}
+
+InstanceSettingsPage::~InstanceSettingsPage()
+{
+ delete ui;
+}
+
+bool InstanceSettingsPage::apply()
+{
+ applySettings();
+ return true;
+}
+
+void InstanceSettingsPage::applySettings()
+{
+ // Console
+ bool console = ui->consoleSettingsBox->isChecked();
+ m_settings->set("OverrideConsole", console);
+ if (console)
+ {
+ m_settings->set("ShowConsole", ui->showConsoleCheck->isChecked());
+ m_settings->set("AutoCloseConsole", ui->autoCloseConsoleCheck->isChecked());
+ }
+ else
+ {
+ m_settings->reset("ShowConsole");
+ m_settings->reset("AutoCloseConsole");
+ }
+
+ // Window Size
+ bool window = ui->windowSizeGroupBox->isChecked();
+ m_settings->set("OverrideWindow", window);
+ if (window)
+ {
+ m_settings->set("LaunchMaximized", ui->maximizedCheckBox->isChecked());
+ m_settings->set("MinecraftWinWidth", ui->windowWidthSpinBox->value());
+ m_settings->set("MinecraftWinHeight", ui->windowHeightSpinBox->value());
+ }
+ else
+ {
+ m_settings->reset("LaunchMaximized");
+ m_settings->reset("MinecraftWinWidth");
+ m_settings->reset("MinecraftWinHeight");
+ }
+
+ // Memory
+ bool memory = ui->memoryGroupBox->isChecked();
+ m_settings->set("OverrideMemory", memory);
+ if (memory)
+ {
+ m_settings->set("MinMemAlloc", ui->minMemSpinBox->value());
+ m_settings->set("MaxMemAlloc", ui->maxMemSpinBox->value());
+ m_settings->set("PermGen", ui->permGenSpinBox->value());
+ }
+ else
+ {
+ m_settings->reset("MinMemAlloc");
+ m_settings->reset("MaxMemAlloc");
+ m_settings->reset("PermGen");
+ }
+
+ // Java Install Settings
+ bool javaInstall = ui->javaSettingsGroupBox->isChecked();
+ m_settings->set("OverrideJavaLocation", javaInstall);
+ if (javaInstall)
+ {
+ m_settings->set("JavaPath", ui->javaPathTextBox->text());
+ }
+ else
+ {
+ m_settings->reset("JavaPath");
+ }
+
+ // Java arguments
+ bool javaArgs = ui->javaArgumentsGroupBox->isChecked();
+ m_settings->set("OverrideJavaArgs", javaArgs);
+ if(javaArgs)
+ {
+ m_settings->set("JvmArgs", ui->jvmArgsTextBox->toPlainText().replace("\n", " "));
+ NagUtils::checkJVMArgs(m_settings->get("JvmArgs").toString(), this->parentWidget());
+ }
+ else
+ {
+ m_settings->reset("JvmArgs");
+ }
+
+ // old generic 'override both' is removed.
+ m_settings->reset("OverrideJava");
+
+ // Custom Commands
+ bool custcmd = ui->customCommandsGroupBox->isChecked();
+ m_settings->set("OverrideCommands", custcmd);
+ if (custcmd)
+ {
+ m_settings->set("PreLaunchCommand", ui->preLaunchCmdTextBox->text());
+ m_settings->set("PostExitCommand", ui->postExitCmdTextBox->text());
+ }
+ else
+ {
+ m_settings->reset("PreLaunchCommand");
+ m_settings->reset("PostExitCommand");
+ }
+}
+
+void InstanceSettingsPage::loadSettings()
+{
+ // Console
+ ui->consoleSettingsBox->setChecked(m_settings->get("OverrideConsole").toBool());
+ ui->showConsoleCheck->setChecked(m_settings->get("ShowConsole").toBool());
+ ui->autoCloseConsoleCheck->setChecked(m_settings->get("AutoCloseConsole").toBool());
+
+ // Window Size
+ ui->windowSizeGroupBox->setChecked(m_settings->get("OverrideWindow").toBool());
+ ui->maximizedCheckBox->setChecked(m_settings->get("LaunchMaximized").toBool());
+ ui->windowWidthSpinBox->setValue(m_settings->get("MinecraftWinWidth").toInt());
+ ui->windowHeightSpinBox->setValue(m_settings->get("MinecraftWinHeight").toInt());
+
+ // Memory
+ ui->memoryGroupBox->setChecked(m_settings->get("OverrideMemory").toBool());
+ ui->minMemSpinBox->setValue(m_settings->get("MinMemAlloc").toInt());
+ ui->maxMemSpinBox->setValue(m_settings->get("MaxMemAlloc").toInt());
+ ui->permGenSpinBox->setValue(m_settings->get("PermGen").toInt());
+
+ // Java Settings
+ bool overrideJava = m_settings->get("OverrideJava").toBool();
+ bool overrideLocation = m_settings->get("OverrideJavaLocation").toBool() || overrideJava;
+ bool overrideArgs = m_settings->get("OverrideJavaArgs").toBool() || overrideJava;
+
+ ui->javaSettingsGroupBox->setChecked(overrideLocation);
+ ui->javaPathTextBox->setText(m_settings->get("JavaPath").toString());
+
+ ui->javaArgumentsGroupBox->setChecked(overrideArgs);
+ ui->jvmArgsTextBox->setPlainText(m_settings->get("JvmArgs").toString());
+
+ // Custom Commands
+ ui->customCommandsGroupBox->setChecked(m_settings->get("OverrideCommands").toBool());
+ ui->preLaunchCmdTextBox->setText(m_settings->get("PreLaunchCommand").toString());
+ ui->postExitCmdTextBox->setText(m_settings->get("PostExitCommand").toString());
+}
+
+void InstanceSettingsPage::on_javaDetectBtn_clicked()
+{
+ JavaVersionPtr java;
+
+ VersionSelectDialog vselect(MMC->javalist().get(), tr("Select a Java version"), this, true);
+ vselect.setResizeOn(2);
+ vselect.exec();
+
+ if (vselect.result() == QDialog::Accepted && vselect.selectedVersion())
+ {
+ java = std::dynamic_pointer_cast<JavaVersion>(vselect.selectedVersion());
+ ui->javaPathTextBox->setText(java->path);
+ }
+}
+
+void InstanceSettingsPage::on_javaBrowseBtn_clicked()
+{
+ QString dir = QFileDialog::getOpenFileName(this, tr("Find Java executable"));
+ if (!dir.isNull())
+ {
+ ui->javaPathTextBox->setText(dir);
+ }
+}
+
+void InstanceSettingsPage::on_javaTestBtn_clicked()
+{
+ checker.reset(new JavaChecker());
+ connect(checker.get(), SIGNAL(checkFinished(JavaCheckResult)), this,
+ SLOT(checkFinished(JavaCheckResult)));
+ checker->path = ui->javaPathTextBox->text();
+ checker->performCheck();
+}
+
+void InstanceSettingsPage::checkFinished(JavaCheckResult result)
+{
+ if (result.valid)
+ {
+ QString text;
+ text += "Java test succeeded!\n";
+ if (result.is_64bit)
+ text += "Using 64bit java.\n";
+ text += "\n";
+ text += "Platform reported: " + result.realPlatform;
+ QMessageBox::information(this, tr("Java test success"), text);
+ }
+ else
+ {
+ QMessageBox::warning(
+ this, tr("Java test failure"),
+ tr("The specified java binary didn't work. You should use the auto-detect feature, "
+ "or set the path to the java executable."));
+ }
+}
diff --git a/application/pages/InstanceSettingsPage.h b/application/pages/InstanceSettingsPage.h
new file mode 100644
index 00000000..85df5880
--- /dev/null
+++ b/application/pages/InstanceSettingsPage.h
@@ -0,0 +1,74 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "net/NetJob.h"
+#include "java/JavaChecker.h"
+#include "BaseInstance.h"
+#include "BasePage.h"
+#include "MultiMC.h"
+
+class JavaChecker;
+namespace Ui
+{
+class InstanceSettingsPage;
+}
+
+class InstanceSettingsPage : public QWidget, public BasePage
+{
+ Q_OBJECT
+
+public:
+ explicit InstanceSettingsPage(BaseInstance *inst, QWidget *parent = 0);
+ virtual ~InstanceSettingsPage();
+ virtual QString displayName() const override
+ {
+ return tr("Settings");
+ }
+ virtual QIcon icon() const override
+ {
+ return MMC->getThemedIcon("instance-settings");
+ }
+ virtual QString id() const override
+ {
+ return "settings";
+ }
+ virtual bool apply();
+ virtual QString helpPage() const override
+ {
+ return "Instance-settings";
+ }
+ virtual bool shouldDisplay() const;
+private slots:
+ void on_javaDetectBtn_clicked();
+
+ void on_javaTestBtn_clicked();
+
+ void on_javaBrowseBtn_clicked();
+
+ void checkFinished(JavaCheckResult result);
+
+ void applySettings();
+ void loadSettings();
+
+private:
+ Ui::InstanceSettingsPage *ui;
+ BaseInstance *m_instance;
+ SettingsObject *m_settings;
+ std::shared_ptr<JavaChecker> checker;
+};
diff --git a/application/pages/InstanceSettingsPage.ui b/application/pages/InstanceSettingsPage.ui
new file mode 100644
index 00000000..64109378
--- /dev/null
+++ b/application/pages/InstanceSettingsPage.ui
@@ -0,0 +1,453 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>InstanceSettingsPage</class>
+ <widget class="QWidget" name="InstanceSettingsPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>458</width>
+ <height>426</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QTabWidget" name="settingsTabs">
+ <property name="tabShape">
+ <enum>QTabWidget::Rounded</enum>
+ </property>
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="minecraftTab">
+ <attribute name="title">
+ <string>Java</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <item>
+ <widget class="QGroupBox" name="javaSettingsGroupBox">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Java installation</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0" colspan="3">
+ <widget class="QLineEdit" name="javaPathTextBox"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QPushButton" name="javaDetectBtn">
+ <property name="text">
+ <string>Auto-detect...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QPushButton" name="javaBrowseBtn">
+ <property name="text">
+ <string>Browse...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QPushButton" name="javaTestBtn">
+ <property name="text">
+ <string>Test</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="memoryGroupBox">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Memory</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="1" column="1">
+ <widget class="QSpinBox" name="maxMemSpinBox">
+ <property name="toolTip">
+ <string>The maximum amount of memory Minecraft is allowed to use.</string>
+ </property>
+ <property name="suffix">
+ <string> MB</string>
+ </property>
+ <property name="minimum">
+ <number>512</number>
+ </property>
+ <property name="maximum">
+ <number>65536</number>
+ </property>
+ <property name="singleStep">
+ <number>128</number>
+ </property>
+ <property name="value">
+ <number>1024</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="labelMinMem">
+ <property name="text">
+ <string>Minimum memory allocation:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="labelMaxMem">
+ <property name="text">
+ <string>Maximum memory allocation:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QSpinBox" name="minMemSpinBox">
+ <property name="toolTip">
+ <string>The amount of memory Minecraft is started with.</string>
+ </property>
+ <property name="suffix">
+ <string> MB</string>
+ </property>
+ <property name="minimum">
+ <number>256</number>
+ </property>
+ <property name="maximum">
+ <number>65536</number>
+ </property>
+ <property name="singleStep">
+ <number>128</number>
+ </property>
+ <property name="value">
+ <number>256</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QSpinBox" name="permGenSpinBox">
+ <property name="toolTip">
+ <string>The amount of memory available to store loaded Java classes.</string>
+ </property>
+ <property name="suffix">
+ <string> MB</string>
+ </property>
+ <property name="minimum">
+ <number>64</number>
+ </property>
+ <property name="maximum">
+ <number>999999999</number>
+ </property>
+ <property name="singleStep">
+ <number>8</number>
+ </property>
+ <property name="value">
+ <number>64</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="labelPermGen">
+ <property name="text">
+ <string>PermGen:</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="javaArgumentsGroupBox">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Java arguments</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_5">
+ <item row="1" column="1">
+ <widget class="QPlainTextEdit" name="jvmArgsTextBox"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacerMinecraft">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="javaTab">
+ <attribute name="title">
+ <string>Game windows</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QGroupBox" name="windowSizeGroupBox">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Game Window</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <item>
+ <widget class="QCheckBox" name="maximizedCheckBox">
+ <property name="text">
+ <string>Start Minecraft maximized?</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayoutWindowSize">
+ <item row="1" column="0">
+ <widget class="QLabel" name="labelWindowHeight">
+ <property name="text">
+ <string>Window height:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="labelWindowWidth">
+ <property name="text">
+ <string>Window width:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QSpinBox" name="windowWidthSpinBox">
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>65536</number>
+ </property>
+ <property name="singleStep">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>854</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QSpinBox" name="windowHeightSpinBox">
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>65536</number>
+ </property>
+ <property name="value">
+ <number>480</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="consoleSettingsBox">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Console Settings</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QCheckBox" name="showConsoleCheck">
+ <property name="text">
+ <string>Show console while the game is running?</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="autoCloseConsoleCheck">
+ <property name="text">
+ <string>Automatically close console when the game quits?</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacerMinecraft_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>88</width>
+ <height>125</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>Custom commands</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_6">
+ <item>
+ <widget class="QGroupBox" name="customCommandsGroupBox">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Custom Commands</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_4">
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="preLaunchCmdTextBox"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="labelPostExitCmd">
+ <property name="text">
+ <string>Post-exit command:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="labelPreLaunchCmd">
+ <property name="text">
+ <string>Pre-launch command:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="postExitCmdTextBox"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelCustomCmdsDescription">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pre-launch command runs before the instance launches and post-exit command runs after it exits.&lt;/p&gt;&lt;p&gt;Both will be run in MultiMC's working directory with extra environment variables:&lt;/p&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;&quot;&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;INST_NAME - Name of the instance&lt;/li&gt;&lt;li style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;INST_ID - ID of the instance&lt;/li&gt;&lt;li style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;INST_DIR - absolute path of the instance&lt;/li&gt;&lt;li style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;INST_MC_DIR - absolute path of minecraft&lt;/li&gt;&lt;li style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;INST_JAVA - java binary used for launch&lt;/li&gt;&lt;li style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;INST_JAVA_ARGS - command-line parameters used for launch&lt;/li&gt;&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacerMinecraft_3">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>88</width>
+ <height>186</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>settingsTabs</tabstop>
+ <tabstop>javaSettingsGroupBox</tabstop>
+ <tabstop>javaPathTextBox</tabstop>
+ <tabstop>javaDetectBtn</tabstop>
+ <tabstop>javaBrowseBtn</tabstop>
+ <tabstop>javaTestBtn</tabstop>
+ <tabstop>memoryGroupBox</tabstop>
+ <tabstop>minMemSpinBox</tabstop>
+ <tabstop>maxMemSpinBox</tabstop>
+ <tabstop>permGenSpinBox</tabstop>
+ <tabstop>javaArgumentsGroupBox</tabstop>
+ <tabstop>jvmArgsTextBox</tabstop>
+ <tabstop>windowSizeGroupBox</tabstop>
+ <tabstop>maximizedCheckBox</tabstop>
+ <tabstop>windowWidthSpinBox</tabstop>
+ <tabstop>windowHeightSpinBox</tabstop>
+ <tabstop>consoleSettingsBox</tabstop>
+ <tabstop>showConsoleCheck</tabstop>
+ <tabstop>autoCloseConsoleCheck</tabstop>
+ <tabstop>customCommandsGroupBox</tabstop>
+ <tabstop>preLaunchCmdTextBox</tabstop>
+ <tabstop>postExitCmdTextBox</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/application/pages/LogPage.cpp b/application/pages/LogPage.cpp
new file mode 100644
index 00000000..8f9edb96
--- /dev/null
+++ b/application/pages/LogPage.cpp
@@ -0,0 +1,222 @@
+#include "LogPage.h"
+#include "ui_LogPage.h"
+
+#include "MultiMC.h"
+
+#include <QIcon>
+#include <QScrollBar>
+#include <QShortcut>
+
+#include "BaseProcess.h"
+#include "GuiUtil.h"
+
+LogPage::LogPage(BaseProcess *proc, QWidget *parent)
+ : QWidget(parent), ui(new Ui::LogPage), m_process(proc)
+{
+ ui->setupUi(this);
+ ui->tabWidget->tabBar()->hide();
+ connect(m_process, SIGNAL(log(QString, MessageLevel::Enum)), this,
+ SLOT(write(QString, MessageLevel::Enum)));
+
+ // create the format and set its font
+ defaultFormat = new QTextCharFormat(ui->text->currentCharFormat());
+ QString fontFamily = MMC->settings()->get("ConsoleFont").toString();
+ bool conversionOk = false;
+ int fontSize = MMC->settings()->get("ConsoleFontSize").toInt(&conversionOk);
+ if(!conversionOk)
+ {
+ fontSize = 11;
+ }
+ defaultFormat->setFont(QFont(fontFamily, fontSize));
+
+ auto findShortcut = new QShortcut(QKeySequence(QKeySequence::Find), this);
+ connect(findShortcut, SIGNAL(activated()), SLOT(findActivated()));
+ auto findNextShortcut = new QShortcut(QKeySequence(QKeySequence::FindNext), this);
+ connect(findNextShortcut, SIGNAL(activated()), SLOT(findNextActivated()));
+ connect(ui->searchBar, SIGNAL(returnPressed()), SLOT(on_findButton_clicked()));
+ auto findPreviousShortcut = new QShortcut(QKeySequence(QKeySequence::FindPrevious), this);
+ connect(findPreviousShortcut, SIGNAL(activated()), SLOT(findPreviousActivated()));
+}
+
+LogPage::~LogPage()
+{
+ delete ui;
+ delete defaultFormat;
+}
+
+bool LogPage::apply()
+{
+ return true;
+}
+
+bool LogPage::shouldDisplay() const
+{
+ return m_process->instance()->isRunning();
+}
+
+void LogPage::on_btnPaste_clicked()
+{
+ GuiUtil::uploadPaste(ui->text->toPlainText(), this);
+}
+
+void LogPage::on_btnCopy_clicked()
+{
+ GuiUtil::setClipboardText(ui->text->toPlainText());
+}
+
+void LogPage::on_btnClear_clicked()
+{
+ ui->text->clear();
+}
+
+void LogPage::on_trackLogCheckbox_clicked(bool checked)
+{
+ m_write_active = checked;
+}
+
+void LogPage::on_findButton_clicked()
+{
+ auto modifiers = QApplication::keyboardModifiers();
+ if (modifiers & Qt::ShiftModifier)
+ {
+ findPreviousActivated();
+ }
+ else
+ {
+ findNextActivated();
+ }
+}
+
+void LogPage::findActivated()
+{
+ // focus the search bar if it doesn't have focus
+ if (!ui->searchBar->hasFocus())
+ {
+ auto searchForCursor = ui->text->textCursor();
+ auto searchForString = searchForCursor.selectedText();
+ if (searchForString.size())
+ {
+ ui->searchBar->setText(searchForString);
+ }
+ ui->searchBar->setFocus();
+ ui->searchBar->selectAll();
+ }
+}
+
+void LogPage::findNextActivated()
+{
+ auto toSearch = ui->searchBar->text();
+ if (toSearch.size())
+ {
+ ui->text->find(toSearch);
+ }
+}
+
+void LogPage::findPreviousActivated()
+{
+ auto toSearch = ui->searchBar->text();
+ if (toSearch.size())
+ {
+ ui->text->find(toSearch, QTextDocument::FindBackward);
+ }
+}
+
+void LogPage::write(QString data, MessageLevel::Enum mode)
+{
+ if (!m_write_active)
+ {
+ if (mode != MessageLevel::PrePost && mode != MessageLevel::MultiMC)
+ {
+ return;
+ }
+ }
+
+ // save the cursor so it can be restored.
+ auto savedCursor = ui->text->cursor();
+
+ QScrollBar *bar = ui->text->verticalScrollBar();
+ int max_bar = bar->maximum();
+ int val_bar = bar->value();
+ if (isVisible())
+ {
+ if (m_scroll_active)
+ {
+ m_scroll_active = (max_bar - val_bar) <= 1;
+ }
+ else
+ {
+ m_scroll_active = val_bar == max_bar;
+ }
+ }
+ if (data.endsWith('\n'))
+ data = data.left(data.length() - 1);
+ QStringList paragraphs = data.split('\n');
+ QStringList filtered;
+ for (QString &paragraph : paragraphs)
+ {
+ //TODO: implement filtering here.
+ filtered.append(paragraph);
+ }
+ QListIterator<QString> iter(filtered);
+ QTextCharFormat format(*defaultFormat);
+
+ switch(mode)
+ {
+ case MessageLevel::MultiMC:
+ {
+ format.setForeground(QColor("blue"));
+ break;
+ }
+ case MessageLevel::Debug:
+ {
+ format.setForeground(QColor("green"));
+ break;
+ }
+ case MessageLevel::Warning:
+ {
+ format.setForeground(QColor("orange"));
+ break;
+ }
+ case MessageLevel::Error:
+ {
+ format.setForeground(QColor("red"));
+ break;
+ }
+ case MessageLevel::Fatal:
+ {
+ format.setForeground(QColor("red"));
+ format.setBackground(QColor("black"));
+ break;
+ }
+ case MessageLevel::PrePost:
+ {
+ format.setForeground(QColor("grey"));
+ break;
+ }
+ case MessageLevel::Info:
+ case MessageLevel::Message:
+ default:
+ {
+ // do nothing, keep original
+ }
+ }
+
+ while (iter.hasNext())
+ {
+ // append a paragraph/line
+ auto workCursor = ui->text->textCursor();
+ workCursor.movePosition(QTextCursor::End);
+ workCursor.insertText(iter.next(), format);
+ workCursor.insertBlock();
+ }
+
+ if (isVisible())
+ {
+ if (m_scroll_active)
+ {
+ bar->setValue(bar->maximum());
+ }
+ m_last_scroll_value = bar->value();
+ }
+ ui->text->setCursor(savedCursor);
+}
diff --git a/application/pages/LogPage.h b/application/pages/LogPage.h
new file mode 100644
index 00000000..fe7bbecb
--- /dev/null
+++ b/application/pages/LogPage.h
@@ -0,0 +1,86 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "BaseInstance.h"
+#include "net/NetJob.h"
+#include "BaseProcess.h"
+#include "BasePage.h"
+#include <MultiMC.h>
+
+namespace Ui
+{
+class LogPage;
+}
+class QTextCharFormat;
+
+class LogPage : public QWidget, public BasePage
+{
+ Q_OBJECT
+
+public:
+ explicit LogPage(BaseProcess *proc, QWidget *parent = 0);
+ virtual ~LogPage();
+ virtual QString displayName() const override
+ {
+ return tr("Minecraft Log");
+ }
+ virtual QIcon icon() const override
+ {
+ return MMC->getThemedIcon("log");
+ }
+ virtual QString id() const override
+ {
+ return "console";
+ }
+ virtual bool apply();
+ virtual QString helpPage() const override
+ {
+ return "Minecraft-Logs";
+ }
+ virtual bool shouldDisplay() const;
+
+private slots:
+ /**
+ * @brief write a string
+ * @param data the string
+ * @param mode the WriteMode
+ * lines have to be put through this as a whole!
+ */
+ void write(QString data, MessageLevel::Enum level = MessageLevel::MultiMC);
+ void on_btnPaste_clicked();
+ void on_btnCopy_clicked();
+ void on_btnClear_clicked();
+
+ void on_trackLogCheckbox_clicked(bool checked);
+
+ void on_findButton_clicked();
+ void findActivated();
+ void findNextActivated();
+ void findPreviousActivated();
+
+private:
+ Ui::LogPage *ui;
+ BaseProcess *m_process;
+ int m_last_scroll_value = 0;
+ bool m_scroll_active = true;
+ int m_saved_offset = 0;
+ bool m_write_active = true;
+
+ QTextCharFormat * defaultFormat;
+};
diff --git a/application/pages/LogPage.ui b/application/pages/LogPage.ui
new file mode 100644
index 00000000..089bc906
--- /dev/null
+++ b/application/pages/LogPage.ui
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>LogPage</class>
+ <widget class="QWidget" name="LogPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>825</width>
+ <height>782</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Log</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>Tab 1</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="2" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Search:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QPushButton" name="findButton">
+ <property name="text">
+ <string>Find</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="3">
+ <widget class="QPlainTextEdit" name="text">
+ <property name="undoRedoEnabled">
+ <bool>false</bool>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="plainText">
+ <string notr="true"/>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ <property name="centerOnScroll">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="3">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QCheckBox" name="trackLogCheckbox">
+ <property name="text">
+ <string>Keep updating</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnCopy">
+ <property name="toolTip">
+ <string>Copy the whole log into the clipboard</string>
+ </property>
+ <property name="text">
+ <string>&amp;Copy</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnPaste">
+ <property name="toolTip">
+ <string>Upload the log to paste.ee - it will stay online for a month</string>
+ </property>
+ <property name="text">
+ <string>Upload</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnClear">
+ <property name="toolTip">
+ <string>Clear the log</string>
+ </property>
+ <property name="text">
+ <string>Clear</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLineEdit" name="searchBar"/>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/application/pages/ModFolderPage.cpp b/application/pages/ModFolderPage.cpp
new file mode 100644
index 00000000..3c55aefc
--- /dev/null
+++ b/application/pages/ModFolderPage.cpp
@@ -0,0 +1,160 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ModFolderPage.h"
+#include "ui_ModFolderPage.h"
+
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QEvent>
+#include <QKeyEvent>
+#include <QDesktopServices>
+#include <QAbstractItemModel>
+
+#include <pathutils.h>
+
+#include "MultiMC.h"
+#include "dialogs/CustomMessageBox.h"
+#include "dialogs/ModEditDialogCommon.h"
+#include "minecraft/ModList.h"
+#include "minecraft/Mod.h"
+#include "minecraft/VersionFilterData.h"
+
+ModFolderPage::ModFolderPage(BaseInstance *inst, std::shared_ptr<ModList> mods, QString id,
+ QString iconName, QString displayName, QString helpPage,
+ QWidget *parent)
+ : QWidget(parent), ui(new Ui::ModFolderPage)
+{
+ ui->setupUi(this);
+ ui->tabWidget->tabBar()->hide();
+ m_inst = inst;
+ m_mods = mods;
+ m_id = id;
+ m_displayName = displayName;
+ m_iconName = iconName;
+ m_helpName = helpPage;
+ ui->modTreeView->setModel(m_mods.get());
+ ui->modTreeView->installEventFilter(this);
+ m_mods->startWatching();
+ auto smodel = ui->modTreeView->selectionModel();
+ connect(smodel, SIGNAL(currentChanged(QModelIndex, QModelIndex)),
+ SLOT(modCurrent(QModelIndex, QModelIndex)));
+}
+
+CoreModFolderPage::CoreModFolderPage(BaseInstance *inst, std::shared_ptr<ModList> mods,
+ QString id, QString iconName, QString displayName,
+ QString helpPage, QWidget *parent)
+ : ModFolderPage(inst, mods, id, iconName, displayName, helpPage, parent)
+{
+}
+
+ModFolderPage::~ModFolderPage()
+{
+ m_mods->stopWatching();
+ delete ui;
+}
+
+bool ModFolderPage::shouldDisplay() const
+{
+ if (m_inst)
+ return !m_inst->isRunning();
+ return true;
+}
+
+bool CoreModFolderPage::shouldDisplay() const
+{
+ if (ModFolderPage::shouldDisplay())
+ {
+ auto inst = dynamic_cast<OneSixInstance *>(m_inst);
+ if (!inst)
+ return true;
+ auto version = inst->getMinecraftProfile();
+ if (!version)
+ return true;
+ if (version->m_releaseTime < g_VersionFilterData.legacyCutoffDate)
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool ModFolderPage::modListFilter(QKeyEvent *keyEvent)
+{
+ switch (keyEvent->key())
+ {
+ case Qt::Key_Delete:
+ on_rmModBtn_clicked();
+ return true;
+ case Qt::Key_Plus:
+ on_addModBtn_clicked();
+ return true;
+ default:
+ break;
+ }
+ return QWidget::eventFilter(ui->modTreeView, keyEvent);
+}
+
+bool ModFolderPage::eventFilter(QObject *obj, QEvent *ev)
+{
+ if (ev->type() != QEvent::KeyPress)
+ {
+ return QWidget::eventFilter(obj, ev);
+ }
+ QKeyEvent *keyEvent = static_cast<QKeyEvent *>(ev);
+ if (obj == ui->modTreeView)
+ return modListFilter(keyEvent);
+ return QWidget::eventFilter(obj, ev);
+}
+
+void ModFolderPage::on_addModBtn_clicked()
+{
+ QStringList fileNames = QFileDialog::getOpenFileNames(
+ this, QApplication::translate("ModFolderPage", "Select Loader Mods"));
+ for (auto filename : fileNames)
+ {
+ m_mods->stopWatching();
+ m_mods->installMod(QFileInfo(filename));
+ m_mods->startWatching();
+ }
+}
+void ModFolderPage::on_rmModBtn_clicked()
+{
+ int first, last;
+ auto list = ui->modTreeView->selectionModel()->selectedRows();
+
+ if (!lastfirst(list, first, last))
+ return;
+ m_mods->stopWatching();
+ m_mods->deleteMods(first, last);
+ m_mods->startWatching();
+}
+
+void ModFolderPage::on_viewModBtn_clicked()
+{
+ openDirInDefaultProgram(m_mods->dir().absolutePath(), true);
+}
+
+void ModFolderPage::modCurrent(const QModelIndex &current, const QModelIndex &previous)
+{
+ if (!current.isValid())
+ {
+ ui->frame->clear();
+ return;
+ }
+ int row = current.row();
+ Mod &m = m_mods->operator[](row);
+ ui->frame->updateWithMod(m);
+}
diff --git a/application/pages/ModFolderPage.h b/application/pages/ModFolderPage.h
new file mode 100644
index 00000000..4e89f85f
--- /dev/null
+++ b/application/pages/ModFolderPage.h
@@ -0,0 +1,94 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "minecraft/OneSixInstance.h"
+#include "net/NetJob.h"
+#include "BasePage.h"
+#include <MultiMC.h>
+
+class ModList;
+namespace Ui
+{
+class ModFolderPage;
+}
+
+class ModFolderPage : public QWidget, public BasePage
+{
+ Q_OBJECT
+
+public:
+ explicit ModFolderPage(BaseInstance *inst, std::shared_ptr<ModList> mods, QString id,
+ QString iconName, QString displayName, QString helpPage = "",
+ QWidget *parent = 0);
+ virtual ~ModFolderPage();
+ virtual QString displayName() const override
+ {
+ return m_displayName;
+ }
+ virtual QIcon icon() const override
+ {
+ return MMC->getThemedIcon(m_iconName);
+ }
+ virtual QString id() const override
+ {
+ return m_id;
+ }
+ virtual QString helpPage() const override
+ {
+ return m_helpName;
+ }
+ virtual bool shouldDisplay() const;
+
+protected:
+ bool eventFilter(QObject *obj, QEvent *ev);
+ bool modListFilter(QKeyEvent *ev);
+
+protected:
+ BaseInstance *m_inst;
+
+private:
+ Ui::ModFolderPage *ui;
+ std::shared_ptr<ModList> m_mods;
+ QString m_iconName;
+ QString m_id;
+ QString m_displayName;
+ QString m_helpName;
+
+public
+slots:
+ void modCurrent(const QModelIndex &current, const QModelIndex &previous);
+
+private
+slots:
+ void on_addModBtn_clicked();
+ void on_rmModBtn_clicked();
+ void on_viewModBtn_clicked();
+};
+
+class CoreModFolderPage : public ModFolderPage
+{
+public:
+ explicit CoreModFolderPage(BaseInstance *inst, std::shared_ptr<ModList> mods, QString id,
+ QString iconName, QString displayName, QString helpPage = "",
+ QWidget *parent = 0);
+ virtual ~CoreModFolderPage()
+ {
+ }
+ virtual bool shouldDisplay() const;
+};
diff --git a/application/pages/ModFolderPage.ui b/application/pages/ModFolderPage.ui
new file mode 100644
index 00000000..353b62c5
--- /dev/null
+++ b/application/pages/ModFolderPage.ui
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ModFolderPage</class>
+ <widget class="QWidget" name="ModFolderPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>723</width>
+ <height>532</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Mods</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>Tab 1</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="ModListView" name="modTreeView">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="acceptDrops">
+ <bool>true</bool>
+ </property>
+ <property name="dragDropMode">
+ <enum>QAbstractItemView::DropOnly</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QPushButton" name="addModBtn">
+ <property name="text">
+ <string>&amp;Add</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="rmModBtn">
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="viewModBtn">
+ <property name="text">
+ <string>&amp;View Folder</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="MCModInfoFrame" name="frame">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>ModListView</class>
+ <extends>QTreeView</extends>
+ <header>widgets/ModListView.h</header>
+ </customwidget>
+ <customwidget>
+ <class>MCModInfoFrame</class>
+ <extends>QFrame</extends>
+ <header>widgets/MCModInfoFrame.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/application/pages/NotesPage.cpp b/application/pages/NotesPage.cpp
new file mode 100644
index 00000000..48bb468c
--- /dev/null
+++ b/application/pages/NotesPage.cpp
@@ -0,0 +1,21 @@
+#include "NotesPage.h"
+#include "ui_NotesPage.h"
+
+NotesPage::NotesPage(BaseInstance *inst, QWidget *parent)
+ : QWidget(parent), ui(new Ui::NotesPage), m_inst(inst)
+{
+ ui->setupUi(this);
+ ui->tabWidget->tabBar()->hide();
+ ui->noteEditor->setText(m_inst->notes());
+}
+
+NotesPage::~NotesPage()
+{
+ delete ui;
+}
+
+bool NotesPage::apply()
+{
+ m_inst->setNotes(ui->noteEditor->toPlainText());
+ return true;
+}
diff --git a/application/pages/NotesPage.h b/application/pages/NotesPage.h
new file mode 100644
index 00000000..62e0c692
--- /dev/null
+++ b/application/pages/NotesPage.h
@@ -0,0 +1,61 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "BaseInstance.h"
+#include "net/NetJob.h"
+#include "BasePage.h"
+#include <MultiMC.h>
+
+namespace Ui
+{
+class NotesPage;
+}
+
+class NotesPage : public QWidget, public BasePage
+{
+ Q_OBJECT
+
+public:
+ explicit NotesPage(BaseInstance *inst, QWidget *parent = 0);
+ virtual ~NotesPage();
+ virtual QString displayName() const override
+ {
+ return tr("Notes");
+ }
+ virtual QIcon icon() const override
+ {
+ auto icon = MMC->getThemedIcon("notes");
+ if(icon.isNull())
+ icon = MMC->getThemedIcon("news");
+ return icon;
+ }
+ virtual QString id() const override
+ {
+ return "notes";
+ }
+ virtual bool apply();
+ virtual QString helpPage() const override
+ {
+ return "Notes";
+ }
+
+private:
+ Ui::NotesPage *ui;
+ BaseInstance *m_inst;
+};
diff --git a/application/pages/NotesPage.ui b/application/pages/NotesPage.ui
new file mode 100644
index 00000000..8da01c8b
--- /dev/null
+++ b/application/pages/NotesPage.ui
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>NotesPage</class>
+ <widget class="QWidget" name="NotesPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>731</width>
+ <height>538</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>Tab 1</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QTextEdit" name="noteEditor">
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOn</enum>
+ </property>
+ <property name="acceptRichText">
+ <bool>false</bool>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextEditable|Qt::TextEditorInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/application/pages/OtherLogsPage.cpp b/application/pages/OtherLogsPage.cpp
new file mode 100644
index 00000000..b037a6c7
--- /dev/null
+++ b/application/pages/OtherLogsPage.cpp
@@ -0,0 +1,150 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "OtherLogsPage.h"
+#include "ui_OtherLogsPage.h"
+
+#include <QFileDialog>
+#include <QMessageBox>
+
+#include "GuiUtil.h"
+#include "RecursiveFileSystemWatcher.h"
+#include <pathutils.h>
+
+OtherLogsPage::OtherLogsPage(QString path, QWidget *parent)
+ : QWidget(parent), ui(new Ui::OtherLogsPage), m_path(path),
+ m_watcher(new RecursiveFileSystemWatcher(this))
+{
+ ui->setupUi(this);
+ ui->tabWidget->tabBar()->hide();
+
+ m_watcher->setFileExpression("(.*\\.log(\\.[0-9]*)?$)|(crash-.*\\.txt)");
+ m_watcher->setRootDir(QDir::current().absoluteFilePath(m_path));
+
+ connect(m_watcher, &RecursiveFileSystemWatcher::filesChanged, this,
+ &OtherLogsPage::populateSelectLogBox);
+ populateSelectLogBox();
+}
+
+OtherLogsPage::~OtherLogsPage()
+{
+ delete ui;
+}
+
+void OtherLogsPage::opened()
+{
+ m_watcher->enable();
+}
+void OtherLogsPage::closed()
+{
+ m_watcher->disable();
+}
+
+void OtherLogsPage::populateSelectLogBox()
+{
+ ui->selectLogBox->clear();
+ ui->selectLogBox->addItems(m_watcher->files());
+ if (m_currentFile.isNull())
+ {
+ ui->selectLogBox->setCurrentIndex(-1);
+ }
+ else
+ {
+ const int index = ui->selectLogBox->findText(m_currentFile);
+ if (index != -1)
+ ui->selectLogBox->setCurrentIndex(index);
+ }
+}
+
+void OtherLogsPage::on_selectLogBox_currentIndexChanged(const int index)
+{
+ QString file;
+ if (index != -1)
+ {
+ file = ui->selectLogBox->itemText(index);
+ }
+
+ if (file.isEmpty() || !QFile::exists(PathCombine(m_path, file)))
+ {
+ m_currentFile = QString();
+ ui->text->clear();
+ setControlsEnabled(false);
+ }
+ else
+ {
+ m_currentFile = file;
+ on_btnReload_clicked();
+ setControlsEnabled(true);
+ }
+}
+
+void OtherLogsPage::on_btnReload_clicked()
+{
+ QFile file(PathCombine(m_path, m_currentFile));
+ if (!file.open(QFile::ReadOnly))
+ {
+ setControlsEnabled(false);
+ ui->btnReload->setEnabled(true); // allow reload
+ m_currentFile = QString();
+ QMessageBox::critical(this, tr("Error"), tr("Unable to open %1 for reading: %2")
+ .arg(m_currentFile, file.errorString()));
+ }
+ else
+ {
+ if (file.size() < 10000000ll)
+ {
+ ui->text->setPlainText(QString::fromUtf8(file.readAll()));
+ }
+ else
+ {
+ ui->text->setPlainText(
+ tr("The file (%1) is too big. You may want to open it in a viewer optimized "
+ "for large files.").arg(file.fileName()));
+ }
+ }
+}
+
+void OtherLogsPage::on_btnPaste_clicked()
+{
+ GuiUtil::uploadPaste(ui->text->toPlainText(), this);
+}
+void OtherLogsPage::on_btnCopy_clicked()
+{
+ GuiUtil::setClipboardText(ui->text->toPlainText());
+}
+void OtherLogsPage::on_btnDelete_clicked()
+{
+ if (QMessageBox::question(this, tr("Delete"),
+ tr("Do you really want to delete %1?").arg(m_currentFile),
+ QMessageBox::Yes, QMessageBox::No) == QMessageBox::No)
+ {
+ return;
+ }
+ QFile file(PathCombine(m_path, m_currentFile));
+ if (!file.remove())
+ {
+ QMessageBox::critical(this, tr("Error"), tr("Unable to delete %1: %2")
+ .arg(m_currentFile, file.errorString()));
+ }
+}
+
+void OtherLogsPage::setControlsEnabled(const bool enabled)
+{
+ ui->btnReload->setEnabled(enabled);
+ ui->btnDelete->setEnabled(enabled);
+ ui->btnCopy->setEnabled(enabled);
+ ui->btnPaste->setEnabled(enabled);
+ ui->text->setEnabled(enabled);
+}
diff --git a/application/pages/OtherLogsPage.h b/application/pages/OtherLogsPage.h
new file mode 100644
index 00000000..d6e4ec9f
--- /dev/null
+++ b/application/pages/OtherLogsPage.h
@@ -0,0 +1,72 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "BasePage.h"
+#include <MultiMC.h>
+
+namespace Ui
+{
+class OtherLogsPage;
+}
+
+class RecursiveFileSystemWatcher;
+
+class OtherLogsPage : public QWidget, public BasePage
+{
+ Q_OBJECT
+
+public:
+ explicit OtherLogsPage(QString path, QWidget *parent = 0);
+ ~OtherLogsPage();
+
+ QString id() const override
+ {
+ return "logs";
+ }
+ QString displayName() const override
+ {
+ return tr("Other logs");
+ }
+ QIcon icon() const override
+ {
+ return MMC->getThemedIcon("log");
+ }
+ QString helpPage() const override
+ {
+ return "Minecraft-Logs";
+ }
+ void opened() override;
+ void closed() override;
+
+private slots:
+ void populateSelectLogBox();
+ void on_selectLogBox_currentIndexChanged(const int index);
+ void on_btnReload_clicked();
+ void on_btnPaste_clicked();
+ void on_btnCopy_clicked();
+ void on_btnDelete_clicked();
+
+private:
+ Ui::OtherLogsPage *ui;
+ QString m_path;
+ RecursiveFileSystemWatcher *m_watcher;
+ QString m_currentFile;
+
+ void setControlsEnabled(const bool enabled);
+};
diff --git a/application/pages/OtherLogsPage.ui b/application/pages/OtherLogsPage.ui
new file mode 100644
index 00000000..08200684
--- /dev/null
+++ b/application/pages/OtherLogsPage.ui
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>OtherLogsPage</class>
+ <widget class="QWidget" name="OtherLogsPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>657</width>
+ <height>538</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>Tab 1</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QComboBox" name="selectLogBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnReload">
+ <property name="text">
+ <string>Reload</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnCopy">
+ <property name="toolTip">
+ <string>Copy the whole log into the clipboard</string>
+ </property>
+ <property name="text">
+ <string>&amp;Copy</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnPaste">
+ <property name="toolTip">
+ <string>Upload the log to paste.ee - it will stay online for a month</string>
+ </property>
+ <property name="text">
+ <string>Upload</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnDelete">
+ <property name="toolTip">
+ <string>Clear the log</string>
+ </property>
+ <property name="text">
+ <string>Delete</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QPlainTextEdit" name="text">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOn</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>text</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/application/pages/ResourcePackPage.h b/application/pages/ResourcePackPage.h
new file mode 100644
index 00000000..d79590df
--- /dev/null
+++ b/application/pages/ResourcePackPage.h
@@ -0,0 +1,19 @@
+#pragma once
+#include "ModFolderPage.h"
+
+class ResourcePackPage : public ModFolderPage
+{
+public:
+ explicit ResourcePackPage(MinecraftInstance *instance, QWidget *parent = 0)
+ : ModFolderPage(instance, instance->resourcePackList(), "resourcepacks",
+ "resourcepacks", tr("Resource packs"), "Resource-packs", parent)
+ {
+ }
+
+ virtual ~ResourcePackPage() {}
+ virtual bool shouldDisplay() const override
+ {
+ return !m_inst->traits().contains("no-texturepacks") &&
+ !m_inst->traits().contains("texturepacks");
+ }
+};
diff --git a/application/pages/ScreenshotsPage.cpp b/application/pages/ScreenshotsPage.cpp
new file mode 100644
index 00000000..c81de407
--- /dev/null
+++ b/application/pages/ScreenshotsPage.cpp
@@ -0,0 +1,362 @@
+#include "ScreenshotsPage.h"
+#include "ui_ScreenshotsPage.h"
+
+#include <QModelIndex>
+#include <QMutableListIterator>
+#include <QMap>
+#include <QSet>
+#include <QFileIconProvider>
+#include <QFileSystemModel>
+#include <QStyledItemDelegate>
+#include <QLineEdit>
+#include <QEvent>
+#include <QPainter>
+#include <QClipboard>
+#include <QDesktopServices>
+#include <QKeyEvent>
+
+#include <pathutils.h>
+#include <MultiMC.h>
+
+#include "dialogs/ProgressDialog.h"
+#include "dialogs/CustomMessageBox.h"
+#include "net/NetJob.h"
+#include "screenshots/ImgurUpload.h"
+#include "screenshots/ImgurAlbumCreation.h"
+#include "tasks/SequentialTask.h"
+
+#include "RWStorage.h"
+
+typedef RWStorage<QString, QIcon> SharedIconCache;
+typedef std::shared_ptr<SharedIconCache> SharedIconCachePtr;
+
+class ThumbnailingResult : public QObject
+{
+ Q_OBJECT
+public slots:
+ inline void emitResultsReady(const QString &path) { emit resultsReady(path); }
+ inline void emitResultsFailed(const QString &path) { emit resultsFailed(path); }
+signals:
+ void resultsReady(const QString &path);
+ void resultsFailed(const QString &path);
+};
+
+class ThumbnailRunnable : public QRunnable
+{
+public:
+ ThumbnailRunnable(QString path, SharedIconCachePtr cache)
+ {
+ m_path = path;
+ m_cache = cache;
+ }
+ void run()
+ {
+ QFileInfo info(m_path);
+ if (info.isDir())
+ return;
+ if ((info.suffix().compare("png", Qt::CaseInsensitive) != 0))
+ return;
+ int tries = 5;
+ while (tries)
+ {
+ if (!m_cache->stale(m_path))
+ return;
+ QImage image(m_path);
+ if (image.isNull())
+ {
+ QThread::msleep(500);
+ tries--;
+ continue;
+ }
+ QImage small;
+ if (image.width() > image.height())
+ small = image.scaledToWidth(512).scaledToWidth(256, Qt::SmoothTransformation);
+ else
+ small = image.scaledToHeight(512).scaledToHeight(256, Qt::SmoothTransformation);
+ auto smallSize = small.size();
+ QPoint offset((256 - small.width()) / 2, (256 - small.height()) / 2);
+ QImage square(QSize(256, 256), QImage::Format_ARGB32);
+ square.fill(Qt::transparent);
+
+ QPainter painter(&square);
+ painter.drawImage(offset, small);
+ painter.end();
+
+ QIcon icon(QPixmap::fromImage(square));
+ m_cache->add(m_path, icon);
+ m_resultEmitter.emitResultsReady(m_path);
+ return;
+ }
+ m_resultEmitter.emitResultsFailed(m_path);
+ }
+ QString m_path;
+ SharedIconCachePtr m_cache;
+ ThumbnailingResult m_resultEmitter;
+};
+
+// this is about as elegant and well written as a bag of bricks with scribbles done by insane
+// asylum patients.
+class FilterModel : public QIdentityProxyModel
+{
+ Q_OBJECT
+public:
+ explicit FilterModel(QObject *parent = 0) : QIdentityProxyModel(parent)
+ {
+ m_thumbnailingPool.setMaxThreadCount(4);
+ m_thumbnailCache = std::make_shared<SharedIconCache>();
+ m_thumbnailCache->add("placeholder", MMC->getThemedIcon("screenshot-placeholder"));
+ connect(&watcher, SIGNAL(fileChanged(QString)), SLOT(fileChanged(QString)));
+ // FIXME: the watched file set is not updated when files are removed
+ }
+ virtual ~FilterModel() { m_thumbnailingPool.waitForDone(500); }
+ virtual QVariant data(const QModelIndex &proxyIndex, int role = Qt::DisplayRole) const
+ {
+ auto model = sourceModel();
+ if (!model)
+ return QVariant();
+ if (role == Qt::DisplayRole || role == Qt::EditRole)
+ {
+ QVariant result = sourceModel()->data(mapToSource(proxyIndex), role);
+ return result.toString().remove(QRegExp("\\.png$"));
+ }
+ if (role == Qt::DecorationRole)
+ {
+ QVariant result =
+ sourceModel()->data(mapToSource(proxyIndex), QFileSystemModel::FilePathRole);
+ QString filePath = result.toString();
+ QIcon temp;
+ if (!watched.contains(filePath))
+ {
+ ((QFileSystemWatcher &)watcher).addPath(filePath);
+ ((QSet<QString> &)watched).insert(filePath);
+ }
+ if (m_thumbnailCache->get(filePath, temp))
+ {
+ return temp;
+ }
+ if (!m_failed.contains(filePath))
+ {
+ ((FilterModel *)this)->thumbnailImage(filePath);
+ }
+ return (m_thumbnailCache->get("placeholder"));
+ }
+ return sourceModel()->data(mapToSource(proxyIndex), role);
+ }
+ virtual bool setData(const QModelIndex &index, const QVariant &value,
+ int role = Qt::EditRole)
+ {
+ auto model = sourceModel();
+ if (!model)
+ return false;
+ if (role != Qt::EditRole)
+ return false;
+ // FIXME: this is a workaround for a bug in QFileSystemModel, where it doesn't
+ // sort after renames
+ {
+ ((QFileSystemModel *)model)->setNameFilterDisables(true);
+ ((QFileSystemModel *)model)->setNameFilterDisables(false);
+ }
+ return model->setData(mapToSource(index), value.toString() + ".png", role);
+ }
+
+private:
+ void thumbnailImage(QString path)
+ {
+ auto runnable = new ThumbnailRunnable(path, m_thumbnailCache);
+ connect(&(runnable->m_resultEmitter), SIGNAL(resultsReady(QString)),
+ SLOT(thumbnailReady(QString)));
+ connect(&(runnable->m_resultEmitter), SIGNAL(resultsFailed(QString)),
+ SLOT(thumbnailFailed(QString)));
+ ((QThreadPool &)m_thumbnailingPool).start(runnable);
+ }
+private slots:
+ void thumbnailReady(QString path) { emit layoutChanged(); }
+ void thumbnailFailed(QString path) { m_failed.insert(path); }
+ void fileChanged(QString filepath)
+ {
+ m_thumbnailCache->setStale(filepath);
+ thumbnailImage(filepath);
+ // reinsert the path...
+ watcher.removePath(filepath);
+ watcher.addPath(filepath);
+ }
+
+private:
+ SharedIconCachePtr m_thumbnailCache;
+ QThreadPool m_thumbnailingPool;
+ QSet<QString> m_failed;
+ QSet<QString> watched;
+ QFileSystemWatcher watcher;
+};
+
+class CenteredEditingDelegate : public QStyledItemDelegate
+{
+public:
+ explicit CenteredEditingDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}
+ virtual ~CenteredEditingDelegate() {}
+ virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
+ const QModelIndex &index) const
+ {
+ auto widget = QStyledItemDelegate::createEditor(parent, option, index);
+ auto foo = dynamic_cast<QLineEdit *>(widget);
+ if (foo)
+ {
+ foo->setAlignment(Qt::AlignHCenter);
+ foo->setFrame(true);
+ foo->setMaximumWidth(192);
+ }
+ return widget;
+ }
+};
+
+ScreenshotsPage::ScreenshotsPage(QString path, QWidget *parent)
+ : QWidget(parent), ui(new Ui::ScreenshotsPage)
+{
+ m_model.reset(new QFileSystemModel());
+ m_filterModel.reset(new FilterModel());
+ m_filterModel->setSourceModel(m_model.get());
+ m_model->setFilter(QDir::Files | QDir::Writable | QDir::Readable);
+ m_model->setReadOnly(false);
+ m_model->setNameFilters({"*.png"});
+ m_model->setNameFilterDisables(false);
+ m_folder = path;
+ m_valid = ensureFolderPathExists(m_folder);
+
+ ui->setupUi(this);
+ ui->tabWidget->tabBar()->hide();
+ ui->listView->setModel(m_filterModel.get());
+ ui->listView->setIconSize(QSize(128, 128));
+ ui->listView->setGridSize(QSize(192, 160));
+ ui->listView->setSpacing(9);
+ // ui->listView->setUniformItemSizes(true);
+ ui->listView->setLayoutMode(QListView::Batched);
+ ui->listView->setViewMode(QListView::IconMode);
+ ui->listView->setResizeMode(QListView::Adjust);
+ ui->listView->installEventFilter(this);
+ ui->listView->setEditTriggers(0);
+ ui->listView->setItemDelegate(new CenteredEditingDelegate(this));
+ connect(ui->listView, SIGNAL(activated(QModelIndex)), SLOT(onItemActivated(QModelIndex)));
+}
+
+bool ScreenshotsPage::eventFilter(QObject *obj, QEvent *evt)
+{
+ if (obj != ui->listView)
+ return QWidget::eventFilter(obj, evt);
+ if (evt->type() != QEvent::KeyPress)
+ {
+ return QWidget::eventFilter(obj, evt);
+ }
+ QKeyEvent *keyEvent = static_cast<QKeyEvent *>(evt);
+ switch (keyEvent->key())
+ {
+ case Qt::Key_Delete:
+ on_deleteBtn_clicked();
+ return true;
+ case Qt::Key_F2:
+ on_renameBtn_clicked();
+ return true;
+ default:
+ break;
+ }
+ return QWidget::eventFilter(obj, evt);
+}
+
+ScreenshotsPage::~ScreenshotsPage()
+{
+ delete ui;
+}
+
+void ScreenshotsPage::onItemActivated(QModelIndex index)
+{
+ if (!index.isValid())
+ return;
+ auto info = m_model->fileInfo(index);
+ QString fileName = info.absoluteFilePath();
+ openFileInDefaultProgram(info.absoluteFilePath());
+}
+
+void ScreenshotsPage::on_viewFolderBtn_clicked()
+{
+ openDirInDefaultProgram(m_folder, true);
+}
+
+void ScreenshotsPage::on_uploadBtn_clicked()
+{
+ auto selection = ui->listView->selectionModel()->selectedIndexes();
+ if (selection.isEmpty())
+ return;
+
+ QList<ScreenshotPtr> uploaded;
+ auto job = std::make_shared<NetJob>("Screenshot Upload");
+ for (auto item : selection)
+ {
+ auto info = m_model->fileInfo(item);
+ auto screenshot = std::make_shared<ScreenShot>(info);
+ uploaded.push_back(screenshot);
+ job->addNetAction(ImgurUpload::make(screenshot));
+ }
+ SequentialTask task;
+ auto albumTask = std::make_shared<NetJob>("Imgur Album Creation");
+ auto imgurAlbum = ImgurAlbumCreation::make(uploaded);
+ albumTask->addNetAction(imgurAlbum);
+ task.addTask(job);
+ task.addTask(albumTask);
+ ProgressDialog prog(this);
+ if (prog.exec(&task) != QDialog::Accepted)
+ {
+ CustomMessageBox::selectable(this, tr("Failed to upload screenshots!"),
+ tr("Unknown error"), QMessageBox::Warning)->exec();
+ }
+ else
+ {
+ auto link = QString("https://imgur.com/a/%1").arg(imgurAlbum->id());
+ QClipboard *clipboard = QApplication::clipboard();
+ clipboard->setText(link);
+ QDesktopServices::openUrl(link);
+ CustomMessageBox::selectable(
+ this, tr("Upload finished"),
+ tr("The <a href=\"%1\">link to the uploaded album</a> has been opened in the "
+ "default browser and placed in your clipboard.<br/>Delete hash: %2 (save "
+ "this if you want to be able to edit/delete the album)")
+ .arg(link, imgurAlbum->deleteHash()),
+ QMessageBox::Information)->exec();
+ }
+}
+
+void ScreenshotsPage::on_deleteBtn_clicked()
+{
+ auto mbox = CustomMessageBox::selectable(
+ this, tr("Are you sure?"), tr("This will delete all selected screenshots."),
+ QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No);
+ std::unique_ptr<QMessageBox> box(mbox);
+
+ if (box->exec() != QMessageBox::Yes)
+ return;
+
+ auto selected = ui->listView->selectionModel()->selectedIndexes();
+ for (auto item : selected)
+ {
+ m_model->remove(item);
+ }
+}
+
+void ScreenshotsPage::on_renameBtn_clicked()
+{
+ auto selection = ui->listView->selectionModel()->selectedIndexes();
+ if (selection.isEmpty())
+ return;
+ ui->listView->edit(selection[0]);
+ // TODO: mass renaming
+}
+
+void ScreenshotsPage::opened()
+{
+ if (m_valid)
+ {
+ QString path = QDir(m_folder).absolutePath();
+ m_model->setRootPath(path);
+ ui->listView->setRootIndex(m_filterModel->mapFromSource(m_model->index(path)));
+ }
+}
+
+#include "ScreenshotsPage.moc"
diff --git a/application/pages/ScreenshotsPage.h b/application/pages/ScreenshotsPage.h
new file mode 100644
index 00000000..f5700ba8
--- /dev/null
+++ b/application/pages/ScreenshotsPage.h
@@ -0,0 +1,79 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "BasePage.h"
+#include <MultiMC.h>
+
+class QFileSystemModel;
+class QIdentityProxyModel;
+namespace Ui
+{
+class ScreenshotsPage;
+}
+
+struct ScreenShot;
+class ScreenshotList;
+class ImgurAlbumCreation;
+
+class ScreenshotsPage : public QWidget, public BasePage
+{
+ Q_OBJECT
+
+public:
+ explicit ScreenshotsPage(QString path, QWidget *parent = 0);
+ virtual ~ScreenshotsPage();
+
+ virtual void opened() override;
+
+ enum
+ {
+ NothingDone = 0x42
+ };
+
+ virtual bool eventFilter(QObject *, QEvent *);
+ virtual QString displayName() const override
+ {
+ return tr("Screenshots");
+ }
+ virtual QIcon icon() const override
+ {
+ return MMC->getThemedIcon("screenshots");
+ }
+ virtual QString id() const override
+ {
+ return "screenshots";
+ }
+ virtual QString helpPage() const override
+ {
+ return "Screenshots-management";
+ }
+private slots:
+ void on_uploadBtn_clicked();
+ void on_deleteBtn_clicked();
+ void on_renameBtn_clicked();
+ void on_viewFolderBtn_clicked();
+ void onItemActivated(QModelIndex);
+
+private:
+ Ui::ScreenshotsPage *ui;
+ std::shared_ptr<QFileSystemModel> m_model;
+ std::shared_ptr<QIdentityProxyModel> m_filterModel;
+ QString m_folder;
+ bool m_valid = false;
+};
diff --git a/application/pages/ScreenshotsPage.ui b/application/pages/ScreenshotsPage.ui
new file mode 100644
index 00000000..30b55092
--- /dev/null
+++ b/application/pages/ScreenshotsPage.ui
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ScreenshotsPage</class>
+ <widget class="QWidget" name="ScreenshotsPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>723</width>
+ <height>532</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Mods</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>Tab 1</string>
+ </attribute>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QListView" name="listView">
+ <property name="selectionMode">
+ <enum>QAbstractItemView::ExtendedSelection</enum>
+ </property>
+ <property name="selectionBehavior">
+ <enum>QAbstractItemView::SelectItems</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QPushButton" name="uploadBtn">
+ <property name="text">
+ <string>&amp;Upload</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="deleteBtn">
+ <property name="text">
+ <string>&amp;Delete</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="renameBtn">
+ <property name="text">
+ <string>&amp;Rename</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="viewFolderBtn">
+ <property name="text">
+ <string>&amp;View Folder</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>listView</tabstop>
+ <tabstop>uploadBtn</tabstop>
+ <tabstop>deleteBtn</tabstop>
+ <tabstop>renameBtn</tabstop>
+ <tabstop>viewFolderBtn</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/application/pages/TexturePackPage.h b/application/pages/TexturePackPage.h
new file mode 100644
index 00000000..3c5c27d7
--- /dev/null
+++ b/application/pages/TexturePackPage.h
@@ -0,0 +1,17 @@
+#pragma once
+#include "ModFolderPage.h"
+
+class TexturePackPage : public ModFolderPage
+{
+public:
+ explicit TexturePackPage(MinecraftInstance *instance, QWidget *parent = 0)
+ : ModFolderPage(instance, instance->texturePackList(), "texturepacks", "resourcepacks",
+ tr("Texture packs"), "Texture-packs", parent)
+ {
+ }
+ virtual ~TexturePackPage() {}
+ virtual bool shouldDisplay() const override
+ {
+ return m_inst->traits().contains("texturepacks");
+ }
+};
diff --git a/application/pages/VersionPage.cpp b/application/pages/VersionPage.cpp
new file mode 100644
index 00000000..9b656220
--- /dev/null
+++ b/application/pages/VersionPage.cpp
@@ -0,0 +1,321 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "MultiMC.h"
+
+#include <pathutils.h>
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QEvent>
+#include <QKeyEvent>
+
+#include "VersionPage.h"
+#include "ui_VersionPage.h"
+
+#include "Platform.h"
+#include "dialogs/CustomMessageBox.h"
+#include "dialogs/VersionSelectDialog.h"
+#include "dialogs/ModEditDialogCommon.h"
+
+#include "dialogs/ProgressDialog.h"
+
+#include <QAbstractItemModel>
+#include <QMessageBox>
+#include <QListView>
+#include <QString>
+#include <QUrl>
+
+#include "minecraft/MinecraftProfile.h"
+#include "forge/ForgeVersionList.h"
+#include "forge/ForgeInstaller.h"
+#include "liteloader/LiteLoaderVersionList.h"
+#include "liteloader/LiteLoaderInstaller.h"
+#include "minecraft/VersionBuilder.h"
+#include "auth/MojangAccountList.h"
+#include "minecraft/Mod.h"
+#include "icons/IconList.h"
+
+
+QIcon VersionPage::icon() const
+{
+ return ENV.icons()->getIcon(m_inst->iconKey());
+}
+bool VersionPage::shouldDisplay() const
+{
+ return !m_inst->isRunning();
+}
+
+VersionPage::VersionPage(OneSixInstance *inst, QWidget *parent)
+ : QWidget(parent), ui(new Ui::VersionPage), m_inst(inst)
+{
+ ui->setupUi(this);
+ ui->tabWidget->tabBar()->hide();
+
+ m_version = m_inst->getMinecraftProfile();
+ if (m_version)
+ {
+ ui->libraryTreeView->setModel(m_version.get());
+ ui->libraryTreeView->installEventFilter(this);
+ ui->libraryTreeView->setSelectionMode(QAbstractItemView::SingleSelection);
+ connect(ui->libraryTreeView->selectionModel(), &QItemSelectionModel::currentChanged,
+ this, &VersionPage::versionCurrent);
+ updateVersionControls();
+ // select first item.
+ auto index = ui->libraryTreeView->model()->index(0,0);
+ if(index.isValid())
+ ui->libraryTreeView->setCurrentIndex(index);
+ }
+ else
+ {
+ disableVersionControls();
+ }
+ connect(m_inst, &OneSixInstance::versionReloaded, this,
+ &VersionPage::updateVersionControls);
+}
+
+VersionPage::~VersionPage()
+{
+ delete ui;
+}
+
+void VersionPage::updateVersionControls()
+{
+ ui->forgeBtn->setEnabled(true);
+ ui->liteloaderBtn->setEnabled(true);
+}
+
+void VersionPage::disableVersionControls()
+{
+ ui->forgeBtn->setEnabled(false);
+ ui->liteloaderBtn->setEnabled(false);
+ ui->reloadLibrariesBtn->setEnabled(false);
+ ui->removeLibraryBtn->setEnabled(false);
+}
+
+bool VersionPage::reloadMinecraftProfile()
+{
+ try
+ {
+ m_inst->reloadProfile();
+ return true;
+ }
+ catch (MMCError &e)
+ {
+ QMessageBox::critical(this, tr("Error"), e.cause());
+ return false;
+ }
+ catch (...)
+ {
+ QMessageBox::critical(
+ this, tr("Error"),
+ tr("Failed to load the version description file for reasons unknown."));
+ return false;
+ }
+}
+
+void VersionPage::on_reloadLibrariesBtn_clicked()
+{
+ reloadMinecraftProfile();
+}
+
+void VersionPage::on_removeLibraryBtn_clicked()
+{
+ if (ui->libraryTreeView->currentIndex().isValid())
+ {
+ // FIXME: use actual model, not reloading.
+ if (!m_version->remove(ui->libraryTreeView->currentIndex().row()))
+ {
+ QMessageBox::critical(this, tr("Error"), tr("Couldn't remove file"));
+ }
+ }
+}
+
+void VersionPage::on_jarmodBtn_clicked()
+{
+ QFileDialog w;
+ QSet<QString> locations;
+ QString modsFolder = MMC->settings()->get("CentralModsDir").toString();
+ auto f = [&](QStandardPaths::StandardLocation l)
+ {
+ QString location = QStandardPaths::writableLocation(l);
+ QFileInfo finfo(location);
+ if (!finfo.exists())
+ return;
+ locations.insert(location);
+ };
+ f(QStandardPaths::DesktopLocation);
+ f(QStandardPaths::DocumentsLocation);
+ f(QStandardPaths::DownloadLocation);
+ f(QStandardPaths::HomeLocation);
+ QList<QUrl> urls;
+ for (auto location : locations)
+ {
+ urls.append(QUrl::fromLocalFile(location));
+ }
+ urls.append(QUrl::fromLocalFile(modsFolder));
+
+ w.setFileMode(QFileDialog::ExistingFiles);
+ w.setAcceptMode(QFileDialog::AcceptOpen);
+ w.setNameFilter(tr("Minecraft jar mods (*.zip *.jar)"));
+ w.setDirectory(modsFolder);
+ w.setSidebarUrls(urls);
+
+ if (w.exec())
+ m_version->installJarMods(w.selectedFiles());
+}
+
+void VersionPage::on_resetLibraryOrderBtn_clicked()
+{
+ try
+ {
+ m_version->resetOrder();
+ }
+ catch (MMCError &e)
+ {
+ QMessageBox::critical(this, tr("Error"), e.cause());
+ }
+}
+
+void VersionPage::on_moveLibraryUpBtn_clicked()
+{
+ if (ui->libraryTreeView->selectionModel()->selectedRows().isEmpty())
+ {
+ return;
+ }
+ try
+ {
+ const int row = ui->libraryTreeView->selectionModel()->selectedRows().first().row();
+ m_version->move(row, MinecraftProfile::MoveUp);
+ }
+ catch (MMCError &e)
+ {
+ QMessageBox::critical(this, tr("Error"), e.cause());
+ }
+}
+
+void VersionPage::on_moveLibraryDownBtn_clicked()
+{
+ if (ui->libraryTreeView->selectionModel()->selectedRows().isEmpty())
+ {
+ return;
+ }
+ try
+ {
+ const int row = ui->libraryTreeView->selectionModel()->selectedRows().first().row();
+ m_version->move(row, MinecraftProfile::MoveDown);
+ }
+ catch (MMCError &e)
+ {
+ QMessageBox::critical(this, tr("Error"), e.cause());
+ }
+}
+
+void VersionPage::on_changeMCVersionBtn_clicked()
+{
+ VersionSelectDialog vselect(m_inst->versionList().get(), tr("Change Minecraft version"),
+ this);
+ if (!vselect.exec() || !vselect.selectedVersion())
+ return;
+
+ if (!MMC->accounts()->anyAccountIsValid())
+ {
+ CustomMessageBox::selectable(
+ this, tr("Error"),
+ tr("MultiMC cannot download Minecraft or update instances unless you have at least "
+ "one account added.\nPlease add your Mojang or Minecraft account."),
+ QMessageBox::Warning)->show();
+ return;
+ }
+
+ if (!m_version->isVanilla())
+ {
+ auto result = CustomMessageBox::selectable(
+ this, tr("Are you sure?"),
+ tr("This will remove any library/version customization you did previously. "
+ "This includes things like Forge install and similar."),
+ QMessageBox::Warning, QMessageBox::Ok | QMessageBox::Abort,
+ QMessageBox::Abort)->exec();
+
+ if (result != QMessageBox::Ok)
+ return;
+ m_version->revertToVanilla();
+ reloadMinecraftProfile();
+ }
+ m_inst->setIntendedVersionId(vselect.selectedVersion()->descriptor());
+
+ auto updateTask = m_inst->doUpdate();
+ if (!updateTask)
+ {
+ return;
+ }
+ ProgressDialog tDialog(this);
+ connect(updateTask.get(), SIGNAL(failed(QString)), SLOT(onGameUpdateError(QString)));
+ tDialog.exec(updateTask.get());
+}
+
+void VersionPage::on_forgeBtn_clicked()
+{
+ VersionSelectDialog vselect(MMC->forgelist().get(), tr("Select Forge version"), this);
+ vselect.setExactFilter(1, m_inst->currentVersionId());
+ vselect.setEmptyString(tr("No Forge versions are currently available for Minecraft ") +
+ m_inst->currentVersionId());
+ if (vselect.exec() && vselect.selectedVersion())
+ {
+ ProgressDialog dialog(this);
+ dialog.exec(
+ ForgeInstaller().createInstallTask(m_inst, vselect.selectedVersion(), this));
+ }
+}
+
+void VersionPage::on_liteloaderBtn_clicked()
+{
+ VersionSelectDialog vselect(MMC->liteloaderlist().get(), tr("Select LiteLoader version"),
+ this);
+ vselect.setExactFilter(1, m_inst->currentVersionId());
+ vselect.setEmptyString(tr("No LiteLoader versions are currently available for Minecraft ") +
+ m_inst->currentVersionId());
+ if (vselect.exec() && vselect.selectedVersion())
+ {
+ ProgressDialog dialog(this);
+ dialog.exec(
+ LiteLoaderInstaller().createInstallTask(m_inst, vselect.selectedVersion(), this));
+ }
+}
+
+void VersionPage::versionCurrent(const QModelIndex &current, const QModelIndex &previous)
+{
+ if (!current.isValid())
+ {
+ ui->removeLibraryBtn->setDisabled(true);
+ ui->moveLibraryDownBtn->setDisabled(true);
+ ui->moveLibraryUpBtn->setDisabled(true);
+ }
+ else
+ {
+ bool enabled = m_version->canRemove(current.row());
+ ui->removeLibraryBtn->setEnabled(enabled);
+ ui->moveLibraryDownBtn->setEnabled(enabled);
+ ui->moveLibraryUpBtn->setEnabled(enabled);
+ }
+ QString selectedId = m_version->versionFileId(current.row());
+ if (selectedId == "net.minecraft")
+ {
+ ui->changeMCVersionBtn->setEnabled(true);
+ }
+ else
+ {
+ ui->changeMCVersionBtn->setEnabled(false);
+ }
+}
diff --git a/application/pages/VersionPage.h b/application/pages/VersionPage.h
new file mode 100644
index 00000000..587fcf07
--- /dev/null
+++ b/application/pages/VersionPage.h
@@ -0,0 +1,80 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "minecraft/OneSixInstance.h"
+#include "net/NetJob.h"
+#include "BasePage.h"
+
+namespace Ui
+{
+class VersionPage;
+}
+
+class VersionPage : public QWidget, public BasePage
+{
+ Q_OBJECT
+
+public:
+ explicit VersionPage(OneSixInstance *inst, QWidget *parent = 0);
+ virtual ~VersionPage();
+ virtual QString displayName() const override
+ {
+ return tr("Version");
+ }
+ virtual QIcon icon() const override;
+ virtual QString id() const override
+ {
+ return "version";
+ }
+ virtual QString helpPage() const override
+ {
+ return "Instance-version";
+ }
+ virtual bool shouldDisplay() const;
+private
+slots:
+
+ // version tab
+ void on_forgeBtn_clicked();
+ void on_liteloaderBtn_clicked();
+ void on_reloadLibrariesBtn_clicked();
+ void on_removeLibraryBtn_clicked();
+ void on_resetLibraryOrderBtn_clicked();
+ void on_moveLibraryUpBtn_clicked();
+ void on_moveLibraryDownBtn_clicked();
+ void on_jarmodBtn_clicked();
+
+ void updateVersionControls();
+ void disableVersionControls();
+ void on_changeMCVersionBtn_clicked();
+
+protected:
+ /// FIXME: this shouldn't be necessary!
+ bool reloadMinecraftProfile();
+
+private:
+ Ui::VersionPage *ui;
+ std::shared_ptr<MinecraftProfile> m_version;
+ OneSixInstance *m_inst;
+ NetJobPtr forgeJob;
+
+public
+slots:
+ void versionCurrent(const QModelIndex &current, const QModelIndex &previous);
+};
diff --git a/application/pages/VersionPage.ui b/application/pages/VersionPage.ui
new file mode 100644
index 00000000..67a556c8
--- /dev/null
+++ b/application/pages/VersionPage.ui
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>VersionPage</class>
+ <widget class="QWidget" name="VersionPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>693</width>
+ <height>575</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Version</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>Tab 1</string>
+ </attribute>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="ModListView" name="libraryTreeView">
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOn</enum>
+ </property>
+ <property name="horizontalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOff</enum>
+ </property>
+ <property name="headerHidden">
+ <bool>false</bool>
+ </property>
+ <attribute name="headerVisible">
+ <bool>true</bool>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Selection</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="changeMCVersionBtn">
+ <property name="text">
+ <string>Change version</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="moveLibraryUpBtn">
+ <property name="toolTip">
+ <string>This isn't implemented yet.</string>
+ </property>
+ <property name="text">
+ <string>Move up</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="moveLibraryDownBtn">
+ <property name="toolTip">
+ <string>This isn't implemented yet.</string>
+ </property>
+ <property name="text">
+ <string>Move down</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="removeLibraryBtn">
+ <property name="text">
+ <string>Remove</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="LineSeparator" name="separator" native="true"/>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Install</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="forgeBtn">
+ <property name="toolTip">
+ <string>Replace any current custom version with Minecraft Forge</string>
+ </property>
+ <property name="text">
+ <string>Install Forge</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="liteloaderBtn">
+ <property name="text">
+ <string>Install LiteLoader</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="jarmodBtn">
+ <property name="text">
+ <string>Add jar mod</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="LineSeparator" name="widget" native="true"/>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>List</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="resetLibraryOrderBtn">
+ <property name="toolTip">
+ <string>This isn't implemented yet.</string>
+ </property>
+ <property name="text">
+ <string>Reset order</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="reloadLibrariesBtn">
+ <property name="text">
+ <string>Reload</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_7">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>ModListView</class>
+ <extends>QTreeView</extends>
+ <header>widgets/ModListView.h</header>
+ </customwidget>
+ <customwidget>
+ <class>LineSeparator</class>
+ <extends>QWidget</extends>
+ <header>widgets/LineSeparator.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/application/pages/global/AccountListPage.cpp b/application/pages/global/AccountListPage.cpp
new file mode 100644
index 00000000..7be72aaa
--- /dev/null
+++ b/application/pages/global/AccountListPage.cpp
@@ -0,0 +1,142 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "AccountListPage.h"
+#include "ui_AccountListPage.h"
+
+#include <QItemSelectionModel>
+
+#include <QDebug>
+
+#include "net/NetJob.h"
+#include "net/URLConstants.h"
+#include "Env.h"
+
+#include "dialogs/EditAccountDialog.h"
+#include "dialogs/ProgressDialog.h"
+#include "dialogs/AccountSelectDialog.h"
+#include "dialogs/LoginDialog.h"
+#include "dialogs/CustomMessageBox.h"
+#include "tasks/Task.h"
+#include "auth/YggdrasilTask.h"
+
+#include "MultiMC.h"
+
+AccountListPage::AccountListPage(QWidget *parent)
+ : QWidget(parent), ui(new Ui::AccountListPage)
+{
+ ui->setupUi(this);
+ ui->tabWidget->tabBar()->hide();
+
+ m_accounts = MMC->accounts();
+
+ ui->listView->setModel(m_accounts.get());
+ ui->listView->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
+
+ // Expand the account column
+ ui->listView->header()->setSectionResizeMode(1, QHeaderView::Stretch);
+
+ QItemSelectionModel *selectionModel = ui->listView->selectionModel();
+
+ connect(selectionModel, &QItemSelectionModel::selectionChanged,
+ [this](const QItemSelection &sel, const QItemSelection &dsel)
+ { updateButtonStates(); });
+
+ connect(m_accounts.get(), SIGNAL(listChanged()), SLOT(listChanged()));
+ connect(m_accounts.get(), SIGNAL(activeAccountChanged()), SLOT(listChanged()));
+
+ updateButtonStates();
+}
+
+AccountListPage::~AccountListPage()
+{
+ delete ui;
+}
+
+void AccountListPage::listChanged()
+{
+ updateButtonStates();
+}
+
+void AccountListPage::on_addAccountBtn_clicked()
+{
+ addAccount(tr("Please enter your Mojang or Minecraft account username and password to add "
+ "your account."));
+}
+
+void AccountListPage::on_rmAccountBtn_clicked()
+{
+ QModelIndexList selection = ui->listView->selectionModel()->selectedIndexes();
+ if (selection.size() > 0)
+ {
+ QModelIndex selected = selection.first();
+ m_accounts->removeAccount(selected);
+ }
+}
+
+void AccountListPage::on_setDefaultBtn_clicked()
+{
+ QModelIndexList selection = ui->listView->selectionModel()->selectedIndexes();
+ if (selection.size() > 0)
+ {
+ QModelIndex selected = selection.first();
+ MojangAccountPtr account =
+ selected.data(MojangAccountList::PointerRole).value<MojangAccountPtr>();
+ m_accounts->setActiveAccount(account->username());
+ }
+}
+
+void AccountListPage::on_noDefaultBtn_clicked()
+{
+ m_accounts->setActiveAccount("");
+}
+
+void AccountListPage::updateButtonStates()
+{
+ // If there is no selection, disable buttons that require something selected.
+ QModelIndexList selection = ui->listView->selectionModel()->selectedIndexes();
+
+ ui->rmAccountBtn->setEnabled(selection.size() > 0);
+ ui->setDefaultBtn->setEnabled(selection.size() > 0);
+
+ ui->noDefaultBtn->setDown(m_accounts->activeAccount().get() == nullptr);
+}
+
+void AccountListPage::addAccount(const QString &errMsg)
+{
+ // TODO: The login dialog isn't quite done yet
+ MojangAccountPtr account = LoginDialog::newAccount(this, errMsg);
+
+ if (account != nullptr)
+ {
+ m_accounts->addAccount(account);
+ if (m_accounts->count() == 1)
+ m_accounts->setActiveAccount(account->username());
+
+ // Grab associated player skins
+ auto job = new NetJob("Player skins: " + account->username());
+
+ for (AccountProfile profile : account->profiles())
+ {
+ auto meta = Env::getInstance().metacache()->resolveEntry("skins", profile.name + ".png");
+ auto action = CacheDownload::make(
+ QUrl("http://" + URLConstants::SKINS_BASE + profile.name + ".png"), meta);
+ job->addNetAction(action);
+ meta->stale = true;
+ }
+
+ job->start();
+ }
+}
diff --git a/application/pages/global/AccountListPage.h b/application/pages/global/AccountListPage.h
new file mode 100644
index 00000000..dad68b0c
--- /dev/null
+++ b/application/pages/global/AccountListPage.h
@@ -0,0 +1,86 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QDialog>
+#include <memory>
+
+#include "pages/BasePage.h"
+
+#include "auth/MojangAccountList.h"
+#include <MultiMC.h>
+
+namespace Ui
+{
+class AccountListPage;
+}
+
+class AuthenticateTask;
+
+class AccountListPage : public QWidget, public BasePage
+{
+ Q_OBJECT
+public:
+ explicit AccountListPage(QWidget *parent = 0);
+ ~AccountListPage();
+
+ QString displayName() const override
+ {
+ return tr("Accounts");
+ }
+ QIcon icon() const override
+ {
+ auto icon = MMC->getThemedIcon("accounts");
+ if(icon.isNull())
+ {
+ icon = MMC->getThemedIcon("noaccount");
+ }
+ return icon;
+ }
+ QString id() const override
+ {
+ return "accounts";
+ }
+ QString helpPage() const override
+ {
+ return "Accounts";
+ }
+
+public
+slots:
+ void on_addAccountBtn_clicked();
+
+ void on_rmAccountBtn_clicked();
+
+ void on_setDefaultBtn_clicked();
+
+ void on_noDefaultBtn_clicked();
+
+ void listChanged();
+
+ //! Updates the states of the dialog's buttons.
+ void updateButtonStates();
+
+protected:
+ std::shared_ptr<MojangAccountList> m_accounts;
+
+protected
+slots:
+ void addAccount(const QString& errMsg="");
+
+private:
+ Ui::AccountListPage *ui;
+};
diff --git a/application/pages/global/AccountListPage.ui b/application/pages/global/AccountListPage.ui
new file mode 100644
index 00000000..8ad78cf4
--- /dev/null
+++ b/application/pages/global/AccountListPage.ui
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AccountListPage</class>
+ <widget class="QWidget" name="AccountListPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>694</width>
+ <height>609</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Manage Accounts</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>Tab 1</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="welcomeLabel">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Welcome! If you're new here, you can click the &amp;quot;Add&amp;quot; button to add your Mojang or Minecraft account.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QTreeView" name="listView"/>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="manageAcctsBtnBox">
+ <item>
+ <widget class="QPushButton" name="addAccountBtn">
+ <property name="text">
+ <string>&amp;Add</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="rmAccountBtn">
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="buttonSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="setDefaultBtn">
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set the currently selected account as the active account. The active account is the account that is used to log in (unless it is overridden in an instance-specific setting).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>&amp;Set Default</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="noDefaultBtn">
+ <property name="toolTip">
+ <string>Set no default account. This will cause MultiMC to prompt you to select an account every time you launch an instance that doesn't have its own default set.</string>
+ </property>
+ <property name="text">
+ <string>&amp;No Default</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/application/pages/global/ExternalToolsPage.cpp b/application/pages/global/ExternalToolsPage.cpp
new file mode 100644
index 00000000..426432a0
--- /dev/null
+++ b/application/pages/global/ExternalToolsPage.cpp
@@ -0,0 +1,238 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ExternalToolsPage.h"
+#include "ui_ExternalToolsPage.h"
+
+#include <QMessageBox>
+#include <QFileDialog>
+#include <QStandardPaths>
+
+#include <pathutils.h>
+
+#include "settings/SettingsObject.h"
+#include "tools/BaseProfiler.h"
+#include "MultiMC.h"
+
+ExternalToolsPage::ExternalToolsPage(QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::ExternalToolsPage)
+{
+ ui->setupUi(this);
+ ui->tabWidget->tabBar()->hide();
+
+ #if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
+ ui->jsonEditorTextBox->setClearButtonEnabled(true);
+ #endif
+
+ ui->mceditLink->setOpenExternalLinks(true);
+ ui->jvisualvmLink->setOpenExternalLinks(true);
+ ui->jprofilerLink->setOpenExternalLinks(true);
+ loadSettings();
+}
+
+ExternalToolsPage::~ExternalToolsPage()
+{
+ delete ui;
+}
+
+void ExternalToolsPage::loadSettings()
+{
+ auto s = MMC->settings();
+ ui->jprofilerPathEdit->setText(s->get("JProfilerPath").toString());
+ ui->jvisualvmPathEdit->setText(s->get("JVisualVMPath").toString());
+ ui->mceditPathEdit->setText(s->get("MCEditPath").toString());
+
+ // Editors
+ ui->jsonEditorTextBox->setText(s->get("JsonEditor").toString());
+}
+void ExternalToolsPage::applySettings()
+{
+ auto s = MMC->settings();
+ s->set("JProfilerPath", ui->jprofilerPathEdit->text());
+ s->set("JVisualVMPath", ui->jvisualvmPathEdit->text());
+ s->set("MCEditPath", ui->mceditPathEdit->text());
+
+ // Editors
+ QString jsonEditor = ui->jsonEditorTextBox->text();
+ if (!jsonEditor.isEmpty() &&
+ (!QFileInfo(jsonEditor).exists() || !QFileInfo(jsonEditor).isExecutable()))
+ {
+ QString found = QStandardPaths::findExecutable(jsonEditor);
+ if (!found.isEmpty())
+ {
+ jsonEditor = found;
+ }
+ }
+ s->set("JsonEditor", jsonEditor);
+}
+
+void ExternalToolsPage::on_jprofilerPathBtn_clicked()
+{
+ QString raw_dir = ui->jprofilerPathEdit->text();
+ QString error;
+ do
+ {
+ raw_dir = QFileDialog::getExistingDirectory(this, tr("JProfiler Directory"), raw_dir);
+ if (raw_dir.isEmpty())
+ {
+ break;
+ }
+ QString cooked_dir = NormalizePath(raw_dir);
+ if (!MMC->profilers()["jprofiler"]->check(cooked_dir, &error))
+ {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Error while checking JProfiler install:\n%1").arg(error));
+ continue;
+ }
+ else
+ {
+ ui->jprofilerPathEdit->setText(cooked_dir);
+ break;
+ }
+ } while (1);
+}
+void ExternalToolsPage::on_jprofilerCheckBtn_clicked()
+{
+ QString error;
+ if (!MMC->profilers()["jprofiler"]->check(ui->jprofilerPathEdit->text(), &error))
+ {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Error while checking JProfiler install:\n%1").arg(error));
+ }
+ else
+ {
+ QMessageBox::information(this, tr("OK"), tr("JProfiler setup seems to be OK"));
+ }
+}
+
+void ExternalToolsPage::on_jvisualvmPathBtn_clicked()
+{
+ QString raw_dir = ui->jvisualvmPathEdit->text();
+ QString error;
+ do
+ {
+ raw_dir = QFileDialog::getOpenFileName(this, tr("JVisualVM Executable"), raw_dir);
+ if (raw_dir.isEmpty())
+ {
+ break;
+ }
+ QString cooked_dir = NormalizePath(raw_dir);
+ if (!MMC->profilers()["jvisualvm"]->check(cooked_dir, &error))
+ {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Error while checking JVisualVM install:\n%1").arg(error));
+ continue;
+ }
+ else
+ {
+ ui->jvisualvmPathEdit->setText(cooked_dir);
+ break;
+ }
+ } while (1);
+}
+void ExternalToolsPage::on_jvisualvmCheckBtn_clicked()
+{
+ QString error;
+ if (!MMC->profilers()["jvisualvm"]->check(ui->jvisualvmPathEdit->text(), &error))
+ {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Error while checking JVisualVM install:\n%1").arg(error));
+ }
+ else
+ {
+ QMessageBox::information(this, tr("OK"), tr("JVisualVM setup seems to be OK"));
+ }
+}
+
+void ExternalToolsPage::on_mceditPathBtn_clicked()
+{
+ QString raw_dir = ui->mceditPathEdit->text();
+ QString error;
+ do
+ {
+#ifdef Q_OS_OSX
+#warning stuff
+ raw_dir = QFileDialog::getOpenFileName(this, tr("MCEdit Application"), raw_dir);
+#else
+ raw_dir = QFileDialog::getExistingDirectory(this, tr("MCEdit Directory"), raw_dir);
+#endif
+ if (raw_dir.isEmpty())
+ {
+ break;
+ }
+ QString cooked_dir = NormalizePath(raw_dir);
+ if (!MMC->tools()["mcedit"]->check(cooked_dir, &error))
+ {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Error while checking MCEdit install:\n%1").arg(error));
+ continue;
+ }
+ else
+ {
+ ui->mceditPathEdit->setText(cooked_dir);
+ break;
+ }
+ } while (1);
+}
+void ExternalToolsPage::on_mceditCheckBtn_clicked()
+{
+ QString error;
+ if (!MMC->tools()["mcedit"]->check(ui->mceditPathEdit->text(), &error))
+ {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Error while checking MCEdit install:\n%1").arg(error));
+ }
+ else
+ {
+ QMessageBox::information(this, tr("OK"), tr("MCEdit setup seems to be OK"));
+ }
+}
+
+void ExternalToolsPage::on_jsonEditorBrowseBtn_clicked()
+{
+ QString raw_file = QFileDialog::getOpenFileName(
+ this, tr("JSON Editor"),
+ ui->jsonEditorTextBox->text().isEmpty()
+#if defined(Q_OS_LINUX)
+ ? QString("/usr/bin")
+#else
+ ? QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation).first()
+#endif
+ : ui->jsonEditorTextBox->text());
+ QString cooked_file = NormalizePath(raw_file);
+
+ if (cooked_file.isEmpty())
+ {
+ return;
+ }
+
+ // it has to exist and be an executable
+ if (QFileInfo(cooked_file).exists() && QFileInfo(cooked_file).isExecutable())
+ {
+ ui->jsonEditorTextBox->setText(cooked_file);
+ }
+ else
+ {
+ QMessageBox::warning(this, tr("Invalid"),
+ tr("The file chosen does not seem to be an executable"));
+ }
+}
+
+bool ExternalToolsPage::apply()
+{
+ applySettings();
+ return true;
+}
diff --git a/application/pages/global/ExternalToolsPage.h b/application/pages/global/ExternalToolsPage.h
new file mode 100644
index 00000000..43e72dcd
--- /dev/null
+++ b/application/pages/global/ExternalToolsPage.h
@@ -0,0 +1,74 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "pages/BasePage.h"
+#include <MultiMC.h>
+
+namespace Ui {
+class ExternalToolsPage;
+}
+
+class ExternalToolsPage : public QWidget, public BasePage
+{
+ Q_OBJECT
+
+public:
+ explicit ExternalToolsPage(QWidget *parent = 0);
+ ~ExternalToolsPage();
+
+ QString displayName() const override
+ {
+ return tr("External Tools");
+ }
+ QIcon icon() const override
+ {
+ auto icon = MMC->getThemedIcon("externaltools");
+ if(icon.isNull())
+ {
+ icon = MMC->getThemedIcon("loadermods");
+ }
+ return icon;
+ }
+ QString id() const override
+ {
+ return "external-tools";
+ }
+ QString helpPage() const override
+ {
+ return "External-tools";
+ }
+ virtual bool apply();
+
+private:
+ void loadSettings();
+ void applySettings();
+
+private:
+ Ui::ExternalToolsPage *ui;
+
+private
+slots:
+ void on_jprofilerPathBtn_clicked();
+ void on_jprofilerCheckBtn_clicked();
+ void on_jvisualvmPathBtn_clicked();
+ void on_jvisualvmCheckBtn_clicked();
+ void on_mceditPathBtn_clicked();
+ void on_mceditCheckBtn_clicked();
+ void on_jsonEditorBrowseBtn_clicked();
+};
diff --git a/application/pages/global/ExternalToolsPage.ui b/application/pages/global/ExternalToolsPage.ui
new file mode 100644
index 00000000..ba1b6f01
--- /dev/null
+++ b/application/pages/global/ExternalToolsPage.ui
@@ -0,0 +1,197 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ExternalToolsPage</class>
+ <widget class="QWidget" name="ExternalToolsPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>673</width>
+ <height>751</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>Tab 1</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string>JProfiler</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_10">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QLineEdit" name="jprofilerPathEdit"/>
+ </item>
+ <item>
+ <widget class="QPushButton" name="jprofilerPathBtn">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QPushButton" name="jprofilerCheckBtn">
+ <property name="text">
+ <string>Check</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="jprofilerLink">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;http://www.ej-technologies.com/products/jprofiler/overview.html&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;http://www.ej-technologies.com/products/jprofiler/overview.html&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_3">
+ <property name="title">
+ <string>JVisualVM</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_11">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_5">
+ <item>
+ <widget class="QLineEdit" name="jvisualvmPathEdit"/>
+ </item>
+ <item>
+ <widget class="QPushButton" name="jvisualvmPathBtn">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QPushButton" name="jvisualvmCheckBtn">
+ <property name="text">
+ <string>Check</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="jvisualvmLink">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;http://visualvm.java.net/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;http://visualvm.java.net/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_4">
+ <property name="title">
+ <string>MCEdit</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_12">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_6">
+ <item>
+ <widget class="QLineEdit" name="mceditPathEdit"/>
+ </item>
+ <item>
+ <widget class="QPushButton" name="mceditPathBtn">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QPushButton" name="mceditCheckBtn">
+ <property name="text">
+ <string>Check</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="mceditLink">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;http://www.mcedit.net/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;http://www.mcedit.net/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="editorsBox">
+ <property name="title">
+ <string>External Editors (leave empty for system default)</string>
+ </property>
+ <layout class="QGridLayout" name="foldersBoxLayout_2">
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="jsonEditorTextBox"/>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="labelJsonEditor">
+ <property name="text">
+ <string>Text Editor:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QToolButton" name="jsonEditorBrowseBtn">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>216</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/application/pages/global/JavaPage.cpp b/application/pages/global/JavaPage.cpp
new file mode 100644
index 00000000..ab02b3a3
--- /dev/null
+++ b/application/pages/global/JavaPage.cpp
@@ -0,0 +1,146 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "JavaPage.h"
+#include "ui_JavaPage.h"
+
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QDir>
+
+#include <pathutils.h>
+
+#include "NagUtils.h"
+
+#include "Platform.h"
+#include "dialogs/VersionSelectDialog.h"
+#include <ColumnResizer.h>
+
+#include "java/JavaUtils.h"
+#include "java/JavaVersionList.h"
+#include "java/JavaChecker.h"
+
+#include "settings/SettingsObject.h"
+#include "MultiMC.h"
+
+JavaPage::JavaPage(QWidget *parent) : QWidget(parent), ui(new Ui::JavaPage)
+{
+ ui->setupUi(this);
+ ui->tabWidget->tabBar()->hide();
+
+ auto resizer = new ColumnResizer(this);
+ resizer->addWidgetsFromLayout(ui->javaSettingsGroupBox->layout(), 0);
+ resizer->addWidgetsFromLayout(ui->customCommandsGroupBox->layout(), 0);
+
+ loadSettings();
+}
+
+JavaPage::~JavaPage()
+{
+ delete ui;
+}
+
+bool JavaPage::apply()
+{
+ applySettings();
+ return true;
+}
+
+void JavaPage::applySettings()
+{
+ auto s = MMC->settings();
+ // Memory
+ s->set("MinMemAlloc", ui->minMemSpinBox->value());
+ s->set("MaxMemAlloc", ui->maxMemSpinBox->value());
+ s->set("PermGen", ui->permGenSpinBox->value());
+
+ // Java Settings
+ s->set("JavaPath", ui->javaPathTextBox->text());
+ s->set("JvmArgs", ui->jvmArgsTextBox->text());
+ NagUtils::checkJVMArgs(s->get("JvmArgs").toString(), this->parentWidget());
+
+ // Custom Commands
+ s->set("PreLaunchCommand", ui->preLaunchCmdTextBox->text());
+ s->set("PostExitCommand", ui->postExitCmdTextBox->text());
+}
+void JavaPage::loadSettings()
+{
+ auto s = MMC->settings();
+ // Memory
+ ui->minMemSpinBox->setValue(s->get("MinMemAlloc").toInt());
+ ui->maxMemSpinBox->setValue(s->get("MaxMemAlloc").toInt());
+ ui->permGenSpinBox->setValue(s->get("PermGen").toInt());
+
+ // Java Settings
+ ui->javaPathTextBox->setText(s->get("JavaPath").toString());
+ ui->jvmArgsTextBox->setText(s->get("JvmArgs").toString());
+
+ // Custom Commands
+ ui->preLaunchCmdTextBox->setText(s->get("PreLaunchCommand").toString());
+ ui->postExitCmdTextBox->setText(s->get("PostExitCommand").toString());
+}
+
+void JavaPage::on_javaDetectBtn_clicked()
+{
+ JavaVersionPtr java;
+
+ VersionSelectDialog vselect(MMC->javalist().get(), tr("Select a Java version"), this, true);
+ vselect.setResizeOn(2);
+ vselect.exec();
+
+ if (vselect.result() == QDialog::Accepted && vselect.selectedVersion())
+ {
+ java = std::dynamic_pointer_cast<JavaVersion>(vselect.selectedVersion());
+ ui->javaPathTextBox->setText(java->path);
+ }
+}
+void JavaPage::on_javaBrowseBtn_clicked()
+{
+ QString dir = QFileDialog::getOpenFileName(this, tr("Find Java executable"));
+ if (!dir.isNull())
+ {
+ ui->javaPathTextBox->setText(dir);
+ }
+}
+void JavaPage::on_javaTestBtn_clicked()
+{
+ checker.reset(new JavaChecker());
+ connect(checker.get(), SIGNAL(checkFinished(JavaCheckResult)), this,
+ SLOT(checkFinished(JavaCheckResult)));
+ checker->path = ui->javaPathTextBox->text();
+ checker->performCheck();
+}
+
+void JavaPage::checkFinished(JavaCheckResult result)
+{
+ if (result.valid)
+ {
+ QString text;
+ text += "Java test succeeded!\n";
+ if (result.is_64bit)
+ text += "Using 64bit java.\n";
+ text += "\n";
+ text += "Platform reported: " + result.realPlatform + "\n";
+ text += "Java version reported: " + result.javaVersion;
+ QMessageBox::information(this, tr("Java test success"), text);
+ }
+ else
+ {
+ QMessageBox::warning(
+ this, tr("Java test failure"),
+ tr("The specified java binary didn't work. You should use the auto-detect feature, "
+ "or set the path to the java executable."));
+ }
+}
diff --git a/application/pages/global/JavaPage.h b/application/pages/global/JavaPage.h
new file mode 100644
index 00000000..2af85280
--- /dev/null
+++ b/application/pages/global/JavaPage.h
@@ -0,0 +1,73 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include <QDialog>
+
+#include "java/JavaChecker.h"
+#include "pages/BasePage.h"
+#include <MultiMC.h>
+
+class SettingsObject;
+
+namespace Ui
+{
+class JavaPage;
+}
+
+class JavaPage : public QWidget, public BasePage
+{
+ Q_OBJECT
+
+public:
+ explicit JavaPage(QWidget *parent = 0);
+ ~JavaPage();
+
+ QString displayName() const override
+ {
+ return tr("Java");
+ }
+ QIcon icon() const override
+ {
+ return MMC->getThemedIcon("java");
+ }
+ QString id() const override
+ {
+ return "java-settings";
+ }
+ QString helpPage() const override
+ {
+ return "Java-settings";
+ }
+ bool apply() override;
+
+private:
+ void applySettings();
+ void loadSettings();
+
+private
+slots:
+ void on_javaDetectBtn_clicked();
+ void on_javaTestBtn_clicked();
+ void on_javaBrowseBtn_clicked();
+
+ void checkFinished(JavaCheckResult result);
+
+private:
+ Ui::JavaPage *ui;
+ std::shared_ptr<JavaChecker> checker;
+};
diff --git a/application/pages/global/JavaPage.ui b/application/pages/global/JavaPage.ui
new file mode 100644
index 00000000..6ae41a49
--- /dev/null
+++ b/application/pages/global/JavaPage.ui
@@ -0,0 +1,303 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>JavaPage</class>
+ <widget class="QWidget" name="JavaPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>545</width>
+ <height>609</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Settings</string>
+ </property>
+ <property name="windowIcon">
+ <iconset>
+ <normaloff>:/icons/toolbar/settings</normaloff>:/icons/toolbar/settings</iconset>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>Tab 1</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QGroupBox" name="memoryGroupBox">
+ <property name="title">
+ <string>Memory</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="1" column="1">
+ <widget class="QSpinBox" name="maxMemSpinBox">
+ <property name="toolTip">
+ <string>The maximum amount of memory Minecraft is allowed to use.</string>
+ </property>
+ <property name="suffix">
+ <string> MB</string>
+ </property>
+ <property name="minimum">
+ <number>512</number>
+ </property>
+ <property name="maximum">
+ <number>65536</number>
+ </property>
+ <property name="singleStep">
+ <number>128</number>
+ </property>
+ <property name="value">
+ <number>1024</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="labelMinMem">
+ <property name="text">
+ <string>Minimum memory allocation:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="labelMaxMem">
+ <property name="text">
+ <string>Maximum memory allocation:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QSpinBox" name="minMemSpinBox">
+ <property name="toolTip">
+ <string>The amount of memory Minecraft is started with.</string>
+ </property>
+ <property name="suffix">
+ <string> MB</string>
+ </property>
+ <property name="minimum">
+ <number>256</number>
+ </property>
+ <property name="maximum">
+ <number>65536</number>
+ </property>
+ <property name="singleStep">
+ <number>128</number>
+ </property>
+ <property name="value">
+ <number>256</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="labelPermGen">
+ <property name="text">
+ <string>PermGen:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QSpinBox" name="permGenSpinBox">
+ <property name="toolTip">
+ <string>The amount of memory available to store loaded Java classes.</string>
+ </property>
+ <property name="suffix">
+ <string> MB</string>
+ </property>
+ <property name="minimum">
+ <number>64</number>
+ </property>
+ <property name="maximum">
+ <number>999999999</number>
+ </property>
+ <property name="singleStep">
+ <number>8</number>
+ </property>
+ <property name="value">
+ <number>64</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="javaSettingsGroupBox">
+ <property name="title">
+ <string>Java Runtime</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="0" column="0">
+ <widget class="QLabel" name="labelJavaPath">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Java path:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QPushButton" name="javaDetectBtn">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Auto-detect...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QPushButton" name="javaTestBtn">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Test</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="labelJVMArgs">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>JVM arguments:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="2">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLineEdit" name="javaPathTextBox"/>
+ </item>
+ <item>
+ <widget class="QPushButton" name="javaBrowseBtn">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>28</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="1" colspan="2">
+ <widget class="QLineEdit" name="jvmArgsTextBox"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="customCommandsGroupBox">
+ <property name="title">
+ <string>Custom Commands</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_4">
+ <item row="1" column="0">
+ <widget class="QLabel" name="labelPostExitCmd">
+ <property name="text">
+ <string>Post-exit command:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="labelPreLaunchCmd">
+ <property name="text">
+ <string>Pre-launch command:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="preLaunchCmdTextBox"/>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="postExitCmdTextBox"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelCustomCmdsDescription">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Pre-launch command runs before the instance launches and post-exit command runs after it exits. Both will be run in MultiMC's working directory with INST_ID, INST_DIR, and INST_NAME as environment variables.</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>minMemSpinBox</tabstop>
+ <tabstop>maxMemSpinBox</tabstop>
+ <tabstop>permGenSpinBox</tabstop>
+ <tabstop>javaPathTextBox</tabstop>
+ <tabstop>javaBrowseBtn</tabstop>
+ <tabstop>javaDetectBtn</tabstop>
+ <tabstop>javaTestBtn</tabstop>
+ <tabstop>jvmArgsTextBox</tabstop>
+ <tabstop>preLaunchCmdTextBox</tabstop>
+ <tabstop>postExitCmdTextBox</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/application/pages/global/MinecraftPage.cpp b/application/pages/global/MinecraftPage.cpp
new file mode 100644
index 00000000..f5e7e57f
--- /dev/null
+++ b/application/pages/global/MinecraftPage.cpp
@@ -0,0 +1,92 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "MinecraftPage.h"
+#include "ui_MinecraftPage.h"
+
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QDir>
+
+#include <pathutils.h>
+
+#include "Platform.h"
+#include "dialogs/VersionSelectDialog.h"
+#include "dialogs/CustomMessageBox.h"
+
+#include "NagUtils.h"
+
+#include "java/JavaUtils.h"
+#include "java/JavaVersionList.h"
+#include "java/JavaChecker.h"
+
+#include "updater/UpdateChecker.h"
+
+#include "tools/BaseProfiler.h"
+
+#include "settings/SettingsObject.h"
+#include "MultiMC.h"
+
+MinecraftPage::MinecraftPage(QWidget *parent) : QWidget(parent), ui(new Ui::MinecraftPage)
+{
+ ui->setupUi(this);
+ ui->tabWidget->tabBar()->hide();
+ loadSettings();
+ updateCheckboxStuff();
+}
+
+MinecraftPage::~MinecraftPage()
+{
+ delete ui;
+}
+
+bool MinecraftPage::apply()
+{
+ applySettings();
+ return true;
+}
+
+void MinecraftPage::updateCheckboxStuff()
+{
+ ui->windowWidthSpinBox->setEnabled(!ui->maximizedCheckBox->isChecked());
+ ui->windowHeightSpinBox->setEnabled(!ui->maximizedCheckBox->isChecked());
+}
+
+void MinecraftPage::on_maximizedCheckBox_clicked(bool checked)
+{
+ Q_UNUSED(checked);
+ updateCheckboxStuff();
+}
+
+
+void MinecraftPage::applySettings()
+{
+ auto s = MMC->settings();
+
+ // Window Size
+ s->set("LaunchMaximized", ui->maximizedCheckBox->isChecked());
+ s->set("MinecraftWinWidth", ui->windowWidthSpinBox->value());
+ s->set("MinecraftWinHeight", ui->windowHeightSpinBox->value());
+}
+
+void MinecraftPage::loadSettings()
+{
+ auto s = MMC->settings();
+
+ // Window Size
+ ui->maximizedCheckBox->setChecked(s->get("LaunchMaximized").toBool());
+ ui->windowWidthSpinBox->setValue(s->get("MinecraftWinWidth").toInt());
+ ui->windowHeightSpinBox->setValue(s->get("MinecraftWinHeight").toInt());
+}
diff --git a/application/pages/global/MinecraftPage.h b/application/pages/global/MinecraftPage.h
new file mode 100644
index 00000000..6355b507
--- /dev/null
+++ b/application/pages/global/MinecraftPage.h
@@ -0,0 +1,70 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include <QDialog>
+
+#include "java/JavaChecker.h"
+#include "pages/BasePage.h"
+#include <MultiMC.h>
+
+class SettingsObject;
+
+namespace Ui
+{
+class MinecraftPage;
+}
+
+class MinecraftPage : public QWidget, public BasePage
+{
+ Q_OBJECT
+
+public:
+ explicit MinecraftPage(QWidget *parent = 0);
+ ~MinecraftPage();
+
+ QString displayName() const override
+ {
+ return tr("Minecraft");
+ }
+ QIcon icon() const override
+ {
+ return MMC->getThemedIcon("minecraft");
+ }
+ QString id() const override
+ {
+ return "minecraft-settings";
+ }
+ QString helpPage() const override
+ {
+ return "Minecraft-settings";
+ }
+ bool apply() override;
+
+private:
+ void updateCheckboxStuff();
+ void applySettings();
+ void loadSettings();
+
+private
+slots:
+ void on_maximizedCheckBox_clicked(bool checked);
+
+private:
+ Ui::MinecraftPage *ui;
+
+};
diff --git a/application/pages/global/MinecraftPage.ui b/application/pages/global/MinecraftPage.ui
new file mode 100644
index 00000000..825f6a56
--- /dev/null
+++ b/application/pages/global/MinecraftPage.ui
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MinecraftPage</class>
+ <widget class="QWidget" name="MinecraftPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>545</width>
+ <height>195</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Settings</string>
+ </property>
+ <property name="windowIcon">
+ <iconset>
+ <normaloff>:/icons/toolbar/settings</normaloff>:/icons/toolbar/settings</iconset>
+ </property>
+ <layout class="QVBoxLayout" name="mainLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="tabShape">
+ <enum>QTabWidget::Rounded</enum>
+ </property>
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="minecraftTab">
+ <attribute name="title">
+ <string>Minecraft</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QGroupBox" name="windowSizeGroupBox">
+ <property name="title">
+ <string>Window Size</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <item>
+ <widget class="QCheckBox" name="maximizedCheckBox">
+ <property name="text">
+ <string>Start Minecraft maximized?</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayoutWindowSize">
+ <item row="1" column="0">
+ <widget class="QLabel" name="labelWindowHeight">
+ <property name="text">
+ <string>Window hei&amp;ght:</string>
+ </property>
+ <property name="buddy">
+ <cstring>windowHeightSpinBox</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="labelWindowWidth">
+ <property name="text">
+ <string>W&amp;indow width:</string>
+ </property>
+ <property name="buddy">
+ <cstring>windowWidthSpinBox</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QSpinBox" name="windowWidthSpinBox">
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>65536</number>
+ </property>
+ <property name="singleStep">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>854</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QSpinBox" name="windowHeightSpinBox">
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>65536</number>
+ </property>
+ <property name="value">
+ <number>480</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacerMinecraft">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>tabWidget</tabstop>
+ <tabstop>maximizedCheckBox</tabstop>
+ <tabstop>windowWidthSpinBox</tabstop>
+ <tabstop>windowHeightSpinBox</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/application/pages/global/MultiMCPage.cpp b/application/pages/global/MultiMCPage.cpp
new file mode 100644
index 00000000..5f56fb89
--- /dev/null
+++ b/application/pages/global/MultiMCPage.cpp
@@ -0,0 +1,459 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "MultiMCPage.h"
+#include "ui_MultiMCPage.h"
+
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QDir>
+#include <QTextCharFormat>
+
+#include <pathutils.h>
+
+#include "Platform.h"
+#include "dialogs/VersionSelectDialog.h"
+#include "dialogs/CustomMessageBox.h"
+#include <ColumnResizer.h>
+
+#include "NagUtils.h"
+
+#include "java/JavaUtils.h"
+#include "java/JavaVersionList.h"
+#include "java/JavaChecker.h"
+
+#include "updater/UpdateChecker.h"
+
+#include "tools/BaseProfiler.h"
+
+#include "settings/SettingsObject.h"
+#include "MultiMC.h"
+
+// FIXME: possibly move elsewhere
+enum InstSortMode
+{
+ // Sort alphabetically by name.
+ Sort_Name,
+ // Sort by which instance was launched most recently.
+ Sort_LastLaunch
+};
+
+MultiMCPage::MultiMCPage(QWidget *parent) : QWidget(parent), ui(new Ui::MultiMCPage)
+{
+ ui->setupUi(this);
+ ui->sortingModeGroup->setId(ui->sortByNameBtn, Sort_Name);
+ ui->sortingModeGroup->setId(ui->sortLastLaunchedBtn, Sort_LastLaunch);
+
+ auto resizer = new ColumnResizer(this);
+ resizer->addWidgetsFromLayout(ui->groupBox->layout(), 1);
+ resizer->addWidgetsFromLayout(ui->foldersBox->layout(), 1);
+
+ defaultFormat = new QTextCharFormat(ui->fontPreview->currentCharFormat());
+
+ loadSettings();
+
+ QObject::connect(MMC->updateChecker().get(), &UpdateChecker::channelListLoaded, this,
+ &MultiMCPage::refreshUpdateChannelList);
+
+ if (MMC->updateChecker()->hasChannels())
+ {
+ refreshUpdateChannelList();
+ }
+ else
+ {
+ MMC->updateChecker()->updateChanList(false);
+ }
+ connect(ui->fontSizeBox, SIGNAL(valueChanged(int)), SLOT(refreshFontPreview()));
+ connect(ui->consoleFont, SIGNAL(currentFontChanged(QFont)), SLOT(refreshFontPreview()));
+}
+
+MultiMCPage::~MultiMCPage()
+{
+ delete ui;
+}
+
+bool MultiMCPage::apply()
+{
+ applySettings();
+ return true;
+}
+
+void MultiMCPage::on_ftbLauncherBrowseBtn_clicked()
+{
+ QString raw_dir = QFileDialog::getExistingDirectory(this, tr("FTB Launcher Directory"),
+ ui->ftbLauncherBox->text());
+ QString cooked_dir = NormalizePath(raw_dir);
+
+ // do not allow current dir - it's dirty. Do not allow dirs that don't exist
+ if (!cooked_dir.isEmpty() && QDir(cooked_dir).exists())
+ {
+ ui->ftbLauncherBox->setText(cooked_dir);
+ }
+}
+void MultiMCPage::on_ftbBrowseBtn_clicked()
+{
+ QString raw_dir =
+ QFileDialog::getExistingDirectory(this, tr("FTB Directory"), ui->ftbBox->text());
+ QString cooked_dir = NormalizePath(raw_dir);
+
+ // do not allow current dir - it's dirty. Do not allow dirs that don't exist
+ if (!cooked_dir.isEmpty() && QDir(cooked_dir).exists())
+ {
+ ui->ftbBox->setText(cooked_dir);
+ }
+}
+
+void MultiMCPage::on_instDirBrowseBtn_clicked()
+{
+ QString raw_dir = QFileDialog::getExistingDirectory(this, tr("Instance Directory"),
+ ui->instDirTextBox->text());
+ QString cooked_dir = NormalizePath(raw_dir);
+
+ // do not allow current dir - it's dirty. Do not allow dirs that don't exist
+ if (!cooked_dir.isEmpty() && QDir(cooked_dir).exists())
+ {
+ if (checkProblemticPathJava(QDir(cooked_dir)))
+ {
+ QMessageBox warning;
+ warning.setText(tr("You're trying to specify an instance folder which\'s path "
+ "contains at least one \'!\'. "
+ "Java is known to cause problems if that is the case, your "
+ "instances (probably) won't start!"));
+ warning.setInformativeText(
+ tr("Do you really want to use this path? "
+ "Selecting \"No\" will close this and not alter your instance path."));
+ warning.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
+ int result = warning.exec();
+ if (result == QMessageBox::Yes)
+ {
+ ui->instDirTextBox->setText(cooked_dir);
+ }
+ }
+ else
+ {
+ ui->instDirTextBox->setText(cooked_dir);
+ }
+ }
+}
+
+void MultiMCPage::on_iconsDirBrowseBtn_clicked()
+{
+ QString raw_dir = QFileDialog::getExistingDirectory(this, tr("Icons Directory"),
+ ui->iconsDirTextBox->text());
+ QString cooked_dir = NormalizePath(raw_dir);
+
+ // do not allow current dir - it's dirty. Do not allow dirs that don't exist
+ if (!cooked_dir.isEmpty() && QDir(cooked_dir).exists())
+ {
+ ui->iconsDirTextBox->setText(cooked_dir);
+ }
+}
+void MultiMCPage::on_modsDirBrowseBtn_clicked()
+{
+ QString raw_dir = QFileDialog::getExistingDirectory(this, tr("Mods Directory"),
+ ui->modsDirTextBox->text());
+ QString cooked_dir = NormalizePath(raw_dir);
+
+ // do not allow current dir - it's dirty. Do not allow dirs that don't exist
+ if (!cooked_dir.isEmpty() && QDir(cooked_dir).exists())
+ {
+ ui->modsDirTextBox->setText(cooked_dir);
+ }
+}
+void MultiMCPage::on_lwjglDirBrowseBtn_clicked()
+{
+ QString raw_dir = QFileDialog::getExistingDirectory(this, tr("LWJGL Directory"),
+ ui->lwjglDirTextBox->text());
+ QString cooked_dir = NormalizePath(raw_dir);
+
+ // do not allow current dir - it's dirty. Do not allow dirs that don't exist
+ if (!cooked_dir.isEmpty() && QDir(cooked_dir).exists())
+ {
+ ui->lwjglDirTextBox->setText(cooked_dir);
+ }
+}
+
+void MultiMCPage::refreshUpdateChannelList()
+{
+ // Stop listening for selection changes. It's going to change a lot while we update it and
+ // we don't need to update the
+ // description label constantly.
+ QObject::disconnect(ui->updateChannelComboBox, SIGNAL(currentIndexChanged(int)), this,
+ SLOT(updateChannelSelectionChanged(int)));
+
+ QList<UpdateChecker::ChannelListEntry> channelList = MMC->updateChecker()->getChannelList();
+ ui->updateChannelComboBox->clear();
+ int selection = -1;
+ for (int i = 0; i < channelList.count(); i++)
+ {
+ UpdateChecker::ChannelListEntry entry = channelList.at(i);
+
+ // When it comes to selection, we'll rely on the indexes of a channel entry being the
+ // same in the
+ // combo box as it is in the update checker's channel list.
+ // This probably isn't very safe, but the channel list doesn't change often enough (or
+ // at all) for
+ // this to be a big deal. Hope it doesn't break...
+ ui->updateChannelComboBox->addItem(entry.name);
+
+ // If the update channel we just added was the selected one, set the current index in
+ // the combo box to it.
+ if (entry.id == m_currentUpdateChannel)
+ {
+ qDebug() << "Selected index" << i << "channel id" << m_currentUpdateChannel;
+ selection = i;
+ }
+ }
+
+ ui->updateChannelComboBox->setCurrentIndex(selection);
+
+ // Start listening for selection changes again and update the description label.
+ QObject::connect(ui->updateChannelComboBox, SIGNAL(currentIndexChanged(int)), this,
+ SLOT(updateChannelSelectionChanged(int)));
+ refreshUpdateChannelDesc();
+
+ // Now that we've updated the channel list, we can enable the combo box.
+ // It starts off disabled so that if the channel list hasn't been loaded, it will be
+ // disabled.
+ ui->updateChannelComboBox->setEnabled(true);
+}
+
+void MultiMCPage::updateChannelSelectionChanged(int index)
+{
+ refreshUpdateChannelDesc();
+}
+
+void MultiMCPage::refreshUpdateChannelDesc()
+{
+ // Get the channel list.
+ QList<UpdateChecker::ChannelListEntry> channelList = MMC->updateChecker()->getChannelList();
+ int selectedIndex = ui->updateChannelComboBox->currentIndex();
+ if (selectedIndex < 0)
+ {
+ return;
+ }
+ if (selectedIndex < channelList.count())
+ {
+ // Find the channel list entry with the given index.
+ UpdateChecker::ChannelListEntry selected = channelList.at(selectedIndex);
+
+ // Set the description text.
+ ui->updateChannelDescLabel->setText(selected.description);
+
+ // Set the currently selected channel ID.
+ m_currentUpdateChannel = selected.id;
+ }
+}
+
+void MultiMCPage::applySettings()
+{
+ auto s = MMC->settings();
+ // Language
+ s->set("Language",
+ ui->languageBox->itemData(ui->languageBox->currentIndex()).toLocale().bcp47Name());
+
+ if (ui->resetNotificationsBtn->isChecked())
+ {
+ s->set("ShownNotifications", QString());
+ }
+
+ // Updates
+ s->set("AutoUpdate", ui->autoUpdateCheckBox->isChecked());
+ s->set("UpdateChannel", m_currentUpdateChannel);
+ auto original = s->get("IconTheme").toString();
+ //FIXME: make generic
+ switch (ui->themeComboBox->currentIndex())
+ {
+ case 1:
+ s->set("IconTheme", "pe_dark");
+ break;
+ case 2:
+ s->set("IconTheme", "pe_light");
+ break;
+ case 3:
+ s->set("IconTheme", "pe_blue");
+ break;
+ case 4:
+ s->set("IconTheme", "pe_colored");
+ break;
+ case 5:
+ s->set("IconTheme", "OSX");
+ break;
+ case 6:
+ s->set("IconTheme", "iOS");
+ break;
+ case 0:
+ default:
+ s->set("IconTheme", "multimc");
+ break;
+ }
+
+ if(original != s->get("IconTheme"))
+ {
+ MMC->setIconTheme(s->get("IconTheme").toString());
+ }
+
+ // Console settings
+ s->set("ShowConsole", ui->showConsoleCheck->isChecked());
+ s->set("AutoCloseConsole", ui->autoCloseConsoleCheck->isChecked());
+ QString consoleFontFamily = ui->consoleFont->currentFont().family();
+ s->set("ConsoleFont", consoleFontFamily);
+ s->set("ConsoleFontSize", ui->fontSizeBox->value());
+
+ // FTB
+ s->set("TrackFTBInstances", ui->trackFtbBox->isChecked());
+ s->set("FTBLauncherRoot", ui->ftbLauncherBox->text());
+ s->set("FTBRoot", ui->ftbBox->text());
+
+ // Folders
+ // TODO: Offer to move instances to new instance folder.
+ s->set("InstanceDir", ui->instDirTextBox->text());
+ s->set("CentralModsDir", ui->modsDirTextBox->text());
+ s->set("LWJGLDir", ui->lwjglDirTextBox->text());
+ s->set("IconsDir", ui->iconsDirTextBox->text());
+
+ auto sortMode = (InstSortMode)ui->sortingModeGroup->checkedId();
+ switch (sortMode)
+ {
+ case Sort_LastLaunch:
+ s->set("InstSortMode", "LastLaunch");
+ break;
+ case Sort_Name:
+ default:
+ s->set("InstSortMode", "Name");
+ break;
+ }
+}
+void MultiMCPage::loadSettings()
+{
+ auto s = MMC->settings();
+ // Language
+ ui->languageBox->clear();
+ ui->languageBox->addItem(tr("English"), QLocale(QLocale::English));
+ foreach(const QString & lang, QDir(MMC->staticData() + "/translations")
+ .entryList(QStringList() << "*.qm", QDir::Files))
+ {
+ QLocale locale(lang.section(QRegExp("[_\\.]"), 1));
+ ui->languageBox->addItem(QLocale::languageToString(locale.language()), locale);
+ }
+ ui->languageBox->setCurrentIndex(
+ ui->languageBox->findData(QLocale(s->get("Language").toString())));
+
+ // Updates
+ ui->autoUpdateCheckBox->setChecked(s->get("AutoUpdate").toBool());
+ m_currentUpdateChannel = s->get("UpdateChannel").toString();
+ //FIXME: make generic
+ auto theme = s->get("IconTheme").toString();
+ if (theme == "pe_dark")
+ {
+ ui->themeComboBox->setCurrentIndex(1);
+ }
+ else if (theme == "pe_light")
+ {
+ ui->themeComboBox->setCurrentIndex(2);
+ }
+ else if (theme == "pe_blue")
+ {
+ ui->themeComboBox->setCurrentIndex(3);
+ }
+ else if (theme == "pe_colored")
+ {
+ ui->themeComboBox->setCurrentIndex(4);
+ }
+ else if (theme == "OSX")
+ {
+ ui->themeComboBox->setCurrentIndex(5);
+ }
+ else if (theme == "iOS")
+ {
+ ui->themeComboBox->setCurrentIndex(6);
+ }
+ else
+ {
+ ui->themeComboBox->setCurrentIndex(0);
+ }
+
+ // Console settings
+ ui->showConsoleCheck->setChecked(s->get("ShowConsole").toBool());
+ ui->autoCloseConsoleCheck->setChecked(s->get("AutoCloseConsole").toBool());
+ QString fontFamily = MMC->settings()->get("ConsoleFont").toString();
+ QFont consoleFont(fontFamily);
+ ui->consoleFont->setCurrentFont(consoleFont);
+
+ bool conversionOk = true;
+ int fontSize = MMC->settings()->get("ConsoleFontSize").toInt(&conversionOk);
+ if(!conversionOk)
+ {
+ fontSize = 11;
+ }
+ ui->fontSizeBox->setValue(fontSize);
+ refreshFontPreview();
+
+ // FTB
+ ui->trackFtbBox->setChecked(s->get("TrackFTBInstances").toBool());
+ ui->ftbLauncherBox->setText(s->get("FTBLauncherRoot").toString());
+ ui->ftbBox->setText(s->get("FTBRoot").toString());
+
+ // Folders
+ ui->instDirTextBox->setText(s->get("InstanceDir").toString());
+ ui->modsDirTextBox->setText(s->get("CentralModsDir").toString());
+ ui->lwjglDirTextBox->setText(s->get("LWJGLDir").toString());
+ ui->iconsDirTextBox->setText(s->get("IconsDir").toString());
+
+ QString sortMode = s->get("InstSortMode").toString();
+
+ if (sortMode == "LastLaunch")
+ {
+ ui->sortLastLaunchedBtn->setChecked(true);
+ }
+ else
+ {
+ ui->sortByNameBtn->setChecked(true);
+ }
+}
+
+void MultiMCPage::refreshFontPreview()
+{
+ int fontSize = ui->fontSizeBox->value();
+ QString fontFamily = ui->consoleFont->currentFont().family();
+ ui->fontPreview->clear();
+ defaultFormat->setFont(QFont(fontFamily, fontSize));
+ {
+ QTextCharFormat format(*defaultFormat);
+ format.setForeground(QColor("red"));
+ // append a paragraph/line
+ auto workCursor = ui->fontPreview->textCursor();
+ workCursor.movePosition(QTextCursor::End);
+ workCursor.insertText(tr("[Something/ERROR] A spooky error!"), format);
+ workCursor.insertBlock();
+ }
+ {
+ QTextCharFormat format(*defaultFormat);
+ // append a paragraph/line
+ auto workCursor = ui->fontPreview->textCursor();
+ workCursor.movePosition(QTextCursor::End);
+ workCursor.insertText(tr("[Test/INFO] A harmless message..."), format);
+ workCursor.insertBlock();
+ }
+ {
+ QTextCharFormat format(*defaultFormat);
+ format.setForeground(QColor("orange"));
+ // append a paragraph/line
+ auto workCursor = ui->fontPreview->textCursor();
+ workCursor.movePosition(QTextCursor::End);
+ workCursor.insertText(tr("[Something/WARN] A not so spooky warning."), format);
+ workCursor.insertBlock();
+ }
+} \ No newline at end of file
diff --git a/application/pages/global/MultiMCPage.h b/application/pages/global/MultiMCPage.h
new file mode 100644
index 00000000..d90acc13
--- /dev/null
+++ b/application/pages/global/MultiMCPage.h
@@ -0,0 +1,100 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include <QDialog>
+
+#include "java/JavaChecker.h"
+#include "pages/BasePage.h"
+#include <MultiMC.h>
+
+class QTextCharFormat;
+class SettingsObject;
+
+namespace Ui
+{
+class MultiMCPage;
+}
+
+class MultiMCPage : public QWidget, public BasePage
+{
+ Q_OBJECT
+
+public:
+ explicit MultiMCPage(QWidget *parent = 0);
+ ~MultiMCPage();
+
+ QString displayName() const override
+ {
+ return tr("MultiMC");
+ }
+ QIcon icon() const override
+ {
+ return MMC->getThemedIcon("multimc");
+ }
+ QString id() const override
+ {
+ return "multimc-settings";
+ }
+ QString helpPage() const override
+ {
+ return "MultiMC-settings";
+ }
+ bool apply() override;
+
+private:
+ void applySettings();
+ void loadSettings();
+
+private
+slots:
+ void on_ftbLauncherBrowseBtn_clicked();
+ void on_ftbBrowseBtn_clicked();
+
+ void on_instDirBrowseBtn_clicked();
+ void on_modsDirBrowseBtn_clicked();
+ void on_lwjglDirBrowseBtn_clicked();
+ void on_iconsDirBrowseBtn_clicked();
+
+ /*!
+ * Updates the list of update channels in the combo box.
+ */
+ void refreshUpdateChannelList();
+
+ /*!
+ * Updates the channel description label.
+ */
+ void refreshUpdateChannelDesc();
+
+ /*!
+ * Updates the font preview
+ */
+ void refreshFontPreview();
+
+ void updateChannelSelectionChanged(int index);
+
+private:
+ Ui::MultiMCPage *ui;
+
+ /*!
+ * Stores the currently selected update channel.
+ */
+ QString m_currentUpdateChannel;
+
+ // default format for the font preview...
+ QTextCharFormat *defaultFormat;
+};
diff --git a/application/pages/global/MultiMCPage.ui b/application/pages/global/MultiMCPage.ui
new file mode 100644
index 00000000..38d1bb1d
--- /dev/null
+++ b/application/pages/global/MultiMCPage.ui
@@ -0,0 +1,532 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MultiMCPage</class>
+ <widget class="QWidget" name="MultiMCPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>487</width>
+ <height>519</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Settings</string>
+ </property>
+ <property name="windowIcon">
+ <iconset>
+ <normaloff>:/icons/toolbar/settings</normaloff>:/icons/toolbar/settings</iconset>
+ </property>
+ <layout class="QVBoxLayout" name="mainLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="tabShape">
+ <enum>QTabWidget::Rounded</enum>
+ </property>
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="featuresTab">
+ <attribute name="title">
+ <string>Features</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_9">
+ <item>
+ <widget class="QGroupBox" name="updateSettingsBox">
+ <property name="title">
+ <string>Update Settings</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_7">
+ <item>
+ <widget class="QCheckBox" name="autoUpdateCheckBox">
+ <property name="text">
+ <string>Check for updates when MultiMC starts?</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="updateChannelLabel">
+ <property name="text">
+ <string>Up&amp;date Channel:</string>
+ </property>
+ <property name="buddy">
+ <cstring>updateChannelComboBox</cstring>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="updateChannelComboBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="updateChannelDescLabel">
+ <property name="text">
+ <string>No channel selected.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>FTB</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="2" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>&amp;Launcher:</string>
+ </property>
+ <property name="buddy">
+ <cstring>ftbLauncherBox</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLineEdit" name="ftbLauncherBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLineEdit" name="ftbBox"/>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Files:</string>
+ </property>
+ <property name="buddy">
+ <cstring>ftbBox</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QToolButton" name="ftbBrowseBtn">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QToolButton" name="ftbLauncherBrowseBtn">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::TabFocus</enum>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="3">
+ <widget class="QCheckBox" name="trackFtbBox">
+ <property name="text">
+ <string>Track FTB instances</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="foldersBox">
+ <property name="title">
+ <string>Folders</string>
+ </property>
+ <layout class="QGridLayout" name="foldersBoxLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="labelInstDir">
+ <property name="text">
+ <string>I&amp;nstances:</string>
+ </property>
+ <property name="buddy">
+ <cstring>instDirTextBox</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="instDirTextBox"/>
+ </item>
+ <item row="0" column="2">
+ <widget class="QToolButton" name="instDirBrowseBtn">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="labelModsDir">
+ <property name="text">
+ <string>&amp;Mods:</string>
+ </property>
+ <property name="buddy">
+ <cstring>modsDirTextBox</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="modsDirTextBox"/>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLineEdit" name="lwjglDirTextBox"/>
+ </item>
+ <item row="1" column="2">
+ <widget class="QToolButton" name="modsDirBrowseBtn">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="labelLWJGLDir">
+ <property name="text">
+ <string>LW&amp;JGL:</string>
+ </property>
+ <property name="buddy">
+ <cstring>lwjglDirTextBox</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QToolButton" name="lwjglDirBrowseBtn">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLineEdit" name="iconsDirTextBox"/>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="labelIconsDir">
+ <property name="text">
+ <string>&amp;Icons:</string>
+ </property>
+ <property name="buddy">
+ <cstring>iconsDirTextBox</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QToolButton" name="iconsDirBrowseBtn">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="generalTab">
+ <attribute name="title">
+ <string>User Interface</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_6">
+ <item>
+ <widget class="QGroupBox" name="groupBox_3">
+ <property name="title">
+ <string>MultiMC notifications</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <item>
+ <widget class="QPushButton" name="resetNotificationsBtn">
+ <property name="text">
+ <string>Reset hidden notifications</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="sortingModeBox">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Instance view sorting mode</string>
+ </property>
+ <layout class="QHBoxLayout" name="sortingModeBoxLayout">
+ <item>
+ <widget class="QRadioButton" name="sortLastLaunchedBtn">
+ <property name="text">
+ <string>By &amp;last launched</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">sortingModeGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="sortByNameBtn">
+ <property name="text">
+ <string>By &amp;name</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">sortingModeGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string>Language (needs restart):</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QComboBox" name="languageBox"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="themeBox">
+ <property name="title">
+ <string>Icon Theme (needs restart, work in progress)</string>
+ </property>
+ <layout class="QHBoxLayout" name="themeBoxLayout">
+ <item>
+ <widget class="QComboBox" name="themeComboBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <item>
+ <property name="text">
+ <string>Default</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Simple (Dark Icons)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Simple (Light Icons)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Simple (Blue Icons)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Simple (Colored Icons)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>OSX</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>iOS</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="generalTabSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>Console</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QGroupBox" name="consoleSettingsBox">
+ <property name="title">
+ <string>Console Settings</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QCheckBox" name="showConsoleCheck">
+ <property name="text">
+ <string>Show console while the game is running?</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="autoCloseConsoleCheck">
+ <property name="text">
+ <string>Automatically close console when the game quits?</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="themeBox_2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Console font</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="1" column="0" colspan="2">
+ <widget class="QTextEdit" name="fontPreview">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="horizontalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOff</enum>
+ </property>
+ <property name="undoRedoEnabled">
+ <bool>false</bool>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QFontComboBox" name="consoleFont">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QSpinBox" name="fontSizeBox">
+ <property name="minimum">
+ <number>5</number>
+ </property>
+ <property name="maximum">
+ <number>16</number>
+ </property>
+ <property name="value">
+ <number>11</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>tabWidget</tabstop>
+ <tabstop>autoUpdateCheckBox</tabstop>
+ <tabstop>updateChannelComboBox</tabstop>
+ <tabstop>trackFtbBox</tabstop>
+ <tabstop>ftbLauncherBox</tabstop>
+ <tabstop>ftbLauncherBrowseBtn</tabstop>
+ <tabstop>ftbBox</tabstop>
+ <tabstop>ftbBrowseBtn</tabstop>
+ <tabstop>instDirTextBox</tabstop>
+ <tabstop>instDirBrowseBtn</tabstop>
+ <tabstop>modsDirTextBox</tabstop>
+ <tabstop>modsDirBrowseBtn</tabstop>
+ <tabstop>lwjglDirTextBox</tabstop>
+ <tabstop>lwjglDirBrowseBtn</tabstop>
+ <tabstop>iconsDirTextBox</tabstop>
+ <tabstop>iconsDirBrowseBtn</tabstop>
+ <tabstop>resetNotificationsBtn</tabstop>
+ <tabstop>sortLastLaunchedBtn</tabstop>
+ <tabstop>sortByNameBtn</tabstop>
+ <tabstop>languageBox</tabstop>
+ <tabstop>themeComboBox</tabstop>
+ <tabstop>showConsoleCheck</tabstop>
+ <tabstop>autoCloseConsoleCheck</tabstop>
+ <tabstop>consoleFont</tabstop>
+ <tabstop>fontSizeBox</tabstop>
+ <tabstop>fontPreview</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+ <buttongroups>
+ <buttongroup name="sortingModeGroup"/>
+ </buttongroups>
+</ui>
diff --git a/application/pages/global/ProxyPage.cpp b/application/pages/global/ProxyPage.cpp
new file mode 100644
index 00000000..f18f7049
--- /dev/null
+++ b/application/pages/global/ProxyPage.cpp
@@ -0,0 +1,95 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ProxyPage.h"
+#include "ui_ProxyPage.h"
+
+#include "settings/SettingsObject.h"
+#include "MultiMC.h"
+
+ProxyPage::ProxyPage(QWidget *parent) : QWidget(parent), ui(new Ui::ProxyPage)
+{
+ ui->setupUi(this);
+ ui->tabWidget->tabBar()->hide();
+ loadSettings();
+ updateCheckboxStuff();
+
+ connect(ui->proxyGroup, SIGNAL(buttonClicked(int)), SLOT(proxyChanged(int)));
+}
+
+ProxyPage::~ProxyPage()
+{
+ delete ui;
+}
+
+bool ProxyPage::apply()
+{
+ applySettings();
+ return true;
+}
+
+void ProxyPage::updateCheckboxStuff()
+{
+ ui->proxyAddrBox->setEnabled(!ui->proxyNoneBtn->isChecked() &&
+ !ui->proxyDefaultBtn->isChecked());
+ ui->proxyAuthBox->setEnabled(!ui->proxyNoneBtn->isChecked() &&
+ !ui->proxyDefaultBtn->isChecked());
+}
+
+void ProxyPage::proxyChanged(int)
+{
+ updateCheckboxStuff();
+}
+
+void ProxyPage::applySettings()
+{
+ auto s = MMC->settings();
+
+ // Proxy
+ QString proxyType = "None";
+ if (ui->proxyDefaultBtn->isChecked())
+ proxyType = "Default";
+ else if (ui->proxyNoneBtn->isChecked())
+ proxyType = "None";
+ else if (ui->proxySOCKS5Btn->isChecked())
+ proxyType = "SOCKS5";
+ else if (ui->proxyHTTPBtn->isChecked())
+ proxyType = "HTTP";
+
+ s->set("ProxyType", proxyType);
+ s->set("ProxyAddr", ui->proxyAddrEdit->text());
+ s->set("ProxyPort", ui->proxyPortEdit->value());
+ s->set("ProxyUser", ui->proxyUserEdit->text());
+ s->set("ProxyPass", ui->proxyPassEdit->text());
+}
+void ProxyPage::loadSettings()
+{
+ auto s = MMC->settings();
+ // Proxy
+ QString proxyType = s->get("ProxyType").toString();
+ if (proxyType == "Default")
+ ui->proxyDefaultBtn->setChecked(true);
+ else if (proxyType == "None")
+ ui->proxyNoneBtn->setChecked(true);
+ else if (proxyType == "SOCKS5")
+ ui->proxySOCKS5Btn->setChecked(true);
+ else if (proxyType == "HTTP")
+ ui->proxyHTTPBtn->setChecked(true);
+
+ ui->proxyAddrEdit->setText(s->get("ProxyAddr").toString());
+ ui->proxyPortEdit->setValue(s->get("ProxyPort").value<qint16>());
+ ui->proxyUserEdit->setText(s->get("ProxyUser").toString());
+ ui->proxyPassEdit->setText(s->get("ProxyPass").toString());
+}
diff --git a/application/pages/global/ProxyPage.h b/application/pages/global/ProxyPage.h
new file mode 100644
index 00000000..362e67a0
--- /dev/null
+++ b/application/pages/global/ProxyPage.h
@@ -0,0 +1,66 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include <QDialog>
+
+#include "pages/BasePage.h"
+#include <MultiMC.h>
+
+namespace Ui
+{
+class ProxyPage;
+}
+
+class ProxyPage : public QWidget, public BasePage
+{
+ Q_OBJECT
+
+public:
+ explicit ProxyPage(QWidget *parent = 0);
+ ~ProxyPage();
+
+ QString displayName() const override
+ {
+ return tr("Proxy");
+ }
+ QIcon icon() const override
+ {
+ return MMC->getThemedIcon("proxy");
+ }
+ QString id() const override
+ {
+ return "proxy-settings";
+ }
+ QString helpPage() const override
+ {
+ return "Proxy-settings";
+ }
+ bool apply() override;
+
+private:
+ void updateCheckboxStuff();
+ void applySettings();
+ void loadSettings();
+
+private
+slots:
+ void proxyChanged(int);
+
+private:
+ Ui::ProxyPage *ui;
+};
diff --git a/application/pages/global/ProxyPage.ui b/application/pages/global/ProxyPage.ui
new file mode 100644
index 00000000..7cddd66d
--- /dev/null
+++ b/application/pages/global/ProxyPage.ui
@@ -0,0 +1,197 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ProxyPage</class>
+ <widget class="QWidget" name="ProxyPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>607</width>
+ <height>632</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Settings</string>
+ </property>
+ <property name="windowIcon">
+ <iconset>
+ <normaloff>:/icons/toolbar/settings</normaloff>:/icons/toolbar/settings</iconset>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <widget class="QWidget" name="tabWidgetPage1" native="true">
+ <attribute name="title">
+ <string/>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QGroupBox" name="proxyTypeBox">
+ <property name="title">
+ <string>Type</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QRadioButton" name="proxyDefaultBtn">
+ <property name="toolTip">
+ <string>Uses your system's default proxy settings.</string>
+ </property>
+ <property name="text">
+ <string>Default</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">proxyGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="proxyNoneBtn">
+ <property name="text">
+ <string>None</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">proxyGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="proxySOCKS5Btn">
+ <property name="text">
+ <string>SOCKS5</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">proxyGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="proxyHTTPBtn">
+ <property name="text">
+ <string>HTTP</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">proxyGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="proxyAddrBox">
+ <property name="title">
+ <string>Address and Port</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QLineEdit" name="proxyAddrEdit">
+ <property name="placeholderText">
+ <string>127.0.0.1</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="proxyPortEdit">
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="buttonSymbols">
+ <enum>QAbstractSpinBox::PlusMinus</enum>
+ </property>
+ <property name="maximum">
+ <number>65535</number>
+ </property>
+ <property name="value">
+ <number>8080</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="proxyAuthBox">
+ <property name="title">
+ <string>Authentication</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_5">
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="proxyUserEdit"/>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="proxyUsernameLabel">
+ <property name="text">
+ <string>Username:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="proxyPasswordLabel">
+ <property name="text">
+ <string>Password:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="proxyPassEdit">
+ <property name="echoMode">
+ <enum>QLineEdit::Password</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QLabel" name="proxyPlainTextWarningLabel">
+ <property name="text">
+ <string>Note: Proxy username and password are stored in plain text inside MultiMC's configuration file!</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+ <buttongroups>
+ <buttongroup name="proxyGroup"/>
+ </buttongroups>
+</ui>
diff --git a/application/resources/MultiMC.icns b/application/resources/MultiMC.icns
new file mode 100644
index 00000000..05ce9207
--- /dev/null
+++ b/application/resources/MultiMC.icns
Binary files differ
diff --git a/application/resources/MultiMC.ico b/application/resources/MultiMC.ico
new file mode 100644
index 00000000..734af0fb
--- /dev/null
+++ b/application/resources/MultiMC.ico
Binary files differ
diff --git a/application/resources/MultiMC.manifest b/application/resources/MultiMC.manifest
new file mode 100644
index 00000000..3acf8f7f
--- /dev/null
+++ b/application/resources/MultiMC.manifest
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
+ <assemblyIdentity name="MultiMC.Application.5" type="win32" version="5.0.0.0" />
+ <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+ <security>
+ <requestedPrivileges>
+ <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
+ </requestedPrivileges>
+ </security>
+ </trustInfo>
+ <dependency>
+ <dependentAssembly>
+ <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"/>
+ </dependentAssembly>
+ </dependency>
+ <description>Custom Minecraft launcher for managing multiple installs.</description>
+ <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+ <application>
+ <!--The ID below indicates app support for Windows Vista -->
+ <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
+ <!--The ID below indicates app support for Windows 7 -->
+ <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+ <!--The ID below indicates app support for Windows Developer Preview / Windows 8 -->
+ <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
+ </application>
+ </compatibility>
+</assembly> \ No newline at end of file
diff --git a/application/resources/OSX/OSX.qrc b/application/resources/OSX/OSX.qrc
new file mode 100644
index 00000000..20c71eb8
--- /dev/null
+++ b/application/resources/OSX/OSX.qrc
@@ -0,0 +1,35 @@
+<!DOCTYPE RCC>
+<RCC version="1.0">
+ <qresource prefix="/icons/OSX">
+ <file>index.theme</file>
+ <file>scalable/about.svg</file>
+ <file>scalable/accounts.svg</file>
+ <file>scalable/bug.svg</file>
+ <file>scalable/centralmods.svg</file>
+ <file>scalable/checkupdate.svg</file>
+ <file>scalable/copy.svg</file>
+ <file>scalable/coremods.svg</file>
+ <file>scalable/externaltools.svg</file>
+ <file>scalable/instance-settings.svg</file>
+ <file>scalable/jarmods.svg</file>
+ <file>scalable/java.svg</file>
+ <file>scalable/loadermods.svg</file>
+ <file>scalable/log.svg</file>
+ <file>scalable/minecraft.svg</file>
+ <file>scalable/multimc.svg</file>
+ <file>scalable/new.svg</file>
+ <file>scalable/news.svg</file>
+ <file>scalable/notes.svg</file>
+ <file>scalable/patreon.svg</file>
+ <file>scalable/proxy.svg</file>
+ <file>scalable/quickmods.svg</file>
+ <file>scalable/refresh.svg</file>
+ <file>scalable/resourcepacks.svg</file>
+ <file>scalable/screenshots.svg</file>
+ <file>scalable/settings.svg</file>
+ <file>scalable/status-bad.svg</file>
+ <file>scalable/status-good.svg</file>
+ <file>scalable/status-yellow.svg</file>
+ <file>scalable/viewfolder.svg</file>
+ </qresource>
+</RCC>
diff --git a/application/resources/OSX/index.theme b/application/resources/OSX/index.theme
new file mode 100644
index 00000000..7f90a32e
--- /dev/null
+++ b/application/resources/OSX/index.theme
@@ -0,0 +1,11 @@
+[Icon Theme]
+Name=OSX
+Comment=OSX theme by pexner
+Inherits=multimc
+Directories=scalable
+
+[scalable]
+Size=48
+Type=Scalable
+MinSize=16
+MaxSize=256
diff --git a/application/resources/OSX/scalable/about.svg b/application/resources/OSX/scalable/about.svg
new file mode 100644
index 00000000..eb87ccf1
--- /dev/null
+++ b/application/resources/OSX/scalable/about.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill-rule="evenodd" clip-rule="evenodd" fill="none" width="32" height="32"/>
+<path fill="#B6B5B6" d="M30,28H2c-1.1,0-2-0.9-2-2V8c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v18C32,27.1,31.1,28,30,28z"/>
+<path fill="#FBFBFB" d="M30,27H2c-1.1,0-2-0.9-2-2V8c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v17C32,26.1,31.1,27,30,27z"/>
+<g>
+ <polygon fill="#585858" points="17.2,20.2 17.2,15.2 14,15.2 14,16.5 15.2,16.5 15.2,20.2 14,20.2 14,21.5 18.5,21.5 18.5,20.2
+ "/>
+ <g id="_x38__12_">
+ <g>
+ <path fill="#585858" d="M16,9c-4.4,0-8,3.6-8,8c0,4.4,3.6,8,8,8s8-3.6,8-8C24,12.6,20.4,9,16,9z M16,24c-3.9,0-7-3.1-7-7
+ c0-3.9,3.1-7,7-7s7,3.1,7,7C23,20.9,19.9,24,16,24z"/>
+ </g>
+ </g>
+ <circle fill="#585858" cx="16.2" cy="13.2" r="1"/>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/accounts.svg b/application/resources/OSX/scalable/accounts.svg
new file mode 100644
index 00000000..163bcee0
--- /dev/null
+++ b/application/resources/OSX/scalable/accounts.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<rect fill="none" width="24" height="24"/>
+<g id="_x36__10_">
+ <g>
+ <path fill="#585858" d="M21,12.2c0.6-0.9,1-2,1-3.2c0-2.8-2-5-4.5-5S13,6.2,13,9c0,1.2,0.4,2.3,1,3.2c-1.2,0.4-2,1.5-2,2.8v2
+ c0,1.7,1.3,3,3,3h5c1.7,0,3-1.3,3-3v-2C23,13.7,22.2,12.6,21,12.2z"/>
+ </g>
+</g>
+<ellipse fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" cx="17.5" cy="9" rx="3.5" ry="4"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#CCCCCC" d="M22,15.2c0-1.1-0.8-1.9-1.9-2.2c-0.7,0.6-1.6,0.9-2.6,0.9
+ c-1,0-1.9-0.3-2.6-0.9c-1.1,0.2-1.9,1.1-1.9,2.2v1.5c0,1.2,1.1,2.2,2.5,2.2h4.1c1.4,0,2.5-1,2.5-2.2V15.2z"/>
+</svg>
diff --git a/application/resources/OSX/scalable/bug.svg b/application/resources/OSX/scalable/bug.svg
new file mode 100644
index 00000000..00565bb6
--- /dev/null
+++ b/application/resources/OSX/scalable/bug.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill-rule="evenodd" clip-rule="evenodd" fill="none" width="32" height="32"/>
+<path fill="#B6B5B6" d="M30,28H2c-1.1,0-2-0.9-2-2V8c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v18C32,27.1,31.1,28,30,28z"/>
+<path fill="#FBFBFB" d="M30,27H2c-1.1,0-2-0.9-2-2V8c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v17C32,26.1,31.1,27,30,27z"/>
+<path fill="#585858" d="M23.5,18.9c0.3,0,0.5-0.2,0.5-0.5c0-0.3-0.2-0.5-0.5-0.5H21c0-0.1,0-0.2,0-0.3c0-0.4,0-0.7,0-1
+ c0.7-0.1,1.2-0.4,1.6-0.9c1.3-1.5,0.9-4.4,0.9-4.5c0-0.3-0.3-0.4-0.5-0.4c-0.3,0-0.4,0.3-0.4,0.5c0,0,0.4,2.6-0.7,3.8
+ c-0.3,0.3-0.6,0.5-1.1,0.6c-0.1-0.2-0.2-0.3-0.3-0.5c-0.2-0.2-0.4-0.3-0.7-0.4c0.2-0.3,0.4-0.6,0.4-1.1c0-1.2-0.8-2.2-2.1-2.8l0,0
+ C17.9,9.8,17,9,16,9c-1,0-1.9,0.8-2,1.9l0,0v0c-1.3,0.6-2.1,1.6-2.1,2.8c0,0.5,0.1,0.8,0.4,1.1c-0.3,0.1-0.5,0.2-0.7,0.4
+ c-0.1,0.1-0.2,0.3-0.3,0.5c-0.4-0.1-0.8-0.2-1.1-0.6c-1-1.2-0.7-3.7-0.7-3.8c0-0.3-0.1-0.5-0.4-0.5c-0.3,0-0.5,0.1-0.5,0.4
+ c0,0.1-0.4,3,0.9,4.5c0.4,0.5,1,0.8,1.6,0.9c0,0.3,0,0.6,0,1c0,0.1,0,0.2,0,0.3H8.5c-0.3,0-0.5,0.2-0.5,0.5c0,0.3,0.2,0.5,0.5,0.5
+ h2.6c0,0.6,0.1,1.2,0.3,1.7c-0.8,0.1-1.5,0.4-2,1c-1.1,1.2-0.9,3-0.9,3c0,0.2,0.2,0.4,0.5,0.4c0,0,0,0,0,0c0.3,0,0.5-0.3,0.4-0.5
+ c0,0-0.1-1.4,0.7-2.3c0.4-0.4,0.9-0.6,1.6-0.7c0.9,1.8,2.5,3.1,4.3,3.1c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c1.9,0,3.5-1.2,4.3-3.1
+ c0.7,0,1.2,0.3,1.6,0.7c0.8,0.9,0.7,2.3,0.7,2.3c0,0.3,0.2,0.5,0.4,0.5c0,0,0,0,0,0c0.2,0,0.4-0.2,0.5-0.4c0-0.1,0.1-1.9-0.9-3
+ c-0.5-0.5-1.1-0.9-1.9-1c0.2-0.5,0.3-1.1,0.3-1.7H23.5z M16,9.9c0.4,0,0.8,0.2,1,0.6c-0.1,0-0.2,0-0.3,0c-0.1,0-0.1,0-0.2,0
+ c-0.2,0-0.4,0-0.5,0c-0.2,0-0.4,0-0.5,0c-0.1,0-0.1,0-0.2,0c-0.1,0-0.2,0-0.3,0C15.2,10.2,15.6,9.9,16,9.9z M12.8,13.7
+ c0-0.9,0.7-1.7,1.8-2.1c0.9-0.3,2-0.3,2.9,0c1.1,0.4,1.8,1.2,1.8,2.1c0,0.5-0.1,0.8-1.6,0.8c-0.5,0-1,0-1.6,0c0,0,0,0,0,0
+ c0,0,0,0,0,0c0,0,0,0,0,0c-0.6,0-1.1,0-1.6,0C13,14.5,12.8,14.2,12.8,13.7z M16.5,23.6v-5.1c0-0.3-0.2-0.5-0.5-0.5s-0.5,0.2-0.5,0.5
+ v5.1c-2-0.3-3.5-2.5-3.5-5.1c0-0.3,0-0.6,0-0.9c0-0.9,0-1.5,0.2-1.7c0.3-0.3,1.1-0.4,2.3-0.5c0.2,0,0.4,0,0.7,0c0.6,0,1.2,0,1.7,0
+ c0.3,0,0.5,0,0.8,0c1.2,0,1.9,0.2,2.2,0.5c0.3,0.3,0.2,0.8,0.2,1.7c0,0.2,0,0.5,0,0.8c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0.1
+ C20,21.1,18.5,23.3,16.5,23.6z"/>
+</svg>
diff --git a/application/resources/OSX/scalable/centralmods.svg b/application/resources/OSX/scalable/centralmods.svg
new file mode 100644
index 00000000..37b821e4
--- /dev/null
+++ b/application/resources/OSX/scalable/centralmods.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill-rule="evenodd" clip-rule="evenodd" fill="none" width="32" height="32"/>
+<path fill="#B6B5B6" d="M30,28H2c-1.1,0-2-0.9-2-2V8c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v18C32,27.1,31.1,28,30,28z"/>
+<path fill="#FBFBFB" d="M30,27H2c-1.1,0-2-0.9-2-2V8c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v17C32,26.1,31.1,27,30,27z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#585858" d="M22,25H10c-1.1,0-2-0.9-2-2V11c0-1.1,0.9-2,2-2h3c1.1,0,2,0.9,2,2
+ h7c1.1,0,2,0.9,2,2v10C24,24.1,23.1,25,22,25z M9,23c0,0.6,0.4,1,1,1h12c0.6,0,1-0.4,1-1V13c0-0.6-0.4-1-1-1h-8v-1c0-0.6-0.4-1-1-1
+ h-3c-0.6,0-1,0.4-1,1V23z"/>
+<g>
+ <path fill="#585858" d="M19,23l-3-1.6L13,23l0.6-3.5l-2.4-2.4l3.3-0.5l1.5-3.2l1.5,3.2l3.3,0.5l-2.4,2.4L19,23z M13.3,17.8l1.4,1.4
+ l-0.3,1.9l1.7-0.9l1.7,0.9l-0.3-1.9l1.4-1.4l-1.9-0.3L16,15.8l-0.8,1.7L13.3,17.8z"/>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/checkupdate.svg b/application/resources/OSX/scalable/checkupdate.svg
new file mode 100644
index 00000000..30cec51f
--- /dev/null
+++ b/application/resources/OSX/scalable/checkupdate.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill-rule="evenodd" clip-rule="evenodd" fill="none" width="32" height="32"/>
+<path fill="#B6B5B6" d="M30,28H2c-1.1,0-2-0.9-2-2V8c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v18C32,27.1,31.1,28,30,28z"/>
+<path fill="#FBFBFB" d="M30,27H2c-1.1,0-2-0.9-2-2V8c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v17C32,26.1,31.1,27,30,27z"/>
+<g>
+ <g id="_x37__9_">
+ <g>
+ <path fill="#585858" d="M18.9,21.7c-0.2-0.2-0.5-0.2-0.7,0l-1.6,1.6v-6.8c0-0.3-0.2-0.5-0.5-0.5c-0.3,0-0.5,0.2-0.5,0.5v6.8
+ l-1.6-1.6c-0.2-0.2-0.5-0.2-0.7,0c-0.2,0.2-0.2,0.5,0,0.7l2.5,2.5C15.7,25,15.9,25,16,25c0.1,0,0.3,0,0.4-0.1l2.5-2.5
+ C19.1,22.2,19.1,21.9,18.9,21.7z"/>
+ </g>
+ </g>
+ <path fill="#585858" d="M18,19.5h2.5c1.3-0.8,2.6-2.1,2.5-3.5c-0.1-1.6-1.8-3.6-4.2-3.5C18.4,11,17.2,10,15.5,10
+ c-2.2,0-3.5,1.9-3.5,4c-1.7,0.1-3,1.5-3,3c0,2.7,3,2.5,3,2.5s2,0,2,0c0.3,0,0.5,0.2,0.5,0.5s-0.2,0.5-0.5,0.5l-2,0
+ c-2.2-0.1-4-1.4-4-3.5c0-1.8,1.3-3.3,3-3.8c0.2-2.3,2.1-4.2,4.5-4.2c1.8,0,3.3,1,4,2.5c2.5,0.1,4.5,2.2,4.5,4.7
+ c0,1.9-1.8,3.5-3.5,4.2H18c-0.3,0-0.5-0.2-0.5-0.5S17.7,19.5,18,19.5z"/>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/copy.svg b/application/resources/OSX/scalable/copy.svg
new file mode 100644
index 00000000..7382d6e2
--- /dev/null
+++ b/application/resources/OSX/scalable/copy.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill-rule="evenodd" clip-rule="evenodd" fill="none" width="32" height="32"/>
+<path fill="#B6B5B6" d="M29.9,28.4h-28c-1.1,0-2-0.9-2-2v-18c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v18C31.9,27.5,31,28.4,29.9,28.4z"
+ />
+<path fill="#FBFBFB" d="M29.9,27.4h-28c-1.1,0-2-0.9-2-2v-17c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v17C31.9,26.5,31,27.4,29.9,27.4z"
+ />
+<g id="_x33__11_">
+ <g>
+ <path fill="#585858" d="M17.9,13.4h-8c-1.1,0-2,0.9-2,2v8c0,1.1,0.9,2,2,2h8c1.1,0,2-0.9,2-2v-8C19.9,14.3,19,13.4,17.9,13.4z
+ M18.9,23.4c0,0.6-0.4,1-1,1h-8c-0.6,0-1-0.4-1-1v-8c0-0.6,0.4-1,1-1h8c0.6,0,1,0.4,1,1V23.4z M21.9,9.4h-8c-1.1,0-2,0.9-2,2v1h1
+ v-1c0-0.6,0.4-1,1-1h8c0.6,0,1,0.4,1,1v8c0,0.6-0.4,1-1,1h-1v1h1c1.1,0,2-0.9,2-2v-8C23.9,10.3,23,9.4,21.9,9.4z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/coremods.svg b/application/resources/OSX/scalable/coremods.svg
new file mode 100644
index 00000000..b0df6052
--- /dev/null
+++ b/application/resources/OSX/scalable/coremods.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<circle fill-rule="evenodd" clip-rule="evenodd" fill="#E6E6E6" cx="14.9" cy="12.4" r="7"/>
+<polygon fill="#FFFFFF" points="12.2,11.5 13.5,13 13.2,14.9 14.9,14 16.5,14.9 16.2,13 17.6,11.5 15.7,11.3 14.9,9.5 14.1,11.3 "/>
+<rect fill="none" width="24" height="24"/>
+<g>
+ <g id="_x38__4_">
+ <g>
+ <path fill="#585858" d="M14.9,4.4c-4.4,0-8,3.6-8,8c0,4.4,3.6,8,8,8s8-3.6,8-8C22.9,8,19.3,4.4,14.9,4.4z M14.9,19.4
+ c-3.9,0-7-3.1-7-7c0-3.9,3.1-7,7-7s7,3.1,7,7C21.9,16.2,18.7,19.4,14.9,19.4z"/>
+ </g>
+ </g>
+ <g>
+ <path fill="#585858" d="M17.8,16.8l-3-1.6l-3,1.6l0.6-3.5l-2.4-2.4l3.3-0.5l1.5-3.2l1.5,3.2l3.3,0.5l-2.4,2.4L17.8,16.8z
+ M12.2,11.5l1.4,1.4l-0.3,1.9l1.7-0.9l1.7,0.9L16.2,13l1.4-1.4l-1.9-0.3l-0.8-1.7l-0.8,1.7L12.2,11.5z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/externaltools.svg b/application/resources/OSX/scalable/externaltools.svg
new file mode 100644
index 00000000..a2b7488e
--- /dev/null
+++ b/application/resources/OSX/scalable/externaltools.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<rect fill="none" width="24" height="24"/>
+<g id="_x35__1_">
+ <g>
+ <path fill="#585858" d="M9.5,9.5C9.8,9.5,10,9.2,10,9l0-2.4l7.6,7.3c0.2,0.2,0.5,0.2,0.7,0c0.2-0.2,0.2-0.5,0-0.7L10.8,6L13,6
+ c0.3,0,0.5-0.2,0.5-0.5S13.3,5,13,5H9.5C9.2,5,9,5.2,9,5.5V9C9,9.2,9.2,9.5,9.5,9.5z M21,5h-5.5v1H21c0.5,0,1,0.5,1,1l0,10
+ c0,0.5-0.4,1-1,1l-10,0c-0.5,0-1-0.5-1-1v-5.5H9V17c0,1.1,1.1,2,2.2,2H21c1.1,0,2-0.9,2-2V7.2C23,6.1,22.1,5,21,5z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/instance-settings.svg b/application/resources/OSX/scalable/instance-settings.svg
new file mode 100644
index 00000000..394877f8
--- /dev/null
+++ b/application/resources/OSX/scalable/instance-settings.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<rect fill="none" width="24" height="24"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M22,6c0-0.6-0.4-1-1-1H9C8.4,5,8,5.4,8,6v12c0,0.6,0.4,1,1,1h12
+ c0.6,0,1-0.4,1-1V6z"/>
+<g id="_x32__10_">
+ <g>
+ <path fill="#585858" d="M20,16h-5.6c-0.2-0.9-1-1.5-1.9-1.5s-1.7,0.6-1.9,1.5H10c-0.3,0-0.5,0.2-0.5,0.5c0,0.3,0.2,0.5,0.5,0.5
+ h0.6c0.2,0.9,1,1.5,1.9,1.5s1.7-0.6,1.9-1.5H20c0.3,0,0.5-0.2,0.5-0.5C20.5,16.2,20.3,16,20,16z M12.5,17.7
+ c-0.7,0-1.2-0.5-1.2-1.2s0.5-1.2,1.2-1.2s1.2,0.5,1.2,1.2S13.2,17.7,12.5,17.7z M21,4H9C7.9,4,7,4.9,7,6v12c0,1.1,0.9,2,2,2h12
+ c1.1,0,2-0.9,2-2V6C23,4.9,22.1,4,21,4z M22,18c0,0.6-0.4,1-1,1H9c-0.6,0-1-0.4-1-1V6c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1V18z
+ M20,8h-5.6c-0.2-0.9-1-1.5-1.9-1.5S10.8,7.1,10.6,8H10C9.7,8,9.5,8.2,9.5,8.5C9.5,8.8,9.7,9,10,9h0.6c0.2,0.9,1,1.5,1.9,1.5
+ s1.7-0.6,1.9-1.5H20c0.3,0,0.5-0.2,0.5-0.5C20.5,8.2,20.3,8,20,8z M12.5,9.7c-0.7,0-1.2-0.5-1.2-1.2c0-0.7,0.5-1.2,1.2-1.2
+ s1.2,0.5,1.2,1.2C13.7,9.2,13.2,9.7,12.5,9.7z M20,12h-1.1c-0.2-0.9-1-1.5-1.9-1.5s-1.7,0.6-1.9,1.5H10c-0.3,0-0.5,0.2-0.5,0.5
+ c0,0.3,0.2,0.5,0.5,0.5h5.1c0.2,0.9,1,1.5,1.9,1.5s1.7-0.6,1.9-1.5H20c0.3,0,0.5-0.2,0.5-0.5C20.5,12.2,20.3,12,20,12z M17,13.7
+ c-0.7,0-1.2-0.5-1.2-1.2c0-0.7,0.5-1.2,1.2-1.2s1.2,0.5,1.2,1.2C18.2,13.2,17.7,13.7,17,13.7z"/>
+ </g>
+</g>
+<circle fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" cx="12.5" cy="16.5" r="1.2"/>
+<circle fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" cx="17" cy="12.5" r="1.2"/>
+<circle fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" cx="12.5" cy="8.5" r="1.2"/>
+</svg>
diff --git a/application/resources/OSX/scalable/jarmods.svg b/application/resources/OSX/scalable/jarmods.svg
new file mode 100644
index 00000000..213ec833
--- /dev/null
+++ b/application/resources/OSX/scalable/jarmods.svg
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<rect fill="none" width="24" height="24"/>
+<g>
+ <g>
+ <g>
+ <path fill="#585858" d="M17.2,18.4h-5.4l-2.8-6.1L9.4,12c0,0,1-0.8,2.2-0.9c0.3,0,0.5,0.2,0.5,0.5c0,0.3-0.2,0.5-0.5,0.5
+ c-0.6,0-1,0.3-1.3,0.5l2.2,4.8h4.1l2.4-5.1c0.3-0.8,1.1-1.2,2-1.1c0.9,0.2,1.4,0.9,1.4,1.7c-0.1,1.8-1.4,2.4-1.4,2.4
+ c-0.3,0.1-0.6,0-0.7-0.3c-0.1-0.3,0-0.6,0.3-0.7c0,0,0.7-0.4,0.8-1.6c0-0.4-0.3-0.6-0.6-0.6c-0.1,0-0.6-0.1-0.8,0.4l0,0
+ L17.2,18.4z"/>
+ </g>
+ <path fill="#585858" d="M21.6,17.4c-0.3,0-0.5,0.2-0.5,0.5c0,0.4-2.2,1.5-6.6,1.5S8,18.3,8,17.9c0-0.3,0.7-0.7,2.2-1l-0.4-0.9
+ C8.1,16.3,7,17,7,17.9c0,1.7,3.9,2.5,7.6,2.5s7.6-0.8,7.6-2.5C22.1,17.6,21.9,17.4,21.6,17.4z"/>
+ <g>
+ <rect x="10.4" y="13.3" fill="#585858" width="8.2" height="1"/>
+ </g>
+ <g>
+ <rect x="11.3" y="15.3" fill="#585858" width="6.6" height="1"/>
+ </g>
+ </g>
+ <g>
+ <g>
+ <polygon fill="#999999" points="18,12.4 15.5,11 13,12.4 13.5,9.5 11.5,7.4 14.2,7 15.5,4.4 16.7,7 19.5,7.4 17.5,9.5 "/>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/java.svg b/application/resources/OSX/scalable/java.svg
new file mode 100644
index 00000000..e1aee159
--- /dev/null
+++ b/application/resources/OSX/scalable/java.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<rect fill="none" width="24" height="24"/>
+<g>
+ <g>
+ <path fill="#585858" d="M18,18.2h-5.3l-2.8-6.1l0.3-0.2c0,0,1-0.8,2.2-0.9c0.3,0,0.5,0.2,0.5,0.5c0,0.3-0.2,0.5-0.5,0.5
+ c-0.6,0-1,0.3-1.3,0.5l2.2,4.8h4l2.3-5.1c0.3-0.8,1.1-1.2,1.9-1.1c0.9,0.2,1.4,0.9,1.4,1.7c-0.1,1.8-1.3,2.4-1.4,2.4
+ c-0.3,0.1-0.6,0-0.7-0.3c-0.1-0.3,0-0.6,0.3-0.7c0,0,0.7-0.4,0.8-1.5c0-0.4-0.3-0.6-0.6-0.6c-0.1,0-0.6-0.1-0.8,0.4l0,0L18,18.2z"
+ />
+ </g>
+ <g>
+ <path fill="#999999" d="M14.9,11.4c-0.1,0-0.3-0.1-0.4-0.2c-1-1.1-1.5-2.4-1.4-3.3c0.1-0.9,1.1-2.6,3-3.6c0.2-0.1,0.6,0,0.7,0.2
+ c0.1,0.2,0,0.6-0.2,0.7C15,5.9,14.1,7.4,14.1,8c-0.1,0.5,0.3,1.5,1.2,2.6c0.2,0.2,0.2,0.5,0,0.7C15.1,11.4,15,11.4,14.9,11.4z"/>
+ </g>
+ <g>
+ <path fill="#999999" d="M16.5,12.5c-0.1,0-0.2,0-0.3-0.1c-0.2-0.2-0.3-0.5-0.1-0.7c0.1-0.1,0.2-0.2,0.3-0.3
+ c0.5-0.4,0.5-0.6,0.3-0.9c0-0.1-0.2-0.2-0.3-0.3c-0.4-0.5-1.1-1.1-1.1-2c0-1,1.1-2,3.7-3.4c0.2-0.1,0.6,0,0.7,0.2
+ c0.1,0.2,0,0.6-0.2,0.7c-2.8,1.6-3.1,2.3-3.1,2.5c0,0.4,0.5,0.9,0.8,1.3c0.2,0.2,0.3,0.3,0.4,0.4c0.7,1.1-0.1,1.8-0.4,2.2
+ c-0.1,0.1-0.1,0.1-0.2,0.2C16.8,12.4,16.7,12.5,16.5,12.5z"/>
+ </g>
+ <path fill="#585858" d="M22.3,17.2c-0.3,0-0.5,0.2-0.5,0.5c0,0.4-2.2,1.5-6.5,1.5s-6.5-1-6.5-1.5c0-0.2,0.7-0.7,2.1-1l-0.4-0.9
+ c-1.6,0.4-2.7,1-2.7,2c0,1.7,3.9,2.5,7.5,2.5s7.5-0.8,7.5-2.5C22.8,17.4,22.6,17.2,22.3,17.2z"/>
+ <g>
+ <rect x="11.2" y="13.2" fill="#585858" width="8.2" height="1"/>
+ </g>
+ <g>
+ <rect x="12" y="15.2" fill="#585858" width="6.6" height="1"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/loadermods.svg b/application/resources/OSX/scalable/loadermods.svg
new file mode 100644
index 00000000..76951ebd
--- /dev/null
+++ b/application/resources/OSX/scalable/loadermods.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<rect fill="none" width="24" height="24"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#585858" d="M22,6c0-0.6-0.4-1-1-1H9C8.4,5,8,5.4,8,6v12c0,0.6,0.4,1,1,1h12
+ c0.6,0,1-0.4,1-1V6z M21,20H9c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h12c1.1,0,2,0.9,2,2v12C23,19.1,22.1,20,21,20z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#E6E6E6" d="M22,6c0-0.6-0.4-1-1-1H9C8.4,5,8,5.4,8,6v12c0,0.6,0.4,1,1,1h12
+ c0.6,0,1-0.4,1-1V6z"/>
+<polygon fill="#585858" points="18,16.3 15,14.7 12,16.3 12.6,12.8 10.2,10.4 13.5,9.9 15,6.7 16.5,9.9 19.8,10.4 17.4,12.8 "/>
+<polygon fill="#FFFFFF" points="12.3,11.1 13.7,12.5 13.3,14.4 15,13.5 16.7,14.4 16.3,12.5 17.7,11.1 15.8,10.8 15,9.1 14.2,10.8
+ "/>
+</svg>
diff --git a/application/resources/OSX/scalable/log.svg b/application/resources/OSX/scalable/log.svg
new file mode 100644
index 00000000..0ac45d54
--- /dev/null
+++ b/application/resources/OSX/scalable/log.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<rect fill="none" width="24" height="24"/>
+<g id="_x37__11_">
+ <g>
+ <path fill="#585858" d="M21,4c0,0-2.9,0.8-5.5,1.5c-0.3,0-0.7,0-1,0C12,4.8,9,4,9,4C7.9,4,7,4.9,7,6v10.5c0,1.1,0.9,1.7,2,2
+ c0,0,2.7,0.8,5.5,1.5h1c2.8-0.8,5.5-1.5,5.5-1.5c1-0.3,2-0.9,2-2V6C23,4.9,22.1,4,21,4z M14.5,19C11.8,18.3,9,17.5,9,17.5
+ c-0.6-0.2-1-0.4-1-1V6c0-0.6,0.4-1,1-1l5.5,1.5V19z M22,16.5c0,0.6-0.5,0.8-1,1c0,0-2.7,0.8-5.5,1.5V6.5L21,5c0.6,0,1,0.4,1,1
+ V16.5z"/>
+ </g>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#E6E6E6" d="M9,5C8.4,5,8,5.4,8,6v10.5c0,0.6,0.4,0.8,1,1c0,0,2.8,0.8,5.5,1.5
+ V6.5L9,5z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M22,6c0-0.6-0.4-1-1-1l-5.5,1.5V19c2.8-0.7,5.5-1.5,5.5-1.5
+ c0.5-0.2,1-0.4,1-1V6z"/>
+</svg>
diff --git a/application/resources/OSX/scalable/minecraft.svg b/application/resources/OSX/scalable/minecraft.svg
new file mode 100644
index 00000000..86c915bc
--- /dev/null
+++ b/application/resources/OSX/scalable/minecraft.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<rect fill="none" width="24" height="24"/>
+<path fill="#585858" d="M15.9,4.4l-7,3.6v8.9l7,3.6l7-3.6V7.9L15.9,4.4z M21.2,8.2l-5.3,2.7l-5.3-2.7l5.3-2.7L21.2,8.2z M9.9,9
+ l5.5,2.8V19l-5.5-2.8V9z M16.4,19v-7.2L21.9,9v7.2L16.4,19z"/>
+<polygon fill="#FFFFFF" points="21.2,8.2 15.9,10.9 10.5,8.2 15.9,5.5 "/>
+<polygon fill="#F2F2F2" points="9.9,9 15.4,11.8 15.4,19 9.9,16.2 "/>
+<polygon fill="#CCCCCC" points="16.4,19 16.4,11.8 21.9,9 21.9,16.2 "/>
+</svg>
diff --git a/application/resources/OSX/scalable/multimc.svg b/application/resources/OSX/scalable/multimc.svg
new file mode 100644
index 00000000..caad21b5
--- /dev/null
+++ b/application/resources/OSX/scalable/multimc.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<path fill="#585858" d="M6.9,4.4v16h16v-16H6.9z M21.9,5.4l0,14h-14v-14H21.9z"/>
+<rect fill="none" width="24" height="24"/>
+<rect x="7.9" y="5.4" fill="#F2F2F2" width="14" height="14"/>
+<polygon fill="#999999" points="7.9,7.4 7.9,6.9 8.9,6.9 8.9,7.9 9.9,7.9 9.9,7.4 10.9,7.4 10.9,8.9 11.9,8.9 11.9,6.4 12.9,6.4
+ 12.9,7.4 13.9,7.4 13.9,6.9 14.9,6.9 14.9,8.9 15.9,8.9 15.9,7.4 16.9,7.4 16.9,8.4 17.9,8.4 17.9,7.4 18.9,7.4 18.9,6.9 19.9,6.9
+ 19.9,7.4 21.4,7.4 21.4,6.9 21.9,6.9 21.9,7.4 22.9,7.4 22.9,4.4 6.9,4.4 6.9,7.4 "/>
+<g>
+ <path fill="#585858" d="M14.9,13.6c-0.9,0.9-1.9,2-3.4,2c-1.5,0-2.6-1.1-2.6-2.7c0-1.4,1.2-2.7,2.8-2.7c1.3,0,2.4,1.1,3.2,2
+ c0.9-0.9,1.9-2,3.4-2c1.6,0,2.6,1.1,2.6,2.7c0,1.4-1.2,2.7-2.8,2.7C16.7,15.6,15.7,14.5,14.9,13.6z M14.1,12.9
+ c-0.7-0.7-1.5-1.6-2.5-1.6c-0.9,0-1.6,0.7-1.6,1.6c0,0.9,0.7,1.6,1.6,1.6C12.6,14.5,13.4,13.6,14.1,12.9z M19.7,12.9
+ c0-0.9-0.7-1.6-1.5-1.6c-1,0-1.9,0.9-2.6,1.6c0.7,0.7,1.5,1.6,2.5,1.6C19,14.5,19.7,13.7,19.7,12.9z"/>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/new.svg b/application/resources/OSX/scalable/new.svg
new file mode 100644
index 00000000..79ee87ba
--- /dev/null
+++ b/application/resources/OSX/scalable/new.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill-rule="evenodd" clip-rule="evenodd" fill="none" width="32" height="32"/>
+<path fill="#B6B5B6" d="M29.9,28.4h-28c-1.1,0-2-0.9-2-2v-18c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v18C31.9,27.5,31,28.4,29.9,28.4z"
+ />
+<path fill="#FBFBFB" d="M29.9,27.4h-28c-1.1,0-2-0.9-2-2v-17c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v17C31.9,26.5,31,27.4,29.9,27.4z"
+ />
+<g id="_x31__5_">
+ <g>
+ <path fill="#585858" d="M18.9,16.9h-2.5v-2.5c0-0.3-0.2-0.5-0.5-0.5s-0.5,0.2-0.5,0.5v2.5h-2.5c-0.3,0-0.5,0.2-0.5,0.5
+ c0,0.3,0.2,0.5,0.5,0.5h2.5v2.5c0,0.3,0.2,0.5,0.5,0.5s0.5-0.2,0.5-0.5v-2.5h2.5c0.3,0,0.5-0.2,0.5-0.5
+ C19.4,17.1,19.1,16.9,18.9,16.9z M21.9,9.4h-12c-1.1,0-2,0.9-2,2v12c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-12
+ C23.9,10.3,23,9.4,21.9,9.4z M22.9,23.4c0,0.6-0.4,1-1,1h-12c-0.6,0-1-0.4-1-1v-12c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1V23.4z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/news.svg b/application/resources/OSX/scalable/news.svg
new file mode 100644
index 00000000..b8ce3cd1
--- /dev/null
+++ b/application/resources/OSX/scalable/news.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v14c0,1.1,0.9,2,2,2h1.3
+ l2.7,4l2.7-4H26c1.1,0,2-0.9,2-2V6z"/>
+<g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#585858" d="M26,26H14l-4,6l-4-6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20
+ c3.3,0,6,2.7,6,6v14C32,23.3,29.3,26,26,26z M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v14c0,1.1,0.9,2,2,2h1.3l2.7,4l2.7-4H26
+ c1.1,0,2-0.9,2-2V6z"/>
+ <rect x="8" y="12" fill-rule="evenodd" clip-rule="evenodd" fill="#585858" width="16" height="2"/>
+ <rect x="8" y="8" fill-rule="evenodd" clip-rule="evenodd" fill="#585858" width="16" height="2"/>
+ <rect x="8" y="16" fill-rule="evenodd" clip-rule="evenodd" fill="#585858" width="8" height="2"/>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/notes.svg b/application/resources/OSX/scalable/notes.svg
new file mode 100644
index 00000000..c2e95cfd
--- /dev/null
+++ b/application/resources/OSX/scalable/notes.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<rect fill="none" width="24" height="24"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#E6E6E6" d="M22,7c0-0.6-0.4-1-1-1h-1.5v2h-7V6H11c-0.6,0-1,0.4-1,1v10
+ c0,0.6,0.4,1,1,1h10c0.6,0,1-0.4,1-1V7z"/>
+<g id="_x38__6_">
+ <g>
+ <path fill="#585858" d="M19.5,15h-7c-0.3,0-0.5,0.2-0.5,0.5c0,0.3,0.2,0.5,0.5,0.5h7c0.3,0,0.5-0.2,0.5-0.5
+ C20,15.2,19.8,15,19.5,15z M21,5h-1.5V4h-1.3c-0.4-0.6-1.2-1-2.2-1s-1.7,0.4-2.2,1h-1.3v1H11C9.9,5,9,5.9,9,7v10c0,1.1,0.9,2,2,2
+ h10c1.1,0,2-0.9,2-2V7C23,5.9,22.1,5,21,5z M13.5,5h1.1c0-0.6,0.6-1,1.4-1s1.4,0.4,1.4,1h1.1v2h-5V5z M22,17c0,0.6-0.4,1-1,1H11
+ c-0.6,0-1-0.4-1-1V7c0-0.6,0.4-1,1-1h1.5v2h7V6H21c0.6,0,1,0.4,1,1V17z M19.5,12.5h-7c-0.3,0-0.5,0.2-0.5,0.5
+ c0,0.3,0.2,0.5,0.5,0.5h7c0.3,0,0.5-0.2,0.5-0.5C20,12.7,19.8,12.5,19.5,12.5z M19.5,10h-7c-0.3,0-0.5,0.2-0.5,0.5
+ c0,0.3,0.2,0.5,0.5,0.5h7c0.3,0,0.5-0.2,0.5-0.5C20,10.2,19.8,10,19.5,10z"/>
+ </g>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M18.5,5h-1.1c0-0.6-0.6-1-1.4-1c-0.8,0-1.4,0.4-1.4,1h-1.1v2h5V5z"
+ />
+</svg>
diff --git a/application/resources/OSX/scalable/patreon.svg b/application/resources/OSX/scalable/patreon.svg
new file mode 100644
index 00000000..4f0da3e5
--- /dev/null
+++ b/application/resources/OSX/scalable/patreon.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill-rule="evenodd" clip-rule="evenodd" fill="none" width="32" height="32"/>
+<path fill="#B6B5B6" d="M30,28H2c-1.1,0-2-0.9-2-2V8c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v18C32,27.1,31.1,28,30,28z"/>
+<path fill="#FBFBFB" d="M30,27H2c-1.1,0-2-0.9-2-2V8c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v17C32,26.1,31.1,27,30,27z"/>
+<g>
+ <rect x="8" y="9" fill="none" width="16" height="16"/>
+ <path fill="#585858" d="M16,8.3c-4.4,0-8,3.6-8,8v8h1.9v-1.9V20v-3.7c0-3.4,2.8-6.1,6.1-6.1c3.4,0,6.1,2.8,6.1,6.1
+ c0,3.3-2.6,6-5.9,6.1c-1,0-1.9-0.2-2.3-0.4v-2.6c0.6,0.4,1.3,0.6,2,0.6c2,0,3.7-1.6,3.7-3.7c0-2-1.6-3.7-3.7-3.7
+ c-2,0-3.7,1.6-3.7,3.7v8h3.3c0.1,0,0.2,0,0.3,0c4.4,0,8-3.6,8-8S20.4,8.3,16,8.3z"/>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/proxy.svg b/application/resources/OSX/scalable/proxy.svg
new file mode 100644
index 00000000..99acaa2b
--- /dev/null
+++ b/application/resources/OSX/scalable/proxy.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<rect fill="none" width="24" height="24"/>
+<path fill="#585858" d="M20.1,10.1c-0.8,0-1.5,0.4-1.9,0.9l-4.7-3c0.1-0.3,0.2-0.6,0.2-0.9c0-1.4-1.1-2.5-2.5-2.5S8.6,5.7,8.6,7.1
+ s1.1,2.5,2.5,2.5c0.7,0,1.3-0.3,1.8-0.8l4.8,3.1c-0.1,0.2-0.1,0.4-0.1,0.7c0,0.2,0,0.5,0.1,0.7l-4.8,3.1c-0.5-0.5-1.1-0.8-1.8-0.8
+ c-1.4,0-2.5,1.1-2.5,2.5s1.1,2.5,2.5,2.5s2.5-1.1,2.5-2.5c0-0.3-0.1-0.6-0.2-0.9l4.7-3c0.5,0.6,1.1,0.9,1.9,0.9
+ c1.4,0,2.5-1.1,2.5-2.5S21.5,10.1,20.1,10.1z M11.1,8.6c-0.8,0-1.5-0.7-1.5-1.5s0.7-1.5,1.5-1.5s1.5,0.7,1.5,1.5S11.9,8.6,11.1,8.6z
+ M11.1,19.6c-0.8,0-1.5-0.7-1.5-1.5s0.7-1.5,1.5-1.5s1.5,0.7,1.5,1.5S11.9,19.6,11.1,19.6z M20.1,14.1c-0.8,0-1.5-0.7-1.5-1.5
+ s0.7-1.5,1.5-1.5s1.5,0.7,1.5,1.5S20.9,14.1,20.1,14.1z"/>
+<circle fill="#FFFFFF" cx="11.1" cy="7.1" r="1.5"/>
+<circle fill="#FFFFFF" cx="11.1" cy="18.1" r="1.5"/>
+<circle fill="#FFFFFF" cx="20.1" cy="12.6" r="1.5"/>
+</svg>
diff --git a/application/resources/OSX/scalable/quickmods.svg b/application/resources/OSX/scalable/quickmods.svg
new file mode 100644
index 00000000..e0aaad87
--- /dev/null
+++ b/application/resources/OSX/scalable/quickmods.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<rect fill="none" width="24" height="24"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#E6E6E6" d="M22,6c0-0.6-0.4-1-1-1H9C8.4,5,8,5.4,8,6v12c0,0.6,0.4,1,1,1h12
+ c0.6,0,1-0.4,1-1V6z"/>
+<polygon fill="#FFFFFF" points="12.5,8.1 12.5,15.9 18.6,12 "/>
+<g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#585858" d="M21,20H9c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h12c1.1,0,2,0.9,2,2
+ v12C23,19.1,22.1,20,21,20z M22,6c0-0.6-0.4-1-1-1H9C8.4,5,8,5.4,8,6v12c0,0.6,0.4,1,1,1h12c0.6,0,1-0.4,1-1V6z"/>
+ <g>
+ <path fill="#585858" d="M12.3,17c-0.4,0-0.8-0.3-0.8-0.9V7.9c0-0.6,0.4-0.9,0.8-0.9c0.2,0,0.4,0.1,0.5,0.2l6.5,4.1
+ c0.3,0.2,0.4,0.4,0.4,0.7s-0.2,0.6-0.4,0.7l-6.5,4.1C12.7,16.9,12.5,17,12.3,17z M12.5,8.1l0,7.7l6.1-3.9L12.5,8.1z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/refresh.svg b/application/resources/OSX/scalable/refresh.svg
new file mode 100644
index 00000000..c97489c1
--- /dev/null
+++ b/application/resources/OSX/scalable/refresh.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill-rule="evenodd" clip-rule="evenodd" fill="none" width="32" height="32"/>
+<path fill="#B6B5B6" d="M30,28H2c-1.1,0-2-0.9-2-2V8c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v18C32,27.1,31.1,28,30,28z"/>
+<path fill="#FBFBFB" d="M30,27H2c-1.1,0-2-0.9-2-2V8c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v17C32,26.1,31.1,27,30,27z"/>
+<g id="_x32__12_">
+ <g>
+ <path fill="#585858" d="M19.9,10h3.6c0.3,0,0.5-0.2,0.5-0.5C24,9.2,23.8,9,23.5,9h-5C18.4,9,18,9,18,9.5v5c0,0.3,0.2,0.5,0.5,0.5
+ s0.5-0.2,0.5-0.5v-3.8c2.4,1.1,4,3.5,4,6.3c0,3.9-3.1,7-7,7s-7-3.1-7-7c0-3.5,2.6-6.4,6-6.9v-1c-3.9,0.5-7,3.9-7,7.9
+ c0,4.4,3.6,8,8,8s8-3.6,8-8C24,14,22.3,11.4,19.9,10z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/resourcepacks.svg b/application/resources/OSX/scalable/resourcepacks.svg
new file mode 100644
index 00000000..c85d4e3c
--- /dev/null
+++ b/application/resources/OSX/scalable/resourcepacks.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<rect fill="none" width="24" height="24"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#E6E6E6" d="M22,17c0,0.6-0.4,1-1,1H9c-0.6,0-1-0.4-1-1v-5.5h5.1
+ c0,0.2-0.1,0.3-0.1,0.5c0,1.1,0.9,2,2,2s2-0.9,2-2c0-0.2,0-0.3-0.1-0.5H22V17z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#E6E6E6" d="M22,10.5H8V8c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1V10.5z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#585858" d="M21,6h-3V5c0-0.6-0.4-1-1-1h-4c-0.6,0-1,0.4-1,1v1H9
+ C7.9,6,7,6.9,7,8v9c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V8C23,6.9,22.1,6,21,6z M13,5.5C13,5.2,13.2,5,13.5,5h3C16.8,5,17,5.2,17,5.5
+ V6c-0.3,0-3.7,0-4,0V5.5z M22,17c0,0.6-0.4,1-1,1H9c-0.6,0-1-0.4-1-1v-5.5h5.1c0,0.2-0.1,0.3-0.1,0.5c0,1.1,0.9,2,2,2s2-0.9,2-2
+ c0-0.2,0-0.3-0.1-0.5H22V17z M14,12c0-0.2,0.1-0.4,0.1-0.5h1.7c0.1,0.1,0.1,0.3,0.1,0.5c0,0.6-0.4,1-1,1S14,12.6,14,12z M22,10.5H8
+ V8c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1V10.5z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M14,12c0-0.2,0.1-0.4,0.1-0.5h1.7c0.1,0.1,0.1,0.3,0.1,0.5
+ c0,0.6-0.4,1-1,1S14,12.6,14,12z"/>
+</svg>
diff --git a/application/resources/OSX/scalable/screenshots.svg b/application/resources/OSX/scalable/screenshots.svg
new file mode 100644
index 00000000..12df0c88
--- /dev/null
+++ b/application/resources/OSX/scalable/screenshots.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#E6E6E6" d="M21,20H9c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h12c1.1,0,2,0.9,2,2
+ v12C23,19.1,22.1,20,21,20z"/>
+<rect fill="none" width="24" height="24"/>
+<g id="_x36__8_">
+ <g>
+ <path fill="#585858" d="M21,4H9C7.9,4,7,4.9,7,6v12c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V6C23,4.9,22.1,4,21,4z M22,12.6l-3-3.1
+ l-5,5.1l-2-2.1l-4,3.7V6c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1V12.6z M11,6C9.9,6,9,6.9,9,8c0,1.1,0.9,2,2,2s2-0.9,2-2
+ C13,6.9,12.1,6,11,6z M11,9c-0.6,0-1-0.4-1-1c0-0.6,0.4-1,1-1s1,0.4,1,1C12,8.6,11.6,9,11,9z"/>
+ </g>
+</g>
+<circle fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" cx="11" cy="8" r="1"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#999999" d="M21,19c0.6,0,1-0.4,1-1v-4l-3-3l-4.3,4.3l3.7,3.7H21z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#999999" d="M8,18c0,0.6,0.4,1,1,1h8l-5-5l-4,3.6V18z"/>
+</svg>
diff --git a/application/resources/OSX/scalable/settings.svg b/application/resources/OSX/scalable/settings.svg
new file mode 100644
index 00000000..dcdd9f1c
--- /dev/null
+++ b/application/resources/OSX/scalable/settings.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill-rule="evenodd" clip-rule="evenodd" fill="none" width="32" height="32"/>
+<path fill="#B6B5B6" d="M30,28H2c-1.1,0-2-0.9-2-2V8c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v18C32,27.1,31.1,28,30,28z"/>
+<path fill="#FBFBFB" d="M30,27H2c-1.1,0-2-0.9-2-2V8c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v17C32,26.1,31.1,27,30,27z"/>
+<g id="_x31__16_">
+ <g>
+ <path fill="#585858" d="M23,18.3l-1.2-0.7c0.1-0.4,0.1-0.7,0.1-1.1c0-0.4,0-0.7-0.1-1.1l1.2-0.7c0.5-0.3,0.6-0.9,0.4-1.4l-1-1.7
+ c-0.3-0.5-0.9-0.6-1.4-0.4L19.9,12c-0.5-0.5-1.2-0.9-1.9-1.1V10c0-0.6-0.4-1-1-1h-2c-0.5,0-1,0.4-1,1v0.8
+ c-0.7,0.2-1.3,0.6-1.9,1.1L11,11.3c-0.5-0.3-1.1-0.1-1.4,0.4l-1,1.7c-0.3,0.5-0.1,1.1,0.4,1.4l1.2,0.7c-0.1,0.4-0.1,0.7-0.1,1.1
+ c0,0.4,0,0.7,0.1,1.1L9,18.3c-0.5,0.3-0.6,0.9-0.4,1.4l1,1.7c0.3,0.5,0.9,0.6,1.4,0.4l1.2-0.7c0.5,0.5,1.2,0.9,1.9,1.1V23
+ c0,0.6,0.4,1,1,1h2c0.5,0,1-0.4,1-1v-0.8c0.7-0.2,1.3-0.6,1.9-1.1l1.2,0.7c0.5,0.3,1.1,0.1,1.4-0.4l1-1.7
+ C23.6,19.2,23.5,18.5,23,18.3z M22.3,19.6l-0.5,0.9c-0.1,0.2-0.4,0.3-0.7,0.2l-1.4-0.8c-0.7,0.8-1.6,1.4-2.7,1.6v1.1
+ c0,0.3-0.2,0.5-0.5,0.5h-1c-0.3,0-0.5-0.2-0.5-0.5v-1.1c-1.1-0.2-2-0.8-2.7-1.6l-1.4,0.8c-0.2,0.1-0.5,0.1-0.7-0.2l-0.5-0.9
+ c-0.1-0.2-0.1-0.5,0.2-0.7l1.4-0.8c-0.2-0.5-0.3-1-0.3-1.6s0.1-1.1,0.3-1.6l-1.4-0.8c-0.2-0.1-0.3-0.4-0.2-0.7l0.5-0.9
+ c0.1-0.2,0.4-0.3,0.7-0.2l1.4,0.8c0.7-0.8,1.6-1.4,2.7-1.6v-1.1c0-0.3,0.2-0.5,0.5-0.5h1c0.3,0,0.5,0.2,0.5,0.5v1.1
+ c1.1,0.2,2,0.8,2.7,1.6l1.4-0.8c0.2-0.1,0.5-0.1,0.7,0.2l0.5,0.9c0.1,0.2,0.1,0.5-0.2,0.7l-1.4,0.8c0.2,0.5,0.3,1,0.3,1.6
+ s-0.1,1.1-0.3,1.6l1.4,0.8C22.3,19,22.4,19.3,22.3,19.6z M16,14c-1.4,0-2.5,1.1-2.5,2.5c0,1.4,1.1,2.5,2.5,2.5s2.5-1.1,2.5-2.5
+ C18.5,15.1,17.4,14,16,14z M16,18c-0.8,0-1.5-0.7-1.5-1.5c0-0.8,0.7-1.5,1.5-1.5s1.5,0.7,1.5,1.5C17.5,17.3,16.8,18,16,18z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/status-bad.svg b/application/resources/OSX/scalable/status-bad.svg
new file mode 100644
index 00000000..add7a6f7
--- /dev/null
+++ b/application/resources/OSX/scalable/status-bad.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#F2F2F2" d="M28,6c0-1.2-0.8-2-2-2H6C4.8,4,4,4.8,4,6v20c0,1.2,0.8,2,2,2h20c1.2,0,2-0.8,2-2V6z"/>
+<path fill="#585858" d="M26,32H6c-3.4,0-6-2.6-6-6V6c0-3.4,2.6-6,6-6h20c3.4,0,6,2.6,6,6v20C32,29.4,29.4,32,26,32z M28,6
+ c0-1.2-0.8-2-2-2H6C4.8,4,4,4.8,4,6v20c0,1.2,0.8,2,2,2h20c1.2,0,2-0.8,2-2V6z M21.6,21.6c-0.8,0.8-2,0.8-2.8,0L16,18.8l-2.8,2.8
+ c-0.8,0.8-2,0.8-2.8,0c-0.8-0.8-0.8-2,0-2.8l2.8-2.8l-2.8-2.8c-0.8-0.8-0.8-2,0-2.8c0.8-0.8,2-0.8,2.8,0l2.8,2.8l2.8-2.8
+ c0.8-0.8,2-0.8,2.8,0s0.8,2,0,2.8L18.8,16l2.8,2.8C22.4,19.6,22.4,20.8,21.6,21.6z"/>
+</svg>
diff --git a/application/resources/OSX/scalable/status-good.svg b/application/resources/OSX/scalable/status-good.svg
new file mode 100644
index 00000000..f10da757
--- /dev/null
+++ b/application/resources/OSX/scalable/status-good.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#F2F2F2" d="M28,26c0,1.2-0.8,2-2,2H6c-1.2,0-2-0.8-2-2V6c0-1.2,0.8-2,2-2h20c1.2,0,2,0.8,2,2V26z"/>
+<g>
+ <path fill="none" d="M26,0H6C2.6,0,0,2.6,0,6v20c0,3.4,2.6,6,6,6h20c3.4,0,6-2.6,6-6V6C32,2.6,29.4,0,26,0z M28,26c0,1.2-0.8,2-2,2
+ H6c-1.2,0-2-0.8-2-2V6c0-1.2,0.8-2,2-2h20c1.2,0,2,0.8,2,2V26z M21,10.4l-7,7l-2.8-2.8c-0.8-0.8-2-0.8-2.8,0s-0.8,2,0,2.8l4.2,4.2
+ c0.8,0.8,2,0.8,2.8,0l8.4-8.4c0.8-0.8,0.8-2,0-2.8S21.8,9.6,21,10.4z"/>
+</g>
+<g>
+ <g>
+ <path fill="#585858" d="M26,0H6C2.6,0,0,2.6,0,6v20c0,3.4,2.6,6,6,6h20c3.4,0,6-2.6,6-6V6C32,2.6,29.4,0,26,0z M28,26
+ c0,1.2-0.8,2-2,2H6c-1.2,0-2-0.8-2-2V6c0-1.2,0.8-2,2-2h20c1.2,0,2,0.8,2,2V26z M21,10.4l-7,7l-2.8-2.8c-0.8-0.8-2-0.8-2.8,0
+ s-0.8,2,0,2.8l4.2,4.2c0.8,0.8,2,0.8,2.8,0l8.4-8.4c0.8-0.8,0.8-2,0-2.8S21.8,9.6,21,10.4z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/status-yellow.svg b/application/resources/OSX/scalable/status-yellow.svg
new file mode 100644
index 00000000..fba697bc
--- /dev/null
+++ b/application/resources/OSX/scalable/status-yellow.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <path fill="#E3A333" d="M26,0H6C2.7,0,0,2.7,0,6v20c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V6C32,2.7,29.3,0,26,0z M28,26
+ c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h20c1.1,0,2,0.9,2,2V26z"/>
+</g>
+<path fill="#585858" d="M26,0H6C2.7,0,0,2.7,0,6v20c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V6C32,2.7,29.3,0,26,0z"/>
+<path fill="#F2F2F2" d="M28,26c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h20c1.1,0,2,0.9,2,2V26z"/>
+<g>
+ <path fill="#585858" d="M6,20c0-5.8,2.4-7.9,5.8-7.9c2,0,3.4,0.7,5.3,1.9c1.6,1,2.5,1.5,3.3,1.5c0.7,0,1.2-0.7,1.3-3.1H26
+ c0.2,6.1-2.3,8-5.5,8c-2,0-3.5-0.8-5.3-1.9c-1.7-1-2.6-1.6-3.3-1.6c-0.8,0-1.4,0.5-1.6,3.2H6z"/>
+</g>
+</svg>
diff --git a/application/resources/OSX/scalable/viewfolder.svg b/application/resources/OSX/scalable/viewfolder.svg
new file mode 100644
index 00000000..682c72c7
--- /dev/null
+++ b/application/resources/OSX/scalable/viewfolder.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill-rule="evenodd" clip-rule="evenodd" fill="none" width="32" height="32"/>
+<path fill="#B6B5B6" d="M30,28.4H2c-1.1,0-2-0.9-2-2v-18c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v18C32,27.5,31.1,28.4,30,28.4z"/>
+<path fill="#FBFBFB" d="M30,27.4H2c-1.1,0-2-0.9-2-2v-17c0-1.1,0.9-2,2-2h28c1.1,0,2,0.9,2,2v17C32,26.5,31.1,27.4,30,27.4z"/>
+<g id="_x36__6_">
+ <g>
+ <path fill="#585858" d="M22,11.4h-7c0-1.1-0.9-2-2-2h-3c-1.1,0-2,0.9-2,2v12c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-10
+ C24,12.3,23.1,11.4,22,11.4z M23,23.4c0,0.6-0.4,1-1,1H10c-0.6,0-1-0.4-1-1v-8h14V23.4z M23,14.4H9v-3c0-0.6,0.4-1,1-1h3
+ c0.6,0,1,0.4,1,1v1h8c0.6,0,1,0.4,1,1V14.4z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/backgrounds/backgrounds.qrc b/application/resources/backgrounds/backgrounds.qrc
new file mode 100644
index 00000000..55de139e
--- /dev/null
+++ b/application/resources/backgrounds/backgrounds.qrc
@@ -0,0 +1,6 @@
+<!DOCTYPE RCC>
+<RCC version="1.0">
+ <qresource prefix="/backgrounds">
+ <file alias="kitteh">catbgrnd2.png</file>
+ </qresource>
+</RCC>
diff --git a/application/resources/backgrounds/catbgrnd2.png b/application/resources/backgrounds/catbgrnd2.png
new file mode 100644
index 00000000..2b949e0b
--- /dev/null
+++ b/application/resources/backgrounds/catbgrnd2.png
Binary files differ
diff --git a/application/resources/iOS/iOS.qrc b/application/resources/iOS/iOS.qrc
new file mode 100644
index 00000000..eb625d0b
--- /dev/null
+++ b/application/resources/iOS/iOS.qrc
@@ -0,0 +1,35 @@
+<!DOCTYPE RCC>
+<RCC version="1.0">
+ <qresource prefix="/icons/iOS">
+ <file>index.theme</file>
+ <file>scalable/about.svg</file>
+ <file>scalable/accounts.svg</file>
+ <file>scalable/bug.svg</file>
+ <file>scalable/centralmods.svg</file>
+ <file>scalable/checkupdate.svg</file>
+ <file>scalable/copy.svg</file>
+ <file>scalable/coremods.svg</file>
+ <file>scalable/externaltools.svg</file>
+ <file>scalable/instance-settings.svg</file>
+ <file>scalable/jarmods.svg</file>
+ <file>scalable/java.svg</file>
+ <file>scalable/loadermods.svg</file>
+ <file>scalable/log.svg</file>
+ <file>scalable/minecraft.svg</file>
+ <file>scalable/multimc.svg</file>
+ <file>scalable/new.svg</file>
+ <file>scalable/news.svg</file>
+ <file>scalable/notes.svg</file>
+ <file>scalable/patreon.svg</file>
+ <file>scalable/proxy.svg</file>
+ <file>scalable/quickmods.svg</file>
+ <file>scalable/refresh.svg</file>
+ <file>scalable/resourcepacks.svg</file>
+ <file>scalable/screenshots.svg</file>
+ <file>scalable/settings.svg</file>
+ <file>scalable/status-bad.svg</file>
+ <file>scalable/status-good.svg</file>
+ <file>scalable/status-yellow.svg</file>
+ <file>scalable/viewfolder.svg</file>
+ </qresource>
+</RCC>
diff --git a/application/resources/iOS/index.theme b/application/resources/iOS/index.theme
new file mode 100644
index 00000000..b0f2f6ba
--- /dev/null
+++ b/application/resources/iOS/index.theme
@@ -0,0 +1,11 @@
+[Icon Theme]
+Name=iOS
+Comment=iOS theme by pexner
+Inherits=multimc
+Directories=scalable
+
+[scalable]
+Size=48
+Type=Scalable
+MinSize=16
+MaxSize=256
diff --git a/application/resources/iOS/scalable/about.svg b/application/resources/iOS/scalable/about.svg
new file mode 100644
index 00000000..c4d35471
--- /dev/null
+++ b/application/resources/iOS/scalable/about.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <polygon fill="#3366CC" points="18.5,22.5 18.5,12.5 12,12.5 12,15 14.5,15 14.5,22.5 12,22.5 12,25 21,25 21,22.5 "/>
+ <g id="_x38__8_">
+ <g>
+ <path fill="#3366CC" d="M16,0C7.2,0,0,7.2,0,16c0,8.8,7.2,16,16,16c8.8,0,16-7.2,16-16C32,7.2,24.8,0,16,0z M16,30
+ C8.3,30,2,23.7,2,16C2,8.3,8.3,2,16,2c7.7,0,14,6.3,14,14C30,23.7,23.7,30,16,30z"/>
+ </g>
+ </g>
+ <circle fill="#3366CC" cx="16.5" cy="8.5" r="2"/>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/accounts.svg b/application/resources/iOS/scalable/accounts.svg
new file mode 100644
index 00000000..65f76c3f
--- /dev/null
+++ b/application/resources/iOS/scalable/accounts.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g id="_x36__17_">
+ <g>
+ <path fill="#3366CC" d="M23,16.4c1.3-1.7,2-3.9,2-6.4c0-5.5-4-10-9-10S7,4.5,7,10c0,2.4,0.8,4.6,2,6.4c-2.3,0.8-4,3-4,5.6v4
+ c0,3.3,2.7,6,6,6h10c3.3,0,6-2.7,6-6v-4C27,19.4,25.3,17.2,23,16.4z M9,10c0-4.4,3.1-8,7-8s7,3.6,7,8c0,4.4-3.1,8-7,8S9,14.4,9,10
+ z M25,25.5c0,2.5-2.2,4.5-4.9,4.5h-8.2C9.2,30,7,28,7,25.5v-3c0-2.1,1.6-3.9,3.8-4.4C12.3,19.3,14,20,16,20s3.8-0.7,5.2-1.9
+ c2.2,0.5,3.8,2.2,3.8,4.4V25.5z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/bug.svg b/application/resources/iOS/scalable/bug.svg
new file mode 100644
index 00000000..fc4a3d69
--- /dev/null
+++ b/application/resources/iOS/scalable/bug.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#3366CC" d="M31.1,19.8c0.5,0,0.9-0.4,0.9-0.9c0-0.5-0.4-0.9-0.9-0.9H26c0-0.2,0-0.4,0-0.6c0-0.7,0-1.4,0-2
+ c1.3-0.2,2.4-0.8,3.3-1.8c2.6-3,1.8-8.8,1.8-9C31,4,30.5,3.6,30,3.7c-0.5,0.1-0.9,0.6-0.8,1.1c0,0.1,0.7,5.1-1.4,7.5
+ c-0.6,0.6-1.3,1-2.2,1.1c-0.1-0.4-0.3-0.7-0.6-1c-0.4-0.4-0.8-0.6-1.4-0.9c0.4-0.5,0.7-1.2,0.7-2.2c0-2.4-1.6-4.5-4.2-5.6l-0.1,0
+ C19.8,1.6,18.1,0,16,0C14,0,12.3,1.6,12,3.7l-0.1,0v0C9.3,4.9,7.7,7,7.7,9.4c0,1,0.3,1.7,0.7,2.2c-0.6,0.2-1,0.5-1.4,0.9
+ c-0.3,0.3-0.5,0.6-0.6,1c-0.9-0.1-1.6-0.5-2.2-1.1C2.1,9.9,2.8,4.8,2.8,4.7c0.1-0.5-0.3-1-0.8-1.1C1.5,3.6,1,4,1,4.5
+ c0,0.2-0.8,6,1.8,9c0.9,1,2,1.6,3.3,1.8c0,0.6,0,1.2,0,2c0,0.2,0,0.4,0,0.6H0.9c-0.5,0-0.9,0.4-0.9,0.9c0,0.5,0.4,0.9,0.9,0.9h5.2
+ c0.1,1.2,0.3,2.3,0.6,3.4c-1.6,0.2-3,0.8-3.9,1.9c-2.2,2.4-1.9,5.9-1.9,6.1c0,0.5,0.5,0.9,0.9,0.9c0,0,0.1,0,0.1,0
+ c0.5,0,0.9-0.5,0.9-1c0,0-0.2-2.9,1.4-4.6C4.9,25.5,6,25.1,7.4,25c1.7,3.7,4.9,6.2,8.6,6.2c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
+ c3.7,0,6.9-2.5,8.6-6.2c1.4,0.1,2.4,0.5,3.2,1.4c1.6,1.7,1.4,4.6,1.4,4.6c0,0.5,0.3,1,0.9,1c0,0,0.1,0,0.1,0c0.5,0,0.9-0.4,0.9-0.9
+ c0-0.2,0.3-3.7-1.9-6.1c-1-1.1-2.3-1.7-3.9-1.9c0.3-1.1,0.5-2.2,0.6-3.4H31.1z M16,1.9c0.8,0,1.5,0.5,1.9,1.2
+ c-0.2,0-0.4-0.1-0.5-0.1c-0.1,0-0.2,0-0.3,0c-0.4,0-0.7-0.1-1.1-0.1c-0.4,0-0.7,0-1.1,0.1c-0.1,0-0.2,0-0.3,0c-0.2,0-0.4,0-0.5,0.1
+ C14.5,2.4,15.2,1.9,16,1.9z M9.6,9.4c0-1.7,1.4-3.3,3.5-4.1c1.8-0.7,3.9-0.7,5.8,0c2.1,0.8,3.5,2.4,3.5,4.1c0,1-0.2,1.5-3.1,1.6
+ c-1,0-2-0.1-3.3-0.1c0,0,0,0-0.1,0c0,0,0,0,0,0c0,0,0,0,0,0c-1.2,0-2.3,0-3.2,0.1C9.9,11,9.6,10.5,9.6,9.4z M16.9,29.2V18.9
+ c0-0.5-0.4-0.9-0.9-0.9c-0.5,0-0.9,0.4-0.9,0.9v10.3C11.1,28.6,8,24.3,8,19c0-0.7,0-1.3,0-1.8c0-1.8-0.1-2.9,0.4-3.4
+ c0.6-0.6,2.1-0.8,4.5-0.9c0.4,0,0.9,0,1.3,0c1.1,0,2.4,0,3.5,0c0.5,0,1,0,1.5,0c2.4,0.1,3.9,0.3,4.5,0.9c0.5,0.5,0.5,1.7,0.4,3.4
+ c0,0.5,0,1,0,1.6c0,0,0,0,0,0.1c0,0,0,0,0,0.1c0,0,0,0.1,0,0.1C24.1,24.3,21,28.6,16.9,29.2z"/>
+</svg>
diff --git a/application/resources/iOS/scalable/centralmods.svg b/application/resources/iOS/scalable/centralmods.svg
new file mode 100644
index 00000000..1b4c4741
--- /dev/null
+++ b/application/resources/iOS/scalable/centralmods.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M28,32H4c-2.2,0-4-1.8-4-4V4c0-2.2,1.8-4,4-4h6c2.2,0,4,1.8,4,4h14
+ c2.2,0,4,1.8,4,4v20C32,30.2,30.2,32,28,32z M2,28c0,1.1,0.9,2,2,2h24c1.1,0,2-0.9,2-2V8c0-1.1-0.9-2-2-2H12V4c0-1.1-0.9-2-2-2H4
+ C2.9,2,2,2.9,2,4V28z"/>
+<g>
+ <path fill="#3366CC" d="M21.9,26.9L16,23.7l-5.9,3.3l1.1-6.9l-4.8-4.9l6.6-1l3-6.4l3,6.4l6.6,1L20.8,20L21.9,26.9z M10.6,16.5
+ l2.8,2.8l-0.6,3.9l3.3-1.8l3.3,1.8l-0.6-3.9l2.8-2.8l-3.8-0.6L16,12.5l-1.6,3.5L10.6,16.5z"/>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/checkupdate.svg b/application/resources/iOS/scalable/checkupdate.svg
new file mode 100644
index 00000000..9fc983d1
--- /dev/null
+++ b/application/resources/iOS/scalable/checkupdate.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g id="_x37__7_">
+ <g>
+ <path fill="#3366CC" d="M21.7,25.4c-0.4-0.4-1-0.4-1.4,0L17,28.7V15c0-0.6-0.4-1-1-1c-0.6,0-1,0.4-1,1v13.6l-3.3-3.2
+ c-0.4-0.4-1-0.4-1.4,0c-0.4,0.4-0.4,1,0,1.4l4.9,4.9c0.2,0.2,0.5,0.3,0.8,0.3c0.3,0,0.6-0.1,0.8-0.3l4.9-4.9
+ C22.1,26.4,22.1,25.8,21.7,25.4z"/>
+ </g>
+</g>
+<path fill="#3366CC" d="M20,21h5c2.7-1.5,5.1-4.2,5-7c-0.2-3.3-3.5-7.2-8.5-7c-0.8-2.9-3.1-5-6.5-5c-4.3,0-7,3.9-7,8
+ c-3.3,0.2-6,3-6,6c0,5.4,6,5,6,5s4,0,4,0c0.6,0,1,0.4,1,1s-0.4,1-1,1l-4,0c-4.5-0.2-8-2.7-8-7c0-3.6,2.5-6.7,6-7.7
+ C6.4,3.7,10.3,0,15,0c3.5,0,6.6,2.1,8.1,5c5,0.3,8.9,4.4,8.9,9.5c0,3.9-3.6,7-7,8.5h-5c-0.6,0-1-0.4-1-1S19.4,21,20,21z"/>
+</svg>
diff --git a/application/resources/iOS/scalable/copy.svg b/application/resources/iOS/scalable/copy.svg
new file mode 100644
index 00000000..3ccc2f06
--- /dev/null
+++ b/application/resources/iOS/scalable/copy.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g id="_x33__7_">
+ <g>
+ <path fill="#3366CC" d="M20,8H4c-2.2,0-4,1.8-4,4v16c0,2.2,1.8,4,4,4h16c2.2,0,4-1.8,4-4V12C24,9.8,22.2,8,20,8z M22,28
+ c0,1.1-0.9,2-2,2H4c-1.1,0-2-0.9-2-2V12c0-1.1,0.9-2,2-2h16c1.1,0,2,0.9,2,2V28z M28,0H12C9.8,0,8,1.8,8,4v2h2V4c0-1.1,0.9-2,2-2
+ h16c1.1,0,2,0.9,2,2v16c0,1.1-0.9,2-2,2h-2v2h2c2.2,0,4-1.8,4-4V4C32,1.8,30.2,0,28,0z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/coremods.svg b/application/resources/iOS/scalable/coremods.svg
new file mode 100644
index 00000000..ea47872c
--- /dev/null
+++ b/application/resources/iOS/scalable/coremods.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <g id="_x38__2_">
+ <g>
+ <path fill="#3366CC" d="M16,0C7.2,0,0,7.2,0,16c0,8.8,7.2,16,16,16s16-7.2,16-16C32,7.2,24.8,0,16,0z M16,30C8.3,30,2,23.7,2,16
+ C2,8.3,8.3,2,16,2s14,6.3,14,14C30,23.7,23.7,30,16,30z"/>
+ </g>
+ </g>
+ <g>
+ <path fill="#3366CC" d="M21.9,24.8L16,21.5l-5.9,3.3l1.1-6.9l-4.8-4.9l6.6-1l3-6.4l3,6.4l6.6,1l-4.8,4.9L21.9,24.8z M10.6,14.3
+ l2.8,2.8L12.7,21l3.3-1.8l3.3,1.8l-0.6-3.9l2.8-2.8l-3.8-0.6L16,10.3l-1.6,3.5L10.6,14.3z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/externaltools.svg b/application/resources/iOS/scalable/externaltools.svg
new file mode 100644
index 00000000..16e9fa48
--- /dev/null
+++ b/application/resources/iOS/scalable/externaltools.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g id="_x35__5_">
+ <g>
+ <path fill="#3366CC" d="M3,11c0.6,0,1-0.5,1-1l0-4.8l15.2,14.5c0.4,0.4,1,0.4,1.4,0c0.4-0.4,0.4-1,0-1.4L5.6,4L10,4
+ c0.6,0,1-0.5,1-1s-0.4-1-1-1H3C2.5,2,2,2.4,2,3v7C2,10.5,2.4,11,3,11z M26,2H15v2h11c1.1,0,2,0.9,2,2l0,20.1c0,1.1-0.9,2-2,2L6,28
+ c-1.1,0-2-0.9-2-2V15H2v11c0,2.2,2.2,4,4.4,4h19.7c2.2,0,3.9-1.8,3.9-3.9V6.4C30,4.2,28.2,2,26,2z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/instance-settings.svg b/application/resources/iOS/scalable/instance-settings.svg
new file mode 100644
index 00000000..95b8a508
--- /dev/null
+++ b/application/resources/iOS/scalable/instance-settings.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g id="_x32__5_">
+ <g>
+ <path fill="#3366CC" d="M26,24H14.9c-0.4-1.7-2-3-3.9-3s-3.4,1.3-3.9,3H6c-0.6,0-1,0.4-1,1c0,0.6,0.4,1,1,1h1.1c0.4,1.7,2,3,3.9,3
+ s3.4-1.3,3.9-3H26c0.6,0,1-0.4,1-1C27,24.4,26.6,24,26,24z M11,27.4c-1.3,0-2.4-1.1-2.4-2.4c0-1.3,1.1-2.4,2.4-2.4
+ s2.4,1.1,2.4,2.4C13.4,26.3,12.3,27.4,11,27.4z M26,16h-2.1c-0.4-1.7-2-3-3.9-3s-3.4,1.3-3.9,3H6c-0.6,0-1,0.4-1,1
+ c0,0.6,0.4,1,1,1h10.1c0.4,1.7,2,3,3.9,3s3.4-1.3,3.9-3H26c0.6,0,1-0.4,1-1C27,16.4,26.6,16,26,16z M20,19.4
+ c-1.3,0-2.4-1.1-2.4-2.4c0-1.3,1.1-2.4,2.4-2.4s2.4,1.1,2.4,2.4C22.4,18.3,21.3,19.4,20,19.4z M26,8H14.9c-0.4-1.7-2-3-3.9-3
+ S7.6,6.3,7.1,8H6C5.4,8,5,8.4,5,9c0,0.6,0.4,1,1,1h1.1c0.4,1.7,2,3,3.9,3s3.4-1.3,3.9-3H26c0.6,0,1-0.4,1-1C27,8.4,26.6,8,26,8z
+ M11,11.4c-1.3,0-2.4-1.1-2.4-2.4c0-1.3,1.1-2.4,2.4-2.4s2.4,1.1,2.4,2.4C13.4,10.3,12.3,11.4,11,11.4z M28,0H4C1.8,0,0,1.8,0,4
+ v24c0,2.2,1.8,4,4,4h24c2.2,0,4-1.8,4-4V4C32,1.8,30.2,0,28,0z M30,28c0,1.1-0.9,2-2,2H4c-1.1,0-2-0.9-2-2V4c0-1.1,0.9-2,2-2h24
+ c1.1,0,2,0.9,2,2V28z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/jarmods.svg b/application/resources/iOS/scalable/jarmods.svg
new file mode 100644
index 00000000..c4c5ca8c
--- /dev/null
+++ b/application/resources/iOS/scalable/jarmods.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <g>
+ <g>
+ <path fill="#3366CC" d="M20.5,28H9.8L4.2,15.9l0.6-0.5c0.1-0.1,1.9-1.7,4.5-1.8c0.6,0,1,0.4,1.1,0.9c0,0.6-0.4,1-0.9,1.1
+ c-1.1,0.1-2.1,0.6-2.6,0.9l4.4,9.6h8.1l4.7-10.3c0.6-1.6,2.2-2.5,3.9-2.2c1.7,0.3,2.9,1.7,2.8,3.4c-0.2,3.7-2.7,4.8-2.8,4.8
+ c-0.5,0.2-1.1,0-1.3-0.5c-0.2-0.5,0-1.1,0.5-1.3c0,0,1.5-0.7,1.6-3.1c0-0.8-0.7-1.2-1.1-1.2c-0.2,0-1.3-0.2-1.6,0.9l0,0.1
+ L20.5,28z"/>
+ </g>
+ <path fill="#3366CC" d="M29.3,26c-0.6,0-1,0.5-1,1c0,0.9-4.5,2.9-13.1,2.9S2,27.9,2,27c0-0.5,1.5-1.4,4.3-2.1l-0.9-1.9
+ C2.3,23.9,0,25.2,0,27c0,3.4,7.9,5,15.2,5s15.2-1.6,15.2-5C30.3,26.5,29.9,26,29.3,26z"/>
+ <g>
+ <rect x="6.8" y="17.9" fill="#3366CC" width="16.4" height="2"/>
+ </g>
+ <g>
+ <rect x="8.6" y="22" fill="#3366CC" width="13.3" height="2"/>
+ </g>
+ </g>
+ <g>
+ <g>
+ <path fill="#3366CC" d="M17,4.7l0.7,1.5l0.5,1l1.1,0.2l1.7,0.3l-1.3,1.3l-0.7,0.7l0.2,1l0.3,1.8L18,11.6L17,11l-1,0.5l-1.4,0.8
+ l0.3-1.8l0.2-1l-0.7-0.7l-1.3-1.3l1.7-0.3l1.1-0.2l0.5-1L17,4.7 M17,0l-2.5,5.3L9,6.2l4,4.1L12,16.1l5-2.7l5,2.7L21,10.2l4-4.1
+ l-5.5-0.8L17,0L17,0z"/>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/java.svg b/application/resources/iOS/scalable/java.svg
new file mode 100644
index 00000000..8d7c2798
--- /dev/null
+++ b/application/resources/iOS/scalable/java.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <g>
+ <path fill="#3366CC" d="M20.4,28.1H9.8L4.2,15.9l0.6-0.5c0.1-0.1,1.9-1.7,4.4-1.8c0.6,0,1,0.4,1.1,0.9c0,0.6-0.4,1-0.9,1.1
+ c-1.1,0.1-2.1,0.6-2.6,0.9L11,26h8.1l4.7-10.2c0.6-1.6,2.2-2.5,3.9-2.1c1.7,0.3,2.9,1.7,2.8,3.3c-0.2,3.7-2.7,4.8-2.8,4.8
+ c-0.5,0.2-1.1,0-1.3-0.5c-0.2-0.5,0-1.1,0.5-1.3c0,0,1.5-0.7,1.6-3.1c0-0.8-0.7-1.2-1.1-1.2c-0.2,0-1.3-0.2-1.6,0.9l0,0.1
+ L20.4,28.1z"/>
+ </g>
+ <g>
+ <path fill="#3366CC" d="M14.2,14.4c-0.3,0-0.6-0.1-0.8-0.3c-1.9-2.2-3.1-4.8-2.9-6.7c0.2-1.8,2.2-5.3,5.9-7.2
+ C17-0.1,17.6,0,17.9,0.5C18.1,1,18,1.6,17.5,1.9c-3,1.6-4.7,4.5-4.8,5.7c-0.1,1,0.6,3.1,2.4,5.2c0.4,0.4,0.3,1.1-0.1,1.4
+ C14.7,14.3,14.5,14.4,14.2,14.4z"/>
+ </g>
+ <g>
+ <path fill="#3366CC" d="M17.5,16.5c-0.2,0-0.4-0.1-0.6-0.2c-0.4-0.3-0.5-1-0.2-1.4c0.1-0.2,0.3-0.4,0.5-0.6c0.9-0.9,1-1.2,0.6-1.8
+ c-0.1-0.1-0.3-0.4-0.6-0.6c-0.9-0.9-2.2-2.3-2.2-4c0-1.9,2.2-4,7.3-6.8c0.5-0.3,1.1-0.1,1.4,0.4c0.3,0.5,0.1,1.1-0.4,1.4
+ c-5.7,3.1-6.3,4.5-6.3,5c0,0.9,1,1.9,1.6,2.6c0.3,0.3,0.6,0.6,0.8,0.9c1.4,2.1-0.2,3.7-0.9,4.4c-0.1,0.1-0.3,0.2-0.3,0.3
+ C18.2,16.4,17.9,16.5,17.5,16.5z"/>
+ </g>
+ <path fill="#3366CC" d="M29.2,26c-0.6,0-1,0.5-1,1c0,0.9-4.4,2.9-13.1,2.9S2,27.9,2,27c0-0.5,1.4-1.4,4.3-2l-0.9-1.9
+ C2.3,23.9,0,25.2,0,27c0,3.4,7.8,5,15.1,5s15.1-1.6,15.1-5C30.2,26.5,29.7,26,29.2,26z"/>
+ <g>
+ <rect x="6.8" y="18" fill="#3366CC" width="16.4" height="2"/>
+ </g>
+ <g>
+ <rect x="8.6" y="22" fill="#3366CC" width="13.2" height="2"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/loadermods.svg b/application/resources/iOS/scalable/loadermods.svg
new file mode 100644
index 00000000..010efa11
--- /dev/null
+++ b/application/resources/iOS/scalable/loadermods.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <g>
+ <path fill="#3366CC" d="M21.9,24.6L16,21.3l-5.9,3.3l1.1-6.9l-4.8-4.9l6.6-1l3-6.4l3,6.4l6.6,1l-4.8,4.9L21.9,24.6z M10.6,14.2
+ l2.8,2.8l-0.6,3.9L16,19l3.3,1.8L18.7,17l2.8-2.8l-3.8-0.6L16,10.1l-1.6,3.5L10.6,14.2z"/>
+ </g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M28,32H4c-2.2,0-4-1.8-4-4V4c0-2.2,1.8-4,4-4h24c2.2,0,4,1.8,4,4
+ v24C32,30.2,30.2,32,28,32z M30,4c0-1.1-0.9-2-2-2H4C2.9,2,2,2.9,2,4v24c0,1.1,0.9,2,2,2h24c1.1,0,2-0.9,2-2V4z"/>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/log.svg b/application/resources/iOS/scalable/log.svg
new file mode 100644
index 00000000..5d1c7f06
--- /dev/null
+++ b/application/resources/iOS/scalable/log.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g id="_x37__21_">
+ <g>
+ <path fill="#3366CC" d="M28,0c0,0-5.8,1.6-11,3c-0.7,0-1.3,0-2,0C10,1.7,4,0,4,0C1.8,0,0,1.8,0,4v21c0,2.2,1.9,3.3,4,4
+ c0,0,5.4,1.5,11,3h2c5.6-1.5,11-3,11-3c2.1-0.5,4-1.8,4-4V4C32,1.8,30.2,0,28,0z M15,30c-5.5-1.5-11-3-11-3c-1.1-0.3-2-0.9-2-2V4
+ c0-1.1,0.9-2,2-2l11,3V30z M30,25c0,1.1-0.9,1.7-2,2c0,0-5.4,1.5-11,3V5l11-3c1.1,0,2,0.9,2,2V25z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/minecraft.svg b/application/resources/iOS/scalable/minecraft.svg
new file mode 100644
index 00000000..069b4e71
--- /dev/null
+++ b/application/resources/iOS/scalable/minecraft.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#3366CC" d="M16,0L2,7.1v17.8L16,32l14-7.1V7.1L16,0z M26.7,7.7L16,13.1L5.3,7.7L16,2.2L26.7,7.7z M4,9.2l11,5.6v14.4
+ L4,23.7V9.2z M17,29.2V14.8l11-5.6v14.4L17,29.2z"/>
+</svg>
diff --git a/application/resources/iOS/scalable/multimc.svg b/application/resources/iOS/scalable/multimc.svg
new file mode 100644
index 00000000..bc819433
--- /dev/null
+++ b/application/resources/iOS/scalable/multimc.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#3366CC" d="M0,0v32h32V0H0z M30,30H2V5h2v2h2V6h2v3h2V4h2v2h2V5h2v4h2V6h2v2h2V6h2V5h2v1h3V5h1L30,30z"/>
+<g>
+ <path fill="#3366CC" d="M16,18.5c-1.9,1.9-3.8,3.9-6.7,3.9C6.2,22.4,4,20.1,4,17c0-2.9,2.3-5.4,5.5-5.4c2.7,0,4.7,2.2,6.5,3.9
+ c1.9-1.9,3.8-3.9,6.7-3.9c3.1,0,5.3,2.3,5.3,5.4c0,2.9-2.3,5.4-5.5,5.4C19.8,22.4,17.8,20.2,16,18.5z M14.5,17
+ c-1.4-1.3-2.9-3.2-5-3.2c-1.8,0-3.2,1.5-3.2,3.2c0,1.9,1.3,3.2,3.1,3.2C11.5,20.2,13.2,18.4,14.5,17z M25.7,17
+ c0-1.9-1.3-3.2-3.1-3.2c-2.1,0-3.8,1.8-5.1,3.2c1.4,1.3,2.9,3.2,5,3.2C24.3,20.2,25.7,18.7,25.7,17z"/>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/new.svg b/application/resources/iOS/scalable/new.svg
new file mode 100644
index 00000000..9f221580
--- /dev/null
+++ b/application/resources/iOS/scalable/new.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g id="_x31__2_">
+ <g>
+ <path fill="#3366CC" d="M22,15h-5v-5c0-0.6-0.4-1-1-1s-1,0.4-1,1v5h-5c-0.6,0-1,0.4-1,1c0,0.6,0.4,1,1,1h5v5c0,0.6,0.4,1,1,1
+ s1-0.4,1-1v-5h5c0.6,0,1-0.4,1-1C23,15.4,22.6,15,22,15z M28,0H4C1.8,0,0,1.8,0,4v24c0,2.2,1.8,4,4,4h24c2.2,0,4-1.8,4-4V4
+ C32,1.8,30.2,0,28,0z M30,28c0,1.1-0.9,2-2,2H4c-1.1,0-2-0.9-2-2V4c0-1.1,0.9-2,2-2h24c1.1,0,2,0.9,2,2V28z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/news.svg b/application/resources/iOS/scalable/news.svg
new file mode 100644
index 00000000..d3c010bb
--- /dev/null
+++ b/application/resources/iOS/scalable/news.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M26,26H14l-4,6l-4-6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20
+ c3.3,0,6,2.7,6,6v14C32,23.3,29.3,26,26,26z M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v14c0,1.1,0.9,2,2,2h1.3l2.7,4l2.7-4H26
+ c1.1,0,2-0.9,2-2V6z"/>
+ <rect x="8" y="12" fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" width="16" height="2"/>
+ <rect x="8" y="8" fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" width="16" height="2"/>
+ <rect x="8" y="16" fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" width="8" height="2"/>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/notes.svg b/application/resources/iOS/scalable/notes.svg
new file mode 100644
index 00000000..b42ebeef
--- /dev/null
+++ b/application/resources/iOS/scalable/notes.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g id="_x38__21_">
+ <g>
+ <path fill="#3366CC" d="M23,24H9c-0.6,0-1,0.4-1,1c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1C24,24.4,23.6,24,23,24z M26,4h-3V2h-2.7
+ c-0.9-1.2-2.5-2-4.3-2s-3.4,0.8-4.3,2H9v2H6C3.8,4,2,5.8,2,8v20c0,2.2,1.8,4,4,4h20c2.2,0,4-1.8,4-4V8C30,5.8,28.2,4,26,4z M11,4
+ h2.2c0-1.1,1.2-2,2.8-2c1.5,0,2.8,0.9,2.8,2H21v4H11V4z M28,28c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V8c0-1.1,0.9-2,2-2h3v4h14V6h3
+ c1.1,0,2,0.9,2,2V28z M23,19H9c-0.6,0-1,0.4-1,1c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1C24,19.4,23.6,19,23,19z M23,14H9
+ c-0.6,0-1,0.4-1,1c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1C24,14.4,23.6,14,23,14z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/patreon.svg b/application/resources/iOS/scalable/patreon.svg
new file mode 100644
index 00000000..1bd06f4a
--- /dev/null
+++ b/application/resources/iOS/scalable/patreon.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <rect y="0" fill="none" width="32" height="32"/>
+ <path fill="#3366CC" d="M16,0C7.2,0,0,7.2,0,16v16h3.7v-3.7v-5V16C3.7,9.2,9.2,3.7,16,3.7c6.8,0,12.3,5.5,12.3,12.3
+ c0,6.6-5.2,12-11.7,12.3c-2.1,0-3.8-0.4-4.6-0.8v-5.3c1.2,0.8,2.5,1.2,4,1.2c4.1,0,7.3-3.3,7.3-7.3c0-4.1-3.3-7.3-7.3-7.3
+ c-4.1,0-7.3,3.3-7.3,7.3v16h6.7c0.2,0,0.4,0,0.7,0c8.8,0,16-7.2,16-16S24.8,0,16,0z"/>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/proxy.svg b/application/resources/iOS/scalable/proxy.svg
new file mode 100644
index 00000000..f6552281
--- /dev/null
+++ b/application/resources/iOS/scalable/proxy.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#3366CC" d="M25,11c-1.6,0-3,0.7-3.9,1.9l-9.5-6.1C11.9,6.2,12,5.6,12,5c0-2.8-2.2-5-5-5S2,2.2,2,5s2.2,5,5,5
+ c1.4,0,2.7-0.6,3.6-1.5l9.6,6.2C20.1,15.1,20,15.5,20,16c0,0.5,0.1,0.9,0.2,1.4l-9.6,6.2C9.7,22.6,8.4,22,7,22c-2.8,0-5,2.2-5,5
+ s2.2,5,5,5s5-2.2,5-5c0-0.6-0.1-1.2-0.3-1.8l9.5-6.1c0.9,1.1,2.3,1.8,3.8,1.8c2.8,0,5-2.2,5-5S27.8,11,25,11z M7,8C5.3,8,4,6.7,4,5
+ s1.3-3,3-3s3,1.3,3,3S8.7,8,7,8z M7,30c-1.7,0-3-1.3-3-3s1.3-3,3-3s3,1.3,3,3S8.7,30,7,30z M25,19c-1.7,0-3-1.3-3-3s1.3-3,3-3
+ s3,1.3,3,3S26.7,19,25,19z"/>
+</svg>
diff --git a/application/resources/iOS/scalable/quickmods.svg b/application/resources/iOS/scalable/quickmods.svg
new file mode 100644
index 00000000..cd63ba71
--- /dev/null
+++ b/application/resources/iOS/scalable/quickmods.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M28,32H4c-2.2,0-4-1.8-4-4V4c0-2.2,1.8-4,4-4h24c2.2,0,4,1.8,4,4
+ v24C32,30.2,30.2,32,28,32z M30,4c0-1.1-0.9-2-2-2H4C2.9,2,2,2.9,2,4v24c0,1.1,0.9,2,2,2h24c1.1,0,2-0.9,2-2V4z"/>
+ <g>
+ <path fill="#3366CC" d="M10.6,26C9.8,26,9,25.4,9,24.2V7.8C9,6.6,9.8,6,10.6,6c0.4,0,0.7,0.1,1.1,0.3l13,8.2
+ c0.6,0.3,0.9,0.9,0.9,1.5s-0.3,1.1-0.9,1.5l-13,8.2C11.3,25.9,10.9,26,10.6,26z M11,8.3l0,15.4L23.2,16L11,8.3z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/refresh.svg b/application/resources/iOS/scalable/refresh.svg
new file mode 100644
index 00000000..297b79c9
--- /dev/null
+++ b/application/resources/iOS/scalable/refresh.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g id="_x32__8_">
+ <g>
+ <path fill="#3366CC" d="M23.7,2H31c0.6,0,1-0.4,1-1c0-0.6-0.4-1-1-1H21c-0.1,0-1,0-1,1v10c0,0.6,0.4,1,1,1c0.6,0,1-0.4,1-1V3.4
+ c4.7,2.2,8,7.1,8,12.6c0,7.7-6.3,14-14,14C8.3,30,2,23.7,2,16C2,8.9,7.2,3.1,14,2.2v-2C6.1,1.1,0,7.8,0,16c0,8.8,7.2,16,16,16
+ c8.8,0,16-7.2,16-16C32,10,28.7,4.7,23.7,2z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/resourcepacks.svg b/application/resources/iOS/scalable/resourcepacks.svg
new file mode 100644
index 00000000..5b359d63
--- /dev/null
+++ b/application/resources/iOS/scalable/resourcepacks.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g id="_x33__19_">
+ <g>
+ <path fill="#3366CC" d="M28,5h-6V3c0-1.1-0.9-2-2-2h-8c-1.1,0-2,0.9-2,2v2H4C1.8,5,0,6.8,0,9v18c0,2.2,1.8,4,4,4h24
+ c2.2,0,4-1.8,4-4V9C32,6.8,30.2,5,28,5z M12,4c0-0.6,0.4-1,1-1h6c0.6,0,1,0.4,1,1v1h-8V4z M30,27c0,1.1-0.9,2-2,2H4
+ c-1.1,0-2-0.9-2-2V16h10.1c-0.1,0.3-0.1,0.7-0.1,1c0,2.2,1.8,4,4,4s4-1.8,4-4c0-0.3-0.1-0.7-0.1-1H30V27z M14,17
+ c0-0.4,0.1-0.7,0.3-1h3.4c0.2,0.3,0.3,0.6,0.3,1c0,1.1-0.9,2-2,2S14,18.1,14,17z M30,14H2V9c0-1.1,0.9-2,2-2h24c1.1,0,2,0.9,2,2
+ V14z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/screenshots.svg b/application/resources/iOS/scalable/screenshots.svg
new file mode 100644
index 00000000..39ce7b82
--- /dev/null
+++ b/application/resources/iOS/scalable/screenshots.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g id="_x36__21_">
+ <g>
+ <path fill="#3366CC" d="M28,0H4C1.8,0,0,1.8,0,4v24c0,2.2,1.8,4,4,4h24c2.2,0,4-1.8,4-4V4C32,1.8,30.2,0,28,0z M4,30
+ c-1.1,0-2-0.9-2-2v-0.9l7.9-7.1L20,30H4z M30,28c0,1.1-0.9,2-2,2h-5.2l-7.4-7.5L24,14l6,6V28z M30,17.1L24,11l-9.9,10.1L10,17
+ l-8,7.3V4c0-1.1,0.9-2,2-2h24c1.1,0,2,0.9,2,2V17.1z M8,4C5.8,4,4,5.8,4,8s1.8,4,4,4c2.2,0,4-1.8,4-4S10.2,4,8,4z M8,10
+ c-1.1,0-2-0.9-2-2c0-1.1,0.9-2,2-2c1.1,0,2,0.9,2,2C10,9.1,9.1,10,8,10z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/settings.svg b/application/resources/iOS/scalable/settings.svg
new file mode 100644
index 00000000..95b8a508
--- /dev/null
+++ b/application/resources/iOS/scalable/settings.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g id="_x32__5_">
+ <g>
+ <path fill="#3366CC" d="M26,24H14.9c-0.4-1.7-2-3-3.9-3s-3.4,1.3-3.9,3H6c-0.6,0-1,0.4-1,1c0,0.6,0.4,1,1,1h1.1c0.4,1.7,2,3,3.9,3
+ s3.4-1.3,3.9-3H26c0.6,0,1-0.4,1-1C27,24.4,26.6,24,26,24z M11,27.4c-1.3,0-2.4-1.1-2.4-2.4c0-1.3,1.1-2.4,2.4-2.4
+ s2.4,1.1,2.4,2.4C13.4,26.3,12.3,27.4,11,27.4z M26,16h-2.1c-0.4-1.7-2-3-3.9-3s-3.4,1.3-3.9,3H6c-0.6,0-1,0.4-1,1
+ c0,0.6,0.4,1,1,1h10.1c0.4,1.7,2,3,3.9,3s3.4-1.3,3.9-3H26c0.6,0,1-0.4,1-1C27,16.4,26.6,16,26,16z M20,19.4
+ c-1.3,0-2.4-1.1-2.4-2.4c0-1.3,1.1-2.4,2.4-2.4s2.4,1.1,2.4,2.4C22.4,18.3,21.3,19.4,20,19.4z M26,8H14.9c-0.4-1.7-2-3-3.9-3
+ S7.6,6.3,7.1,8H6C5.4,8,5,8.4,5,9c0,0.6,0.4,1,1,1h1.1c0.4,1.7,2,3,3.9,3s3.4-1.3,3.9-3H26c0.6,0,1-0.4,1-1C27,8.4,26.6,8,26,8z
+ M11,11.4c-1.3,0-2.4-1.1-2.4-2.4c0-1.3,1.1-2.4,2.4-2.4s2.4,1.1,2.4,2.4C13.4,10.3,12.3,11.4,11,11.4z M28,0H4C1.8,0,0,1.8,0,4
+ v24c0,2.2,1.8,4,4,4h24c2.2,0,4-1.8,4-4V4C32,1.8,30.2,0,28,0z M30,28c0,1.1-0.9,2-2,2H4c-1.1,0-2-0.9-2-2V4c0-1.1,0.9-2,2-2h24
+ c1.1,0,2,0.9,2,2V28z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/status-bad.svg b/application/resources/iOS/scalable/status-bad.svg
new file mode 100644
index 00000000..4019c8da
--- /dev/null
+++ b/application/resources/iOS/scalable/status-bad.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#3366CC" d="M26,32H6c-3.4,0-6-2.6-6-6V6c0-3.4,2.6-6,6-6h20c3.4,0,6,2.6,6,6v20C32,29.4,29.4,32,26,32z M28,6
+ c0-1.2-0.8-2-2-2H6C4.8,4,4,4.8,4,6v20c0,1.2,0.8,2,2,2h20c1.2,0,2-0.8,2-2V6z M21.6,21.6c-0.8,0.8-2,0.8-2.8,0L16,18.8l-2.8,2.8
+ c-0.8,0.8-2,0.8-2.8,0c-0.8-0.8-0.8-2,0-2.8l2.8-2.8l-2.8-2.8c-0.8-0.8-0.8-2,0-2.8c0.8-0.8,2-0.8,2.8,0l2.8,2.8l2.8-2.8
+ c0.8-0.8,2-0.8,2.8,0s0.8,2,0,2.8L18.8,16l2.8,2.8C22.4,19.6,22.4,20.8,21.6,21.6z"/>
+</svg>
diff --git a/application/resources/iOS/scalable/status-good.svg b/application/resources/iOS/scalable/status-good.svg
new file mode 100644
index 00000000..e1859113
--- /dev/null
+++ b/application/resources/iOS/scalable/status-good.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <path fill="none" d="M26,0H6C2.6,0,0,2.6,0,6v20c0,3.4,2.6,6,6,6h20c3.4,0,6-2.6,6-6V6C32,2.6,29.4,0,26,0z M28,26c0,1.2-0.8,2-2,2
+ H6c-1.2,0-2-0.8-2-2V6c0-1.2,0.8-2,2-2h20c1.2,0,2,0.8,2,2V26z M21,10.4l-7,7l-2.8-2.8c-0.8-0.8-2-0.8-2.8,0s-0.8,2,0,2.8l4.2,4.2
+ c0.8,0.8,2,0.8,2.8,0l8.4-8.4c0.8-0.8,0.8-2,0-2.8S21.8,9.6,21,10.4z"/>
+</g>
+<g>
+ <g>
+ <path fill="#3366CC" d="M26,0H6C2.6,0,0,2.6,0,6v20c0,3.4,2.6,6,6,6h20c3.4,0,6-2.6,6-6V6C32,2.6,29.4,0,26,0z M28,26
+ c0,1.2-0.8,2-2,2H6c-1.2,0-2-0.8-2-2V6c0-1.2,0.8-2,2-2h20c1.2,0,2,0.8,2,2V26z M21,10.4l-7,7l-2.8-2.8c-0.8-0.8-2-0.8-2.8,0
+ s-0.8,2,0,2.8l4.2,4.2c0.8,0.8,2,0.8,2.8,0l8.4-8.4c0.8-0.8,0.8-2,0-2.8S21.8,9.6,21,10.4z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/iOS/scalable/status-yellow.svg b/application/resources/iOS/scalable/status-yellow.svg
new file mode 100644
index 00000000..d8a28e23
--- /dev/null
+++ b/application/resources/iOS/scalable/status-yellow.svg
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Calque_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 32 32"
+ enable-background="new 0 0 32 32"
+ xml:space="preserve"
+ inkscape:version="0.48.5 r10040"
+ width="100%"
+ height="100%"
+ sodipodi:docname="status-yellow.svg"><metadata
+ id="metadata19"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs17" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1680"
+ inkscape:window-height="1030"
+ id="namedview15"
+ showgrid="false"
+ inkscape:zoom="7.375"
+ inkscape:cx="25.957106"
+ inkscape:cy="16"
+ inkscape:window-x="-4"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Calque_1" /><g
+ id="g3"><path
+ fill="#E3A333"
+ d="M26,0H6C2.7,0,0,2.7,0,6v20c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V6C32,2.7,29.3,0,26,0z M28,26 c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h20c1.1,0,2,0.9,2,2V26z"
+ id="path5" /></g><path
+ d="M 6 0 C 2.7 0 0 2.7 0 6 L 0 26 C 0 29.3 2.7 32 6 32 L 26 32 C 29.3 32 32 29.3 32 26 L 32 6 C 32 2.7 29.3 0 26 0 L 6 0 z M 6 4 L 26 4 C 27.1 4 28 4.9 28 6 L 28 26 C 28 27.1 27.1 28 26 28 L 6 28 C 4.9 28 4 27.1 4 26 L 4 6 C 4 4.9 4.9 4 6 4 z "
+ id="path7"
+ style="fill:#3366cc;fill-opacity:1" /><g
+ id="g11"><path
+ fill="#3366CC"
+ d="M6,20c0-5.8,2.4-7.9,5.8-7.9c2,0,3.4,0.7,5.3,1.9c1.6,1,2.5,1.5,3.3,1.5c0.7,0,1.2-0.7,1.3-3.1H26 c0.2,6.1-2.3,8-5.5,8c-2,0-3.5-0.8-5.3-1.9c-1.7-1-2.6-1.6-3.3-1.6c-0.8,0-1.4,0.5-1.6,3.2H6z"
+ id="path13" /></g></svg> \ No newline at end of file
diff --git a/application/resources/iOS/scalable/viewfolder.svg b/application/resources/iOS/scalable/viewfolder.svg
new file mode 100644
index 00000000..0ae0c0b5
--- /dev/null
+++ b/application/resources/iOS/scalable/viewfolder.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g id="_x36__4_">
+ <g>
+ <path fill="#3366CC" d="M28,4H14c0-2.2-1.8-4-4-4H4C1.8,0,0,1.8,0,4v24c0,2.2,1.8,4,4,4h24c2.2,0,4-1.8,4-4V8C32,5.8,30.2,4,28,4z
+ M30,28c0,1.1-0.9,2-2,2H4c-1.1,0-2-0.9-2-2V12h28V28z M30,10H2V4c0-1.1,0.9-2,2-2h6c1.1,0,2,0.9,2,2v2h16c1.1,0,2,0.9,2,2V10z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/instances/brick.png b/application/resources/instances/brick.png
new file mode 100644
index 00000000..0b534366
--- /dev/null
+++ b/application/resources/instances/brick.png
Binary files differ
diff --git a/application/resources/instances/broken.png b/application/resources/instances/broken.png
new file mode 100644
index 00000000..7a80a76e
--- /dev/null
+++ b/application/resources/instances/broken.png
Binary files differ
diff --git a/application/resources/instances/chicken.png b/application/resources/instances/chicken.png
new file mode 100644
index 00000000..f870467a
--- /dev/null
+++ b/application/resources/instances/chicken.png
Binary files differ
diff --git a/application/resources/instances/chicken128.png b/application/resources/instances/chicken128.png
new file mode 100644
index 00000000..71f6dedc
--- /dev/null
+++ b/application/resources/instances/chicken128.png
Binary files differ
diff --git a/application/resources/instances/creeper.png b/application/resources/instances/creeper.png
new file mode 100644
index 00000000..a67ecfc3
--- /dev/null
+++ b/application/resources/instances/creeper.png
Binary files differ
diff --git a/application/resources/instances/creeper128.png b/application/resources/instances/creeper128.png
new file mode 100644
index 00000000..41b7d07d
--- /dev/null
+++ b/application/resources/instances/creeper128.png
Binary files differ
diff --git a/application/resources/instances/derp.png b/application/resources/instances/derp.png
new file mode 100644
index 00000000..4c361942
--- /dev/null
+++ b/application/resources/instances/derp.png
Binary files differ
diff --git a/application/resources/instances/diamond.png b/application/resources/instances/diamond.png
new file mode 100644
index 00000000..376ab901
--- /dev/null
+++ b/application/resources/instances/diamond.png
Binary files differ
diff --git a/application/resources/instances/dirt.png b/application/resources/instances/dirt.png
new file mode 100644
index 00000000..9e19eb8f
--- /dev/null
+++ b/application/resources/instances/dirt.png
Binary files differ
diff --git a/application/resources/instances/enderman.png b/application/resources/instances/enderman.png
new file mode 100644
index 00000000..9f3a72b3
--- /dev/null
+++ b/application/resources/instances/enderman.png
Binary files differ
diff --git a/application/resources/instances/enderpearl.png b/application/resources/instances/enderpearl.png
new file mode 100644
index 00000000..a818eb8e
--- /dev/null
+++ b/application/resources/instances/enderpearl.png
Binary files differ
diff --git a/application/resources/instances/enderpearl128.png b/application/resources/instances/enderpearl128.png
new file mode 100644
index 00000000..0a5bf91a
--- /dev/null
+++ b/application/resources/instances/enderpearl128.png
Binary files differ
diff --git a/application/resources/instances/ftb_glow.png b/application/resources/instances/ftb_glow.png
new file mode 100644
index 00000000..c4e6fd5d
--- /dev/null
+++ b/application/resources/instances/ftb_glow.png
Binary files differ
diff --git a/application/resources/instances/ftb_glow128.png b/application/resources/instances/ftb_glow128.png
new file mode 100644
index 00000000..86632b21
--- /dev/null
+++ b/application/resources/instances/ftb_glow128.png
Binary files differ
diff --git a/application/resources/instances/ftb_logo.png b/application/resources/instances/ftb_logo.png
new file mode 100644
index 00000000..20df7171
--- /dev/null
+++ b/application/resources/instances/ftb_logo.png
Binary files differ
diff --git a/application/resources/instances/ftb_logo128.png b/application/resources/instances/ftb_logo128.png
new file mode 100644
index 00000000..e725b7fe
--- /dev/null
+++ b/application/resources/instances/ftb_logo128.png
Binary files differ
diff --git a/application/resources/instances/gear.png b/application/resources/instances/gear.png
new file mode 100644
index 00000000..da9ba2f9
--- /dev/null
+++ b/application/resources/instances/gear.png
Binary files differ
diff --git a/application/resources/instances/gear128.png b/application/resources/instances/gear128.png
new file mode 100644
index 00000000..75c68a66
--- /dev/null
+++ b/application/resources/instances/gear128.png
Binary files differ
diff --git a/application/resources/instances/gold.png b/application/resources/instances/gold.png
new file mode 100644
index 00000000..9bedda16
--- /dev/null
+++ b/application/resources/instances/gold.png
Binary files differ
diff --git a/application/resources/instances/grass.png b/application/resources/instances/grass.png
new file mode 100644
index 00000000..f1694547
--- /dev/null
+++ b/application/resources/instances/grass.png
Binary files differ
diff --git a/application/resources/instances/herobrine.png b/application/resources/instances/herobrine.png
new file mode 100644
index 00000000..e5460da3
--- /dev/null
+++ b/application/resources/instances/herobrine.png
Binary files differ
diff --git a/application/resources/instances/herobrine128.png b/application/resources/instances/herobrine128.png
new file mode 100644
index 00000000..13f1494c
--- /dev/null
+++ b/application/resources/instances/herobrine128.png
Binary files differ
diff --git a/application/resources/instances/infinity.png b/application/resources/instances/infinity.png
new file mode 100644
index 00000000..bd94a3dc
--- /dev/null
+++ b/application/resources/instances/infinity.png
Binary files differ
diff --git a/application/resources/instances/infinity128.png b/application/resources/instances/infinity128.png
new file mode 100644
index 00000000..226847fb
--- /dev/null
+++ b/application/resources/instances/infinity128.png
Binary files differ
diff --git a/application/resources/instances/instances.qrc b/application/resources/instances/instances.qrc
new file mode 100644
index 00000000..09ae25d0
--- /dev/null
+++ b/application/resources/instances/instances.qrc
@@ -0,0 +1,49 @@
+<!DOCTYPE RCC>
+<RCC version="1.0">
+ <qresource prefix="/icons/instances">
+ <!-- Source: Mojang -->
+ <file alias="brick">brick.png</file>
+ <file alias="diamond">diamond.png</file>
+ <file alias="dirt">dirt.png</file>
+ <file alias="gold">gold.png</file>
+ <file alias="grass">grass.png</file>
+ <file alias="stone">stone.png</file>
+ <file alias="tnt">tnt.png</file>
+ <file alias="iron">iron.png</file>
+ <file alias="planks">planks.png</file>
+
+ <!-- Source: Unknown -->
+ <file alias="derp">derp.png</file>
+ <file alias="enderman">enderman.png</file>
+
+ <!-- Our own. -->
+ <file alias="chicken">chicken128.png</file>
+ <file alias="creeper">creeper128.png</file>
+ <file alias="enderpearl">enderpearl128.png</file>
+ <file alias="ftb-glow">ftb_glow128.png</file>
+ <file alias="ftb-logo">ftb_logo128.png</file>
+ <file alias="gear">gear128.png</file>
+ <file alias="herobrine">herobrine128.png</file>
+ <file alias="infinity">infinity128.png</file>
+ <file alias="magitech">magitech128.png</file>
+ <file alias="meat">meat128.png</file>
+ <file alias="netherstar">netherstar128.png</file>
+ <file alias="skeleton">skeleton128.png</file>
+ <file alias="squarecreeper">squarecreeper128.png</file>
+ <file alias="steve">steve128.png</file>
+ </qresource>
+ <qresource prefix="/icons/badges">
+ <!-- Source: see above -->
+ <file>enderman.png</file>
+ <file>herobrine.png</file>
+ <file>derp.png</file>
+
+ <!-- Update. GPLv2, https://code.google.com/p/gnome-colors/ -->
+ <file>updateavailable.png</file>
+
+ <!-- Source: http://www.iconarchive.com/show/cat-icons-by-fasticon/Cat-Brown-icon.html -->
+ <file>kitten.png</file>
+ <!-- Source: http://www.iconarchive.com/show/crystal-clear-icons-by-everaldo/Filesystem-file-broken-icon.html -->
+ <file>broken.png</file>
+ </qresource>
+</RCC>
diff --git a/application/resources/instances/iron.png b/application/resources/instances/iron.png
new file mode 100644
index 00000000..28960782
--- /dev/null
+++ b/application/resources/instances/iron.png
Binary files differ
diff --git a/application/resources/instances/kitten.png b/application/resources/instances/kitten.png
new file mode 100644
index 00000000..d17661ce
--- /dev/null
+++ b/application/resources/instances/kitten.png
Binary files differ
diff --git a/application/resources/instances/magitech.png b/application/resources/instances/magitech.png
new file mode 100644
index 00000000..6fd8ff60
--- /dev/null
+++ b/application/resources/instances/magitech.png
Binary files differ
diff --git a/application/resources/instances/magitech128.png b/application/resources/instances/magitech128.png
new file mode 100644
index 00000000..0f81a199
--- /dev/null
+++ b/application/resources/instances/magitech128.png
Binary files differ
diff --git a/application/resources/instances/meat.png b/application/resources/instances/meat.png
new file mode 100644
index 00000000..6694859d
--- /dev/null
+++ b/application/resources/instances/meat.png
Binary files differ
diff --git a/application/resources/instances/meat128.png b/application/resources/instances/meat128.png
new file mode 100644
index 00000000..fefc9bf1
--- /dev/null
+++ b/application/resources/instances/meat128.png
Binary files differ
diff --git a/application/resources/instances/netherstar.png b/application/resources/instances/netherstar.png
new file mode 100644
index 00000000..43cb5113
--- /dev/null
+++ b/application/resources/instances/netherstar.png
Binary files differ
diff --git a/application/resources/instances/netherstar128.png b/application/resources/instances/netherstar128.png
new file mode 100644
index 00000000..132085f0
--- /dev/null
+++ b/application/resources/instances/netherstar128.png
Binary files differ
diff --git a/application/resources/instances/planks.png b/application/resources/instances/planks.png
new file mode 100644
index 00000000..7fcf8467
--- /dev/null
+++ b/application/resources/instances/planks.png
Binary files differ
diff --git a/application/resources/instances/skeleton.png b/application/resources/instances/skeleton.png
new file mode 100644
index 00000000..0c8d3505
--- /dev/null
+++ b/application/resources/instances/skeleton.png
Binary files differ
diff --git a/application/resources/instances/skeleton128.png b/application/resources/instances/skeleton128.png
new file mode 100644
index 00000000..55fcf5a9
--- /dev/null
+++ b/application/resources/instances/skeleton128.png
Binary files differ
diff --git a/application/resources/instances/squarecreeper.png b/application/resources/instances/squarecreeper.png
new file mode 100644
index 00000000..b78c4ae0
--- /dev/null
+++ b/application/resources/instances/squarecreeper.png
Binary files differ
diff --git a/application/resources/instances/squarecreeper128.png b/application/resources/instances/squarecreeper128.png
new file mode 100644
index 00000000..c82d8406
--- /dev/null
+++ b/application/resources/instances/squarecreeper128.png
Binary files differ
diff --git a/application/resources/instances/steve.png b/application/resources/instances/steve.png
new file mode 100644
index 00000000..07c6acde
--- /dev/null
+++ b/application/resources/instances/steve.png
Binary files differ
diff --git a/application/resources/instances/steve128.png b/application/resources/instances/steve128.png
new file mode 100644
index 00000000..a07cbd2f
--- /dev/null
+++ b/application/resources/instances/steve128.png
Binary files differ
diff --git a/application/resources/instances/stone.png b/application/resources/instances/stone.png
new file mode 100644
index 00000000..34f9a751
--- /dev/null
+++ b/application/resources/instances/stone.png
Binary files differ
diff --git a/application/resources/instances/tnt.png b/application/resources/instances/tnt.png
new file mode 100644
index 00000000..e40d404d
--- /dev/null
+++ b/application/resources/instances/tnt.png
Binary files differ
diff --git a/application/resources/instances/updateavailable.png b/application/resources/instances/updateavailable.png
new file mode 100644
index 00000000..754005f9
--- /dev/null
+++ b/application/resources/instances/updateavailable.png
Binary files differ
diff --git a/application/resources/multimc.rc b/application/resources/multimc.rc
new file mode 100644
index 00000000..e7340f2a
--- /dev/null
+++ b/application/resources/multimc.rc
@@ -0,0 +1,29 @@
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include <windows.h>
+
+IDI_ICON1 ICON DISCARDABLE "MultiMC.ico"
+1 RT_MANIFEST "MultiMC.manifest"
+
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION 1,0,0,0
+FILEOS VOS_NT_WINDOWS32
+FILETYPE VFT_APP
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "000004b0"
+ BEGIN
+ VALUE "CompanyName", "MultiMC Contributors"
+ VALUE "FileDescription", "MultiMC Launcher"
+ VALUE "FileVersion", "1.0.0.0"
+ VALUE "ProductName", "MultiMC"
+ VALUE "ProductVersion", "5"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0000, 0x04b0 // Unicode
+ END
+END
diff --git a/application/resources/multimc/16x16/about.png b/application/resources/multimc/16x16/about.png
new file mode 100644
index 00000000..a6a986e1
--- /dev/null
+++ b/application/resources/multimc/16x16/about.png
Binary files differ
diff --git a/application/resources/multimc/16x16/bug.png b/application/resources/multimc/16x16/bug.png
new file mode 100644
index 00000000..0c5b78b4
--- /dev/null
+++ b/application/resources/multimc/16x16/bug.png
Binary files differ
diff --git a/application/resources/multimc/16x16/cat.png b/application/resources/multimc/16x16/cat.png
new file mode 100644
index 00000000..e6e31b44
--- /dev/null
+++ b/application/resources/multimc/16x16/cat.png
Binary files differ
diff --git a/application/resources/multimc/16x16/centralmods.png b/application/resources/multimc/16x16/centralmods.png
new file mode 100644
index 00000000..c1b91c76
--- /dev/null
+++ b/application/resources/multimc/16x16/centralmods.png
Binary files differ
diff --git a/application/resources/multimc/16x16/checkupdate.png b/application/resources/multimc/16x16/checkupdate.png
new file mode 100644
index 00000000..f3742058
--- /dev/null
+++ b/application/resources/multimc/16x16/checkupdate.png
Binary files differ
diff --git a/application/resources/multimc/16x16/copy.png b/application/resources/multimc/16x16/copy.png
new file mode 100644
index 00000000..ccaed9e1
--- /dev/null
+++ b/application/resources/multimc/16x16/copy.png
Binary files differ
diff --git a/application/resources/multimc/16x16/coremods.png b/application/resources/multimc/16x16/coremods.png
new file mode 100644
index 00000000..af0f1166
--- /dev/null
+++ b/application/resources/multimc/16x16/coremods.png
Binary files differ
diff --git a/application/resources/multimc/16x16/help.png b/application/resources/multimc/16x16/help.png
new file mode 100644
index 00000000..e6edf6ba
--- /dev/null
+++ b/application/resources/multimc/16x16/help.png
Binary files differ
diff --git a/application/resources/multimc/16x16/instance-settings.png b/application/resources/multimc/16x16/instance-settings.png
new file mode 100644
index 00000000..b916cd24
--- /dev/null
+++ b/application/resources/multimc/16x16/instance-settings.png
Binary files differ
diff --git a/application/resources/multimc/16x16/jarmods.png b/application/resources/multimc/16x16/jarmods.png
new file mode 100644
index 00000000..1a97c9c0
--- /dev/null
+++ b/application/resources/multimc/16x16/jarmods.png
Binary files differ
diff --git a/application/resources/multimc/16x16/loadermods.png b/application/resources/multimc/16x16/loadermods.png
new file mode 100644
index 00000000..b5ab3fce
--- /dev/null
+++ b/application/resources/multimc/16x16/loadermods.png
Binary files differ
diff --git a/application/resources/multimc/16x16/log.png b/application/resources/multimc/16x16/log.png
new file mode 100644
index 00000000..efa2a0b5
--- /dev/null
+++ b/application/resources/multimc/16x16/log.png
Binary files differ
diff --git a/application/resources/multimc/16x16/minecraft.png b/application/resources/multimc/16x16/minecraft.png
new file mode 100644
index 00000000..e9f2f2a5
--- /dev/null
+++ b/application/resources/multimc/16x16/minecraft.png
Binary files differ
diff --git a/application/resources/multimc/16x16/new.png b/application/resources/multimc/16x16/new.png
new file mode 100644
index 00000000..2e56f589
--- /dev/null
+++ b/application/resources/multimc/16x16/new.png
Binary files differ
diff --git a/application/resources/multimc/16x16/news.png b/application/resources/multimc/16x16/news.png
new file mode 100644
index 00000000..872e85db
--- /dev/null
+++ b/application/resources/multimc/16x16/news.png
Binary files differ
diff --git a/application/resources/multimc/16x16/noaccount.png b/application/resources/multimc/16x16/noaccount.png
new file mode 100644
index 00000000..b49bcf36
--- /dev/null
+++ b/application/resources/multimc/16x16/noaccount.png
Binary files differ
diff --git a/application/resources/multimc/16x16/patreon.png b/application/resources/multimc/16x16/patreon.png
new file mode 100644
index 00000000..cde2b326
--- /dev/null
+++ b/application/resources/multimc/16x16/patreon.png
Binary files differ
diff --git a/application/resources/multimc/16x16/refresh.png b/application/resources/multimc/16x16/refresh.png
new file mode 100644
index 00000000..86b6f82c
--- /dev/null
+++ b/application/resources/multimc/16x16/refresh.png
Binary files differ
diff --git a/application/resources/multimc/16x16/resourcepacks.png b/application/resources/multimc/16x16/resourcepacks.png
new file mode 100644
index 00000000..d862f5ca
--- /dev/null
+++ b/application/resources/multimc/16x16/resourcepacks.png
Binary files differ
diff --git a/application/resources/multimc/16x16/screenshots.png b/application/resources/multimc/16x16/screenshots.png
new file mode 100644
index 00000000..460000d4
--- /dev/null
+++ b/application/resources/multimc/16x16/screenshots.png
Binary files differ
diff --git a/application/resources/multimc/16x16/settings.png b/application/resources/multimc/16x16/settings.png
new file mode 100644
index 00000000..b916cd24
--- /dev/null
+++ b/application/resources/multimc/16x16/settings.png
Binary files differ
diff --git a/application/resources/multimc/16x16/status-bad.png b/application/resources/multimc/16x16/status-bad.png
new file mode 100644
index 00000000..5b3f2051
--- /dev/null
+++ b/application/resources/multimc/16x16/status-bad.png
Binary files differ
diff --git a/application/resources/multimc/16x16/status-good.png b/application/resources/multimc/16x16/status-good.png
new file mode 100644
index 00000000..5cbdee81
--- /dev/null
+++ b/application/resources/multimc/16x16/status-good.png
Binary files differ
diff --git a/application/resources/multimc/16x16/status-yellow.png b/application/resources/multimc/16x16/status-yellow.png
new file mode 100644
index 00000000..b25375d1
--- /dev/null
+++ b/application/resources/multimc/16x16/status-yellow.png
Binary files differ
diff --git a/application/resources/multimc/16x16/viewfolder.png b/application/resources/multimc/16x16/viewfolder.png
new file mode 100644
index 00000000..98b8a944
--- /dev/null
+++ b/application/resources/multimc/16x16/viewfolder.png
Binary files differ
diff --git a/application/resources/multimc/22x22/about.png b/application/resources/multimc/22x22/about.png
new file mode 100644
index 00000000..57775e25
--- /dev/null
+++ b/application/resources/multimc/22x22/about.png
Binary files differ
diff --git a/application/resources/multimc/22x22/bug.png b/application/resources/multimc/22x22/bug.png
new file mode 100644
index 00000000..90481bba
--- /dev/null
+++ b/application/resources/multimc/22x22/bug.png
Binary files differ
diff --git a/application/resources/multimc/22x22/cat.png b/application/resources/multimc/22x22/cat.png
new file mode 100644
index 00000000..3ea7ba69
--- /dev/null
+++ b/application/resources/multimc/22x22/cat.png
Binary files differ
diff --git a/application/resources/multimc/22x22/centralmods.png b/application/resources/multimc/22x22/centralmods.png
new file mode 100644
index 00000000..a10f9a2b
--- /dev/null
+++ b/application/resources/multimc/22x22/centralmods.png
Binary files differ
diff --git a/application/resources/multimc/22x22/checkupdate.png b/application/resources/multimc/22x22/checkupdate.png
new file mode 100644
index 00000000..badb200c
--- /dev/null
+++ b/application/resources/multimc/22x22/checkupdate.png
Binary files differ
diff --git a/application/resources/multimc/22x22/copy.png b/application/resources/multimc/22x22/copy.png
new file mode 100644
index 00000000..ea236a24
--- /dev/null
+++ b/application/resources/multimc/22x22/copy.png
Binary files differ
diff --git a/application/resources/multimc/22x22/help.png b/application/resources/multimc/22x22/help.png
new file mode 100644
index 00000000..da79b3e3
--- /dev/null
+++ b/application/resources/multimc/22x22/help.png
Binary files differ
diff --git a/application/resources/multimc/22x22/instance-settings.png b/application/resources/multimc/22x22/instance-settings.png
new file mode 100644
index 00000000..daf56aad
--- /dev/null
+++ b/application/resources/multimc/22x22/instance-settings.png
Binary files differ
diff --git a/application/resources/multimc/22x22/new.png b/application/resources/multimc/22x22/new.png
new file mode 100644
index 00000000..c707fbbf
--- /dev/null
+++ b/application/resources/multimc/22x22/new.png
Binary files differ
diff --git a/application/resources/multimc/22x22/news.png b/application/resources/multimc/22x22/news.png
new file mode 100644
index 00000000..1953bf7b
--- /dev/null
+++ b/application/resources/multimc/22x22/news.png
Binary files differ
diff --git a/application/resources/multimc/22x22/patreon.png b/application/resources/multimc/22x22/patreon.png
new file mode 100644
index 00000000..b6235ad2
--- /dev/null
+++ b/application/resources/multimc/22x22/patreon.png
Binary files differ
diff --git a/application/resources/multimc/22x22/refresh.png b/application/resources/multimc/22x22/refresh.png
new file mode 100644
index 00000000..45b5535c
--- /dev/null
+++ b/application/resources/multimc/22x22/refresh.png
Binary files differ
diff --git a/application/resources/multimc/22x22/screenshots.png b/application/resources/multimc/22x22/screenshots.png
new file mode 100644
index 00000000..6fb42bbd
--- /dev/null
+++ b/application/resources/multimc/22x22/screenshots.png
Binary files differ
diff --git a/application/resources/multimc/22x22/settings.png b/application/resources/multimc/22x22/settings.png
new file mode 100644
index 00000000..daf56aad
--- /dev/null
+++ b/application/resources/multimc/22x22/settings.png
Binary files differ
diff --git a/application/resources/multimc/22x22/status-bad.png b/application/resources/multimc/22x22/status-bad.png
new file mode 100644
index 00000000..2707539e
--- /dev/null
+++ b/application/resources/multimc/22x22/status-bad.png
Binary files differ
diff --git a/application/resources/multimc/22x22/status-good.png b/application/resources/multimc/22x22/status-good.png
new file mode 100644
index 00000000..f55debc3
--- /dev/null
+++ b/application/resources/multimc/22x22/status-good.png
Binary files differ
diff --git a/application/resources/multimc/22x22/status-yellow.png b/application/resources/multimc/22x22/status-yellow.png
new file mode 100644
index 00000000..481eb7f3
--- /dev/null
+++ b/application/resources/multimc/22x22/status-yellow.png
Binary files differ
diff --git a/application/resources/multimc/22x22/viewfolder.png b/application/resources/multimc/22x22/viewfolder.png
new file mode 100644
index 00000000..b645167f
--- /dev/null
+++ b/application/resources/multimc/22x22/viewfolder.png
Binary files differ
diff --git a/application/resources/multimc/24x24/cat.png b/application/resources/multimc/24x24/cat.png
new file mode 100644
index 00000000..c93245f6
--- /dev/null
+++ b/application/resources/multimc/24x24/cat.png
Binary files differ
diff --git a/application/resources/multimc/24x24/coremods.png b/application/resources/multimc/24x24/coremods.png
new file mode 100644
index 00000000..90603d24
--- /dev/null
+++ b/application/resources/multimc/24x24/coremods.png
Binary files differ
diff --git a/application/resources/multimc/24x24/jarmods.png b/application/resources/multimc/24x24/jarmods.png
new file mode 100644
index 00000000..68cb8e9d
--- /dev/null
+++ b/application/resources/multimc/24x24/jarmods.png
Binary files differ
diff --git a/application/resources/multimc/24x24/loadermods.png b/application/resources/multimc/24x24/loadermods.png
new file mode 100644
index 00000000..250a6260
--- /dev/null
+++ b/application/resources/multimc/24x24/loadermods.png
Binary files differ
diff --git a/application/resources/multimc/24x24/log.png b/application/resources/multimc/24x24/log.png
new file mode 100644
index 00000000..fe302053
--- /dev/null
+++ b/application/resources/multimc/24x24/log.png
Binary files differ
diff --git a/application/resources/multimc/24x24/minecraft.png b/application/resources/multimc/24x24/minecraft.png
new file mode 100644
index 00000000..b31177c9
--- /dev/null
+++ b/application/resources/multimc/24x24/minecraft.png
Binary files differ
diff --git a/application/resources/multimc/24x24/noaccount.png b/application/resources/multimc/24x24/noaccount.png
new file mode 100644
index 00000000..ac12437c
--- /dev/null
+++ b/application/resources/multimc/24x24/noaccount.png
Binary files differ
diff --git a/application/resources/multimc/24x24/patreon.png b/application/resources/multimc/24x24/patreon.png
new file mode 100644
index 00000000..c1da080f
--- /dev/null
+++ b/application/resources/multimc/24x24/patreon.png
Binary files differ
diff --git a/application/resources/multimc/24x24/resourcepacks.png b/application/resources/multimc/24x24/resourcepacks.png
new file mode 100644
index 00000000..68359d39
--- /dev/null
+++ b/application/resources/multimc/24x24/resourcepacks.png
Binary files differ
diff --git a/application/resources/multimc/24x24/status-bad.png b/application/resources/multimc/24x24/status-bad.png
new file mode 100644
index 00000000..d1547a47
--- /dev/null
+++ b/application/resources/multimc/24x24/status-bad.png
Binary files differ
diff --git a/application/resources/multimc/24x24/status-good.png b/application/resources/multimc/24x24/status-good.png
new file mode 100644
index 00000000..3545bc4c
--- /dev/null
+++ b/application/resources/multimc/24x24/status-good.png
Binary files differ
diff --git a/application/resources/multimc/24x24/status-yellow.png b/application/resources/multimc/24x24/status-yellow.png
new file mode 100644
index 00000000..dd5fde67
--- /dev/null
+++ b/application/resources/multimc/24x24/status-yellow.png
Binary files differ
diff --git a/application/resources/multimc/256x256/minecraft.png b/application/resources/multimc/256x256/minecraft.png
new file mode 100644
index 00000000..77e3f03e
--- /dev/null
+++ b/application/resources/multimc/256x256/minecraft.png
Binary files differ
diff --git a/application/resources/multimc/32x32/about.png b/application/resources/multimc/32x32/about.png
new file mode 100644
index 00000000..5174c4f1
--- /dev/null
+++ b/application/resources/multimc/32x32/about.png
Binary files differ
diff --git a/application/resources/multimc/32x32/bug.png b/application/resources/multimc/32x32/bug.png
new file mode 100644
index 00000000..ada46653
--- /dev/null
+++ b/application/resources/multimc/32x32/bug.png
Binary files differ
diff --git a/application/resources/multimc/32x32/cat.png b/application/resources/multimc/32x32/cat.png
new file mode 100644
index 00000000..78ff98e9
--- /dev/null
+++ b/application/resources/multimc/32x32/cat.png
Binary files differ
diff --git a/application/resources/multimc/32x32/centralmods.png b/application/resources/multimc/32x32/centralmods.png
new file mode 100644
index 00000000..cd2b8208
--- /dev/null
+++ b/application/resources/multimc/32x32/centralmods.png
Binary files differ
diff --git a/application/resources/multimc/32x32/checkupdate.png b/application/resources/multimc/32x32/checkupdate.png
new file mode 100644
index 00000000..754005f9
--- /dev/null
+++ b/application/resources/multimc/32x32/checkupdate.png
Binary files differ
diff --git a/application/resources/multimc/32x32/copy.png b/application/resources/multimc/32x32/copy.png
new file mode 100644
index 00000000..c137b0f1
--- /dev/null
+++ b/application/resources/multimc/32x32/copy.png
Binary files differ
diff --git a/application/resources/multimc/32x32/coremods.png b/application/resources/multimc/32x32/coremods.png
new file mode 100644
index 00000000..770d695e
--- /dev/null
+++ b/application/resources/multimc/32x32/coremods.png
Binary files differ
diff --git a/application/resources/multimc/32x32/help.png b/application/resources/multimc/32x32/help.png
new file mode 100644
index 00000000..b3854278
--- /dev/null
+++ b/application/resources/multimc/32x32/help.png
Binary files differ
diff --git a/application/resources/multimc/32x32/instance-settings.png b/application/resources/multimc/32x32/instance-settings.png
new file mode 100644
index 00000000..a9c0817c
--- /dev/null
+++ b/application/resources/multimc/32x32/instance-settings.png
Binary files differ
diff --git a/application/resources/multimc/32x32/jarmods.png b/application/resources/multimc/32x32/jarmods.png
new file mode 100644
index 00000000..5cda173a
--- /dev/null
+++ b/application/resources/multimc/32x32/jarmods.png
Binary files differ
diff --git a/application/resources/multimc/32x32/loadermods.png b/application/resources/multimc/32x32/loadermods.png
new file mode 100644
index 00000000..c4ca12e2
--- /dev/null
+++ b/application/resources/multimc/32x32/loadermods.png
Binary files differ
diff --git a/application/resources/multimc/32x32/log.png b/application/resources/multimc/32x32/log.png
new file mode 100644
index 00000000..d620da12
--- /dev/null
+++ b/application/resources/multimc/32x32/log.png
Binary files differ
diff --git a/application/resources/multimc/32x32/minecraft.png b/application/resources/multimc/32x32/minecraft.png
new file mode 100644
index 00000000..816bec98
--- /dev/null
+++ b/application/resources/multimc/32x32/minecraft.png
Binary files differ
diff --git a/application/resources/multimc/32x32/new.png b/application/resources/multimc/32x32/new.png
new file mode 100644
index 00000000..a3555ba4
--- /dev/null
+++ b/application/resources/multimc/32x32/new.png
Binary files differ
diff --git a/application/resources/multimc/32x32/news.png b/application/resources/multimc/32x32/news.png
new file mode 100644
index 00000000..c579fd44
--- /dev/null
+++ b/application/resources/multimc/32x32/news.png
Binary files differ
diff --git a/application/resources/multimc/32x32/noaccount.png b/application/resources/multimc/32x32/noaccount.png
new file mode 100644
index 00000000..a73afc94
--- /dev/null
+++ b/application/resources/multimc/32x32/noaccount.png
Binary files differ
diff --git a/application/resources/multimc/32x32/patreon.png b/application/resources/multimc/32x32/patreon.png
new file mode 100644
index 00000000..f5ae8a5e
--- /dev/null
+++ b/application/resources/multimc/32x32/patreon.png
Binary files differ
diff --git a/application/resources/multimc/32x32/refresh.png b/application/resources/multimc/32x32/refresh.png
new file mode 100644
index 00000000..afa2a9d7
--- /dev/null
+++ b/application/resources/multimc/32x32/refresh.png
Binary files differ
diff --git a/application/resources/multimc/32x32/resourcepacks.png b/application/resources/multimc/32x32/resourcepacks.png
new file mode 100644
index 00000000..c14759ef
--- /dev/null
+++ b/application/resources/multimc/32x32/resourcepacks.png
Binary files differ
diff --git a/application/resources/multimc/32x32/screenshots.png b/application/resources/multimc/32x32/screenshots.png
new file mode 100644
index 00000000..4fcd6224
--- /dev/null
+++ b/application/resources/multimc/32x32/screenshots.png
Binary files differ
diff --git a/application/resources/multimc/32x32/settings.png b/application/resources/multimc/32x32/settings.png
new file mode 100644
index 00000000..a9c0817c
--- /dev/null
+++ b/application/resources/multimc/32x32/settings.png
Binary files differ
diff --git a/application/resources/multimc/32x32/status-bad.png b/application/resources/multimc/32x32/status-bad.png
new file mode 100644
index 00000000..8c2c9d4f
--- /dev/null
+++ b/application/resources/multimc/32x32/status-bad.png
Binary files differ
diff --git a/application/resources/multimc/32x32/status-good.png b/application/resources/multimc/32x32/status-good.png
new file mode 100644
index 00000000..1a805e68
--- /dev/null
+++ b/application/resources/multimc/32x32/status-good.png
Binary files differ
diff --git a/application/resources/multimc/32x32/status-yellow.png b/application/resources/multimc/32x32/status-yellow.png
new file mode 100644
index 00000000..42c68552
--- /dev/null
+++ b/application/resources/multimc/32x32/status-yellow.png
Binary files differ
diff --git a/application/resources/multimc/32x32/viewfolder.png b/application/resources/multimc/32x32/viewfolder.png
new file mode 100644
index 00000000..74ab8fa6
--- /dev/null
+++ b/application/resources/multimc/32x32/viewfolder.png
Binary files differ
diff --git a/application/resources/multimc/48x48/about.png b/application/resources/multimc/48x48/about.png
new file mode 100644
index 00000000..b4ac71b8
--- /dev/null
+++ b/application/resources/multimc/48x48/about.png
Binary files differ
diff --git a/application/resources/multimc/48x48/bug.png b/application/resources/multimc/48x48/bug.png
new file mode 100644
index 00000000..298f9397
--- /dev/null
+++ b/application/resources/multimc/48x48/bug.png
Binary files differ
diff --git a/application/resources/multimc/48x48/cat.png b/application/resources/multimc/48x48/cat.png
new file mode 100644
index 00000000..25912a3c
--- /dev/null
+++ b/application/resources/multimc/48x48/cat.png
Binary files differ
diff --git a/application/resources/multimc/48x48/centralmods.png b/application/resources/multimc/48x48/centralmods.png
new file mode 100644
index 00000000..d927e39b
--- /dev/null
+++ b/application/resources/multimc/48x48/centralmods.png
Binary files differ
diff --git a/application/resources/multimc/48x48/checkupdate.png b/application/resources/multimc/48x48/checkupdate.png
new file mode 100644
index 00000000..2e2c7d6b
--- /dev/null
+++ b/application/resources/multimc/48x48/checkupdate.png
Binary files differ
diff --git a/application/resources/multimc/48x48/copy.png b/application/resources/multimc/48x48/copy.png
new file mode 100644
index 00000000..ea40e34b
--- /dev/null
+++ b/application/resources/multimc/48x48/copy.png
Binary files differ
diff --git a/application/resources/multimc/48x48/help.png b/application/resources/multimc/48x48/help.png
new file mode 100644
index 00000000..82d828fa
--- /dev/null
+++ b/application/resources/multimc/48x48/help.png
Binary files differ
diff --git a/application/resources/multimc/48x48/instance-settings.png b/application/resources/multimc/48x48/instance-settings.png
new file mode 100644
index 00000000..6674eb23
--- /dev/null
+++ b/application/resources/multimc/48x48/instance-settings.png
Binary files differ
diff --git a/application/resources/multimc/48x48/log.png b/application/resources/multimc/48x48/log.png
new file mode 100644
index 00000000..45f60e6b
--- /dev/null
+++ b/application/resources/multimc/48x48/log.png
Binary files differ
diff --git a/application/resources/multimc/48x48/minecraft.png b/application/resources/multimc/48x48/minecraft.png
new file mode 100644
index 00000000..38fc9f6c
--- /dev/null
+++ b/application/resources/multimc/48x48/minecraft.png
Binary files differ
diff --git a/application/resources/multimc/48x48/new.png b/application/resources/multimc/48x48/new.png
new file mode 100644
index 00000000..a81753b3
--- /dev/null
+++ b/application/resources/multimc/48x48/new.png
Binary files differ
diff --git a/application/resources/multimc/48x48/news.png b/application/resources/multimc/48x48/news.png
new file mode 100644
index 00000000..0f82d857
--- /dev/null
+++ b/application/resources/multimc/48x48/news.png
Binary files differ
diff --git a/application/resources/multimc/48x48/noaccount.png b/application/resources/multimc/48x48/noaccount.png
new file mode 100644
index 00000000..4703796c
--- /dev/null
+++ b/application/resources/multimc/48x48/noaccount.png
Binary files differ
diff --git a/application/resources/multimc/48x48/patreon.png b/application/resources/multimc/48x48/patreon.png
new file mode 100644
index 00000000..2708a85a
--- /dev/null
+++ b/application/resources/multimc/48x48/patreon.png
Binary files differ
diff --git a/application/resources/multimc/48x48/refresh.png b/application/resources/multimc/48x48/refresh.png
new file mode 100644
index 00000000..0b08b238
--- /dev/null
+++ b/application/resources/multimc/48x48/refresh.png
Binary files differ
diff --git a/application/resources/multimc/48x48/screenshots.png b/application/resources/multimc/48x48/screenshots.png
new file mode 100644
index 00000000..03c0059f
--- /dev/null
+++ b/application/resources/multimc/48x48/screenshots.png
Binary files differ
diff --git a/application/resources/multimc/48x48/settings.png b/application/resources/multimc/48x48/settings.png
new file mode 100644
index 00000000..6674eb23
--- /dev/null
+++ b/application/resources/multimc/48x48/settings.png
Binary files differ
diff --git a/application/resources/multimc/48x48/status-bad.png b/application/resources/multimc/48x48/status-bad.png
new file mode 100644
index 00000000..41c9cf22
--- /dev/null
+++ b/application/resources/multimc/48x48/status-bad.png
Binary files differ
diff --git a/application/resources/multimc/48x48/status-good.png b/application/resources/multimc/48x48/status-good.png
new file mode 100644
index 00000000..df7cb59b
--- /dev/null
+++ b/application/resources/multimc/48x48/status-good.png
Binary files differ
diff --git a/application/resources/multimc/48x48/status-yellow.png b/application/resources/multimc/48x48/status-yellow.png
new file mode 100644
index 00000000..4f3b11d6
--- /dev/null
+++ b/application/resources/multimc/48x48/status-yellow.png
Binary files differ
diff --git a/application/resources/multimc/48x48/viewfolder.png b/application/resources/multimc/48x48/viewfolder.png
new file mode 100644
index 00000000..0492a736
--- /dev/null
+++ b/application/resources/multimc/48x48/viewfolder.png
Binary files differ
diff --git a/application/resources/multimc/64x64/about.png b/application/resources/multimc/64x64/about.png
new file mode 100644
index 00000000..b83e9269
--- /dev/null
+++ b/application/resources/multimc/64x64/about.png
Binary files differ
diff --git a/application/resources/multimc/64x64/bug.png b/application/resources/multimc/64x64/bug.png
new file mode 100644
index 00000000..156b0315
--- /dev/null
+++ b/application/resources/multimc/64x64/bug.png
Binary files differ
diff --git a/application/resources/multimc/64x64/cat.png b/application/resources/multimc/64x64/cat.png
new file mode 100644
index 00000000..2cc21f80
--- /dev/null
+++ b/application/resources/multimc/64x64/cat.png
Binary files differ
diff --git a/application/resources/multimc/64x64/centralmods.png b/application/resources/multimc/64x64/centralmods.png
new file mode 100644
index 00000000..8831f437
--- /dev/null
+++ b/application/resources/multimc/64x64/centralmods.png
Binary files differ
diff --git a/application/resources/multimc/64x64/checkupdate.png b/application/resources/multimc/64x64/checkupdate.png
new file mode 100644
index 00000000..dd1e29ac
--- /dev/null
+++ b/application/resources/multimc/64x64/checkupdate.png
Binary files differ
diff --git a/application/resources/multimc/64x64/copy.png b/application/resources/multimc/64x64/copy.png
new file mode 100644
index 00000000..d12cf9c8
--- /dev/null
+++ b/application/resources/multimc/64x64/copy.png
Binary files differ
diff --git a/application/resources/multimc/64x64/coremods.png b/application/resources/multimc/64x64/coremods.png
new file mode 100644
index 00000000..668be334
--- /dev/null
+++ b/application/resources/multimc/64x64/coremods.png
Binary files differ
diff --git a/application/resources/multimc/64x64/help.png b/application/resources/multimc/64x64/help.png
new file mode 100644
index 00000000..0f3948c2
--- /dev/null
+++ b/application/resources/multimc/64x64/help.png
Binary files differ
diff --git a/application/resources/multimc/64x64/instance-settings.png b/application/resources/multimc/64x64/instance-settings.png
new file mode 100644
index 00000000..e3ff58fa
--- /dev/null
+++ b/application/resources/multimc/64x64/instance-settings.png
Binary files differ
diff --git a/application/resources/multimc/64x64/jarmods.png b/application/resources/multimc/64x64/jarmods.png
new file mode 100644
index 00000000..55d1a42a
--- /dev/null
+++ b/application/resources/multimc/64x64/jarmods.png
Binary files differ
diff --git a/application/resources/multimc/64x64/loadermods.png b/application/resources/multimc/64x64/loadermods.png
new file mode 100644
index 00000000..24618fd0
--- /dev/null
+++ b/application/resources/multimc/64x64/loadermods.png
Binary files differ
diff --git a/application/resources/multimc/64x64/log.png b/application/resources/multimc/64x64/log.png
new file mode 100644
index 00000000..0f531cdf
--- /dev/null
+++ b/application/resources/multimc/64x64/log.png
Binary files differ
diff --git a/application/resources/multimc/64x64/new.png b/application/resources/multimc/64x64/new.png
new file mode 100644
index 00000000..c3c6796c
--- /dev/null
+++ b/application/resources/multimc/64x64/new.png
Binary files differ
diff --git a/application/resources/multimc/64x64/news.png b/application/resources/multimc/64x64/news.png
new file mode 100644
index 00000000..e306eed3
--- /dev/null
+++ b/application/resources/multimc/64x64/news.png
Binary files differ
diff --git a/application/resources/multimc/64x64/patreon.png b/application/resources/multimc/64x64/patreon.png
new file mode 100644
index 00000000..7b4814ec
--- /dev/null
+++ b/application/resources/multimc/64x64/patreon.png
Binary files differ
diff --git a/application/resources/multimc/64x64/refresh.png b/application/resources/multimc/64x64/refresh.png
new file mode 100644
index 00000000..8373d819
--- /dev/null
+++ b/application/resources/multimc/64x64/refresh.png
Binary files differ
diff --git a/application/resources/multimc/64x64/resourcepacks.png b/application/resources/multimc/64x64/resourcepacks.png
new file mode 100644
index 00000000..fb874e7d
--- /dev/null
+++ b/application/resources/multimc/64x64/resourcepacks.png
Binary files differ
diff --git a/application/resources/multimc/64x64/screenshots.png b/application/resources/multimc/64x64/screenshots.png
new file mode 100644
index 00000000..af18e39c
--- /dev/null
+++ b/application/resources/multimc/64x64/screenshots.png
Binary files differ
diff --git a/application/resources/multimc/64x64/settings.png b/application/resources/multimc/64x64/settings.png
new file mode 100644
index 00000000..e3ff58fa
--- /dev/null
+++ b/application/resources/multimc/64x64/settings.png
Binary files differ
diff --git a/application/resources/multimc/64x64/status-bad.png b/application/resources/multimc/64x64/status-bad.png
new file mode 100644
index 00000000..64060ba0
--- /dev/null
+++ b/application/resources/multimc/64x64/status-bad.png
Binary files differ
diff --git a/application/resources/multimc/64x64/status-good.png b/application/resources/multimc/64x64/status-good.png
new file mode 100644
index 00000000..e862ddcd
--- /dev/null
+++ b/application/resources/multimc/64x64/status-good.png
Binary files differ
diff --git a/application/resources/multimc/64x64/status-yellow.png b/application/resources/multimc/64x64/status-yellow.png
new file mode 100644
index 00000000..3d54d320
--- /dev/null
+++ b/application/resources/multimc/64x64/status-yellow.png
Binary files differ
diff --git a/application/resources/multimc/64x64/viewfolder.png b/application/resources/multimc/64x64/viewfolder.png
new file mode 100644
index 00000000..7d531f9c
--- /dev/null
+++ b/application/resources/multimc/64x64/viewfolder.png
Binary files differ
diff --git a/application/resources/multimc/8x8/noaccount.png b/application/resources/multimc/8x8/noaccount.png
new file mode 100644
index 00000000..466e4c07
--- /dev/null
+++ b/application/resources/multimc/8x8/noaccount.png
Binary files differ
diff --git a/application/resources/multimc/index.theme b/application/resources/multimc/index.theme
new file mode 100644
index 00000000..5f7d3f3f
--- /dev/null
+++ b/application/resources/multimc/index.theme
@@ -0,0 +1,42 @@
+[Icon Theme]
+Name=multimc
+Comment=MultiMC Default Icons
+Inherits=default
+Directories=scalable/apps,8x8,16x16,22x22,24x24,32x32,48x48,scalable
+
+[scalable/apps]
+Size=48
+Type=scalable
+MinSize=1
+MaxSize=512
+Context=Applications
+
+[8x8]
+Size=8
+
+[16x16]
+Size=16
+
+[22x22]
+Size=22
+
+[24x24]
+Size=24
+
+[32x32]
+Size=32
+
+[48x48]
+Size=48
+
+[64x64]
+Size=64
+
+[256x256]
+Size=256
+
+[scalable]
+Size=48
+Type=Scalable
+MinSize=16
+MaxSize=256
diff --git a/application/resources/multimc/multimc.qrc b/application/resources/multimc/multimc.qrc
new file mode 100644
index 00000000..d02d0e0e
--- /dev/null
+++ b/application/resources/multimc/multimc.qrc
@@ -0,0 +1,206 @@
+<!DOCTYPE RCC>
+<RCC version="1.0">
+ <qresource prefix="/icons/multimc">
+ <file>index.theme</file>
+ <!-- Logo. Our own. -->
+ <file>scalable/multimc.svg</file>
+
+ <!-- OK console icon. Our own -->
+ <file>scalable/console.svg</file>
+
+ <!-- ERROR console icon. Our own -->
+ <file>scalable/console_error.svg</file>
+
+ <!-- A proxy icon. Our own. SSSsss -->
+ <file>scalable/proxy.svg</file>
+
+ <!-- Java icon. From Oracle, fixed because it was derpy. -->
+ <file>scalable/java.svg</file>
+
+ <!-- Minecraft icon. Source: http://www.minecraftforum.net/forums/show-your-creation/fan-art/1574882-icon-better-minecraft-icon -->
+ <file>16x16/minecraft.png</file>
+ <file>24x24/minecraft.png</file>
+ <file>32x32/minecraft.png</file>
+ <file>48x48/minecraft.png</file>
+ <file>256x256/minecraft.png</file>
+
+ <!-- About dialog. GPLv2, http://openiconlibrary.sourceforge.net/gallery2/?./Icons/actions/help-contents.png -->
+ <file>16x16/about.png</file>
+ <file>22x22/about.png</file>
+ <file>32x32/about.png</file>
+ <file>48x48/about.png</file>
+ <file>64x64/about.png</file>
+
+ <!-- Report bug. Our own. -->
+ <file>scalable/bug.svg</file>
+ <file>16x16/bug.png</file>
+ <file>22x22/bug.png</file>
+ <file>32x32/bug.png</file>
+ <file>48x48/bug.png</file>
+ <file>64x64/bug.png</file>
+
+ <!-- Screenshots. Our own. -->
+ <!-- frame is adapted and simplified from http://www.wpclipart.com/page_frames/picture_frames/golden_picture_frame.png.html -->
+ <file>16x16/screenshots.png</file>
+ <file>22x22/screenshots.png</file>
+ <file>32x32/screenshots.png</file>
+ <file>48x48/screenshots.png</file>
+ <file>64x64/screenshots.png</file>
+ <file>scalable/screenshots.svg</file>
+
+ <!-- Patron logo. (C) 2014 Patreon, Inc., http://www.patreon.com/toolbox?ftyp=media -->
+ <file>16x16/patreon.png</file>
+ <file>22x22/patreon.png</file>
+ <file>24x24/patreon.png</file>
+ <file>32x32/patreon.png</file>
+ <file>48x48/patreon.png</file>
+ <file>64x64/patreon.png</file>
+
+ <!-- The cat button. Freeware, http://findicons.com/icon/73096/black_cat -->
+ <file>16x16/cat.png</file>
+ <file>22x22/cat.png</file>
+ <file>24x24/cat.png</file>
+ <file>32x32/cat.png</file>
+ <file>48x48/cat.png</file>
+ <file>64x64/cat.png</file>
+
+ <!-- Show mods folder. CC-BY-SA 3.0 http://openiconlibrary.sourceforge.net/gallery2/?./Icons/places/oxygen-style/folder-favorites.png -->
+ <file>scalable/centralmods.svg</file>
+ <file>16x16/centralmods.png</file>
+ <file>22x22/centralmods.png</file>
+ <file>32x32/centralmods.png</file>
+ <file>48x48/centralmods.png</file>
+ <file>64x64/centralmods.png</file>
+
+ <!-- Update. GPLv2, https://code.google.com/p/gnome-colors/ -->
+ <file>scalable/checkupdate.svg</file>
+ <file>16x16/checkupdate.png</file>
+ <file>22x22/checkupdate.png</file>
+ <file>32x32/checkupdate.png</file>
+ <file>48x48/checkupdate.png</file>
+ <file>64x64/checkupdate.png</file>
+
+ <!-- copy instance. CC-BY-SA 3.0, http://openiconlibrary.sourceforge.net/gallery2/?./Icons/actions/edit-copy-6.png -->
+ <file>16x16/copy.png</file>
+ <file>22x22/copy.png</file>
+ <file>32x32/copy.png</file>
+ <file>48x48/copy.png</file>
+ <file>64x64/copy.png</file>
+
+ <!-- Help. CC-BY-SA 3.0, http://openiconlibrary.sourceforge.net/gallery2/?./Icons/actions/help.png -->
+ <file>16x16/help.png</file>
+ <file>22x22/help.png</file>
+ <file>32x32/help.png</file>
+ <file>48x48/help.png</file>
+ <file>64x64/help.png</file>
+
+ <!-- New instance. GPLv2, http://openiconlibrary.sourceforge.net/gallery2/?./Icons/actions/document-new-3.png -->
+ <file>16x16/new.png</file>
+ <file>22x22/new.png</file>
+ <file>32x32/new.png</file>
+ <file>48x48/new.png</file>
+ <file>64x64/new.png</file>
+
+ <!-- Open news. Our own. -->
+ <file>scalable/news.svg</file>
+ <file>16x16/news.png</file>
+ <file>22x22/news.png</file>
+ <file>32x32/news.png</file>
+ <file>48x48/news.png</file>
+ <file>64x64/news.png</file>
+
+ <!-- Bad status. Our own. -->
+ <file>16x16/status-bad.png</file>
+ <file>24x24/status-bad.png</file>
+ <file>22x22/status-bad.png</file>
+ <file>32x32/status-bad.png</file>
+ <file>48x48/status-bad.png</file>
+ <file>64x64/status-bad.png</file>
+
+ <!-- Good status. Our own. -->
+ <file>16x16/status-good.png</file>
+ <file>24x24/status-good.png</file>
+ <file>22x22/status-good.png</file>
+ <file>32x32/status-good.png</file>
+ <file>48x48/status-good.png</file>
+ <file>64x64/status-good.png</file>
+
+ <!-- Yellow status. Whatever that means... Our own. -->
+ <file>16x16/status-yellow.png</file>
+ <file>24x24/status-yellow.png</file>
+ <file>22x22/status-yellow.png</file>
+ <file>32x32/status-yellow.png</file>
+ <file>48x48/status-yellow.png</file>
+ <file>64x64/status-yellow.png</file>
+
+ <!-- Plugin (blue recolor), CC-BY-SA 3.0, Oxygen icons. -->
+ <file>16x16/loadermods.png</file>
+ <file>24x24/loadermods.png</file>
+ <file>32x32/loadermods.png</file>
+ <file>64x64/loadermods.png</file>
+
+ <!-- Plugin (red recolor), CC-BY-SA 3.0, Oxygen icons. -->
+ <file>16x16/jarmods.png</file>
+ <file>24x24/jarmods.png</file>
+ <file>32x32/jarmods.png</file>
+ <file>64x64/jarmods.png</file>
+
+ <!-- Plugin (green original), CC-BY-SA 3.0, Oxygen icons. -->
+ <file>16x16/coremods.png</file>
+ <file>24x24/coremods.png</file>
+ <file>32x32/coremods.png</file>
+ <file>64x64/coremods.png</file>
+
+ <!-- Resource packs, CC-BY-SA 3.0, Oxygen icons. -->
+ <file>16x16/resourcepacks.png</file>
+ <file>24x24/resourcepacks.png</file>
+ <file>32x32/resourcepacks.png</file>
+ <file>64x64/resourcepacks.png</file>
+
+ <!-- Refresh, CC-BY-SA 3.0, Oxygen icons. -->
+ <file>16x16/refresh.png</file>
+ <file>22x22/refresh.png</file>
+ <file>32x32/refresh.png</file>
+ <file>48x48/refresh.png</file>
+ <file>64x64/refresh.png</file>
+
+ <!-- Settings, LGPL-2.1, http://openiconlibrary.sourceforge.net/gallery2/?./Icons/apps/system-settings-3.png -->
+ <file>16x16/settings.png</file>
+ <file>22x22/settings.png</file>
+ <file>32x32/settings.png</file>
+ <file>48x48/settings.png</file>
+ <file>64x64/settings.png</file>
+
+ <!-- Same, used for instance settings -->
+ <file>16x16/instance-settings.png</file>
+ <file>22x22/instance-settings.png</file>
+ <file>32x32/instance-settings.png</file>
+ <file>48x48/instance-settings.png</file>
+ <file>64x64/instance-settings.png</file>
+
+ <!-- View folder. CC-BY-SA 3.0, http://openiconlibrary.sourceforge.net/gallery2/?./Icons/actions/document-open-folder.png -->
+ <file>scalable/viewfolder.svg</file>
+ <file>16x16/viewfolder.png</file>
+ <file>22x22/viewfolder.png</file>
+ <file>32x32/viewfolder.png</file>
+ <file>48x48/viewfolder.png</file>
+ <file>64x64/viewfolder.png</file>
+
+ <!-- Default minecraft skin, desaturated, cutout of head, Mojang -->
+ <file>8x8/noaccount.png</file>
+ <file>16x16/noaccount.png</file>
+ <file>24x24/noaccount.png</file>
+ <file>32x32/noaccount.png</file>
+ <file>48x48/noaccount.png</file>
+
+ <!-- Log file, LGPL, http://www.iconarchive.com/show/crystal-clear-icons-by-everaldo/Mimetype-text-icon.html -->
+ <file>16x16/log.png</file>
+ <file>24x24/log.png</file>
+ <file>32x32/log.png</file>
+ <file>48x48/log.png</file>
+ <file>64x64/log.png</file>
+
+ <!-- placeholder when loading screenshot images -->
+ <file>scalable/screenshot-placeholder.svg</file>
+ </qresource>
+</RCC>
diff --git a/application/resources/multimc/scalable/bug.svg b/application/resources/multimc/scalable/bug.svg
new file mode 100644
index 00000000..178e3c23
--- /dev/null
+++ b/application/resources/multimc/scalable/bug.svg
@@ -0,0 +1,387 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="bug.svg"
+ inkscape:export-filename="/home/peterix/minecraft/src/MultiMC5/resources/multimc/64x64/bug.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4218">
+ <stop
+ id="stop4220"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:0.18222222" />
+ <stop
+ id="stop4222"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4204">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.2;"
+ offset="0"
+ id="stop4206" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4208" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3928">
+ <stop
+ style="stop-color:#ee2200;stop-opacity:1;"
+ offset="0"
+ id="stop3930" />
+ <stop
+ style="stop-color:#5d0000;stop-opacity:1"
+ offset="1"
+ id="stop3932" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3914">
+ <stop
+ style="stop-color:#d41e00;stop-opacity:1;"
+ offset="0"
+ id="stop3916" />
+ <stop
+ style="stop-color:#560000;stop-opacity:1"
+ offset="1"
+ id="stop3918" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter3982"
+ x="-0.1382716"
+ width="1.2765432"
+ y="-0.1382716"
+ height="1.2765432">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.17283951"
+ id="feGaussianBlur3984" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3928"
+ id="radialGradient4007"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1999988,1.6000096,-0.64514251,0.48385298,660.86724,457.21535)"
+ cx="50"
+ cy="1039.8744"
+ fx="50"
+ fy="1039.8744"
+ r="5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3914"
+ id="radialGradient4009"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9840484,3.4721317,-1.0766621,0.61522625,1063.4143,213.8808)"
+ cx="53.469341"
+ cy="1036.8372"
+ fx="53.469341"
+ fy="1036.8372"
+ r="4.0321208" />
+ <filter
+ inkscape:collect="always"
+ id="filter4097">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.55555556"
+ id="feGaussianBlur4099" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter4161">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.12345679"
+ id="feGaussianBlur4163" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3928"
+ id="radialGradient4174"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.195069,-1.6036951,1.3789506,-1.0275877,-1295.4553,2174.0912)"
+ cx="49.742828"
+ cy="1033.5878"
+ fx="49.742828"
+ fy="1033.5878"
+ r="5" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4204"
+ id="linearGradient4212"
+ x1="70.5"
+ y1="1035.3622"
+ x2="69"
+ y2="1036.8622"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4218"
+ id="linearGradient4216"
+ x1="84"
+ y1="1035.3622"
+ x2="85"
+ y2="1034.3622"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-15,-1.5)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3928"
+ id="radialGradient4237"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.195069,-1.6036951,1.3789506,-1.0275877,-1295.4553,2174.0912)"
+ cx="49.742828"
+ cy="1033.5878"
+ fx="49.742828"
+ fy="1033.5878"
+ r="5" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4204"
+ id="linearGradient4239"
+ gradientUnits="userSpaceOnUse"
+ x1="70.5"
+ y1="1035.3622"
+ x2="69"
+ y2="1036.8622" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4218"
+ id="linearGradient4241"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-15,-1.5)"
+ x1="84"
+ y1="1035.3622"
+ x2="85"
+ y2="1034.3622" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-143.08597"
+ inkscape:cy="-12.323554"
+ inkscape:document-units="px"
+ inkscape:current-layer="g3986"
+ showgrid="false"
+ inkscape:window-width="1680"
+ inkscape:window-height="1026"
+ inkscape:window-x="-3"
+ inkscape:window-y="-4"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="4"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1020.3622)">
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4013"
+ d="m 10.25,1022.0497 0,4 -4,4 -4,0 0,2 4,0 0,2 c 2e-6,1.4503 0.117423,2.7742 0.3125,4 l -4.3125,0 0,2 4.75,0 c 0.379006,1.4252 0.851671,2.6914 1.46875,3.7813 l -2.21875,2.2187 0,2 2,0 1.875,-1.875 c 1.218087,1.3481 2.651451,2.2896 4.125,2.9375 l 0,2.9375 2,0 0,-2.25 c 5.000011,1.25 10.000061,-0.7499 10,-3.75 2.599309,0 4.428024,-3.7452 4.0625,-8 l 1.9375,0 0,-2 -2.25,0 c -0.338089,-1.3524 -0.923138,-2.7153 -1.78125,-3.9687 l 2.03125,-2.0313 0,-2 -2,0 -1.875,1.875 c -1.104498,-0.9979 -2.47625,-1.8385 -4.125,-2.5 l 0,-3.375 -2,0 0,2.75 c -1.736548,-0.4618 -3.716809,-0.75 -6,-0.75 l -2,0 0,-4 -2,0 z"
+ style="opacity:0.69037655;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter4097)" />
+ <g
+ id="g3986"
+ transform="matrix(2,0,0,2,-89,-1043.3622)">
+ <rect
+ transform="translate(0,1020.3622)"
+ y="24"
+ x="51"
+ height="3"
+ width="1"
+ id="rect3876"
+ style="fill:#000000;fill-opacity:1;stroke:none" />
+ <rect
+ y="1040.3622"
+ x="45.5"
+ height="1"
+ width="2.5"
+ id="rect3874"
+ style="fill:#000000;fill-opacity:1;stroke:none" />
+ <path
+ transform="translate(0,1020.3622)"
+ inkscape:connector-curvature="0"
+ id="path3878"
+ d="m 46.5,24.5 1,0.5 2,-2 0.5,0 -1,-1 z"
+ style="fill:#000000;stroke:none"
+ sodipodi:nodetypes="cccccc" />
+ <rect
+ transform="translate(0,1020.3622)"
+ y="19"
+ x="58"
+ height="1"
+ width="2"
+ id="rect3870"
+ style="fill:#000000;fill-opacity:1;stroke:none" />
+ <path
+ transform="translate(0,1020.3622)"
+ inkscape:connector-curvature="0"
+ id="path3868"
+ d="M 57,16.5 58.5,15 59,16 57.5,17.5 C 56.533856,16.56406 55.788428,17.105786 57,16.5 z"
+ style="fill:#000000;stroke:none"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ transform="translate(0,1020.3622)"
+ inkscape:connector-curvature="0"
+ id="path3866"
+ d="m 47,18 0,-2 2,-2 2,0 c 0.815212,1.242754 1.053351,2.549628 0,4 -1.239551,0.522502 -2.476067,1.061913 -4,0 z"
+ style="fill:#333333;stroke:none"
+ sodipodi:nodetypes="cccccc" />
+ <rect
+ transform="translate(0,1020.3622)"
+ y="13"
+ x="54"
+ height="2"
+ width="1"
+ id="rect3872"
+ style="fill:#000000;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(0,1020.3622)"
+ y="12"
+ x="49"
+ height="3"
+ width="1"
+ id="rect3880"
+ style="fill:#000000;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(0,1020.3622)"
+ y="16"
+ x="45"
+ height="1"
+ width="3"
+ id="rect3882"
+ style="fill:#000000;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ style="opacity:0.80753138;fill:#1a1a1a;stroke:none;filter:url(#filter3982)"
+ d="m 47.75,1039.1747 0.140625,-2.1562 0.640625,-1.2032 1.125,-0.8125 2.03125,-0.062 -0.21875,3.9375 z"
+ id="path3948"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g4232"
+ transform="translate(-17,5.5)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4165"
+ d="m 68,1028.8622 c 0.803076,1.5119 0.470137,2.7762 0,4 -1.461682,0.7487 -2.788281,0.7094 -4,0 1.5e-5,10 10.000061,9.0001 10,6 3.000056,0 4.000023,-10 -6,-10 z"
+ style="fill:url(#radialGradient4237);fill-opacity:1;stroke:none" />
+ <path
+ style="fill:url(#linearGradient4239);fill-opacity:1;stroke:none"
+ d="m 68,1032.8622 6,6 c 6.1e-5,3.0001 -9.999985,4 -10,-6 1.211719,0.7094 2.538318,0.7487 4,0 z"
+ id="path4194"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4196"
+ d="m 68,1032.8622 5.999942,6 c 3.000056,0 4.000029,-10 -5.999994,-10 0.803076,1.5119 0.470189,2.7762 5.2e-5,4 z"
+ style="fill:url(#linearGradient4241);fill-opacity:1;stroke:none" />
+ </g>
+ <path
+ transform="matrix(1.5,0,0,1.5,-27.5,1011.8622)"
+ d="M 54,16.5 C 54,16.776142 53.776142,17 53.5,17 53.223858,17 53,16.776142 53,16.5 53,16.223858 53.223858,16 53.5,16 c 0.276142,0 0.5,0.223858 0.5,0.5 z"
+ sodipodi:ry="0.5"
+ sodipodi:rx="0.5"
+ sodipodi:cy="16.5"
+ sodipodi:cx="53.5"
+ id="path3936"
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.5,0,0,1.5,-28,1010.8622)"
+ d="M 56,18.5 C 56,18.776142 55.776142,19 55.5,19 55.223858,19 55,18.776142 55,18.5 55,18.223858 55.223858,18 55.5,18 c 0.276142,0 0.5,0.223858 0.5,0.5 z"
+ sodipodi:ry="0.5"
+ sodipodi:rx="0.5"
+ sodipodi:cy="18.5"
+ sodipodi:cx="55.5"
+ id="path3938"
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.5,0,0,1.5,-25,1009.3622)"
+ d="M 50,20.5 C 50,20.776142 49.776142,21 49.5,21 49.223858,21 49,20.776142 49,20.5 49,20.223858 49.223858,20 49.5,20 c 0.276142,0 0.5,0.223858 0.5,0.5 z"
+ sodipodi:ry="0.5"
+ sodipodi:rx="0.5"
+ sodipodi:cy="20.5"
+ sodipodi:cx="49.5"
+ id="path3940"
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.5,0,0,1.5,-26,1008.8622)"
+ d="M 52,22.5 C 52,22.776142 51.776142,23 51.5,23 51.223858,23 51,22.776142 51,22.5 51,22.223858 51.223858,22 51.5,22 c 0.276142,0 0.5,0.223858 0.5,0.5 z"
+ sodipodi:ry="0.5"
+ sodipodi:rx="0.5"
+ sodipodi:cy="22.5"
+ sodipodi:cx="51.5"
+ id="path3942"
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.5,0,0,1.5,-26.5,1009.3622)"
+ d="M 54,23.5 C 54,23.776142 53.776142,24 53.5,24 53.223858,24 53,23.776142 53,23.5 53,23.223858 53.223858,23 53.5,23 c 0.276142,0 0.5,0.223858 0.5,0.5 z"
+ sodipodi:ry="0.5"
+ sodipodi:rx="0.5"
+ sodipodi:cy="23.5"
+ sodipodi:cx="53.5"
+ id="path3944"
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.5,0,0,1.5,-27.5,1010.3622)"
+ d="M 57,20.5 C 57,20.776142 56.776142,21 56.5,21 56.223858,21 56,20.776142 56,20.5 56,20.223858 56.223858,20 56.5,20 c 0.276142,0 0.5,0.223858 0.5,0.5 z"
+ sodipodi:ry="0.5"
+ sodipodi:rx="0.5"
+ sodipodi:cy="20.5"
+ sodipodi:cx="56.5"
+ id="path3946"
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+</svg>
diff --git a/application/resources/multimc/scalable/centralmods.svg b/application/resources/multimc/scalable/centralmods.svg
new file mode 100644
index 00000000..a8b123d0
--- /dev/null
+++ b/application/resources/multimc/scalable/centralmods.svg
@@ -0,0 +1,346 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) --><svg height="128" id="svg2811" inkscape:export-filename="/home/pinheiro/pics/oxygen/scalable/places/folder-bookmarks.png" inkscape:export-xdpi="360" inkscape:export-ydpi="360" inkscape:output_extension="org.inkscape.output.svgz.inkscape" inkscape:version="0.46" sodipodi:docbase="/home/david/oxygen/trunk/scalable/places" sodipodi:docname="folder-bookmarks.svgz" sodipodi:version="0.32" version="1.0" width="128" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <metadata>
+ <rdf:RDF xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <cc:Work rdf:about="">
+ <dc:title></dc:title>
+ <dc:description></dc:description>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>unsorted</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <dc:publisher>
+ <cc:Agent rdf:about="http://www.openclipart.org/">
+ <dc:title>Open Clip Art Library, Source: Oxygen Icons, Source: Oxygen Icons, Source: Oxygen Icons, Source: Oxygen Icons</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title></dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title></dc:title>
+ </cc:Agent>
+ </dc:rights>
+ <dc:date></dc:date>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <cc:license rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/ or http://creativecommons.org/licenses/LGPL/2.1/"/>
+ <dc:language>en</dc:language>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id="defs2813">
+ <linearGradient id="linearGradient3629" inkscape:collect="always">
+ <stop id="stop3631" offset="0" style="stop-color:#ffda36;stop-opacity:1;"/>
+ <stop id="stop3633" offset="1" style="stop-color:#ffda36;stop-opacity:0;"/>
+ </linearGradient>
+ <inkscape:perspective id="perspective99" inkscape:persp3d-origin="64 : 42.666667 : 1" inkscape:vp_x="0 : 64 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_z="128 : 64 : 1" sodipodi:type="inkscape:persp3d"/>
+ <linearGradient gradientTransform="matrix(1.0033808,0,0,1,-8.2378002,8)" gradientUnits="userSpaceOnUse" id="linearGradient3067" x1="122.74438" x2="122.39215" y1="96.721588" y2="20.043535">
+ <stop id="stop3069" offset="0" style="stop-color:#88c4ff;stop-opacity:1;"/>
+ <stop id="stop3077" offset="0.13053299" style="stop-color:#b3d9ff;stop-opacity:1;"/>
+ <stop id="stop3071" offset="0.72006166" style="stop-color:#71A8F5"/>
+ <stop id="stop3073" offset="1" style="stop-color:#508ed9;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient2822">
+ <stop id="stop2824" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop2826" offset="1" style="stop-color:#ffffff;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient gradientTransform="matrix(1.0033404,0,0,1,-8.2374684,8)" gradientUnits="userSpaceOnUse" id="XMLID_9_" x1="71.9995" x2="71.9995" y1="14.2578" y2="19.9583">
+ <stop id="stop46" offset="0.25" style="stop-color:#71a8f5;stop-opacity:0;"/>
+ <stop id="stop48" offset="1" style="stop-color:#0057ae;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient gradientTransform="matrix(1.0033876,0,0,1,1.7561237,8)" gradientUnits="userSpaceOnUse" id="XMLID_8_" x1="72.0005" x2="72.0005" y1="96" y2="20.0005">
+ <stop id="stop35" offset="0" style="stop-color:#cfe7ff;stop-opacity:1;"/>
+ <stop id="stop37" offset="0.5917" style="stop-color:#71A8F5"/>
+ <stop id="stop39" offset="1" style="stop-color:#2C72C7"/>
+ </linearGradient>
+ <filter height="1.768" id="filter2807" inkscape:collect="always" width="1.0512" x="-0.0256" y="-0.384">
+ <feGaussianBlur id="feGaussianBlur2809" inkscape:collect="always" stdDeviation="1.28"/>
+ </filter>
+ <linearGradient gradientTransform="translate(-7.999995,8)" gradientUnits="userSpaceOnUse" id="XMLID_6_" x1="72.0005" x2="72.0005" y1="96" y2="4.882812e-04">
+ <stop id="stop7" offset="0" style="stop-color:#00479E"/>
+ <stop id="stop9" offset="0.0769" style="stop-color:#2C72C7"/>
+ <stop id="stop11" offset="0.58579999" style="stop-color:#6ea1df;stop-opacity:1;"/>
+ <stop id="stop13" offset="0.96450001" style="stop-color:#adcbee;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient gradientTransform="translate(10,0)" gradientUnits="userSpaceOnUse" id="linearGradient2828" inkscape:collect="always" x1="22.413761" x2="22.413761" xlink:href="#linearGradient2822" y1="28.5" y2="34.472866"/>
+ <linearGradient gradientTransform="matrix(1.0033876,0,0,1,-8.2438763,8)" gradientUnits="userSpaceOnUse" id="linearGradient2838" inkscape:collect="always" x1="72.0005" x2="72.0005" xlink:href="#XMLID_8_" y1="96" y2="20.0005"/>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2844">
+ <path d="M 133.86613,100.978 C 133.79288,102.369 132.59585,103.5 131.19913,103.5 L 16.812952,103.5 C 15.415236,103.5 14.2192,102.368 14.145947,100.979 C 14.145947,100.979 10.508666,30.967 10.508666,30.957 C 10.461513,30.301 10.673223,29.685 11.105684,29.22 C 11.539144,28.756 12.140172,28.501 12.799403,28.501 L 135.21268,28.501 C 135.8719,28.501 136.47293,28.756 136.90339,29.219 C 137.33384,29.682 137.54254,30.298 137.49137,30.966 L 133.86613,100.978 z" id="path2846" style="fill:#ff00bf"/>
+ </clipPath>
+ <filter height="1.8302754" id="filter2848" inkscape:collect="always" width="1.0247144" x="-0.012357198" y="-0.41513768">
+ <feGaussianBlur id="feGaussianBlur2850" inkscape:collect="always" stdDeviation="0.65388509"/>
+ </filter>
+ <linearGradient gradientTransform="matrix(1.0033808,0,0,1,-8.2378,8)" gradientUnits="userSpaceOnUse" id="linearGradient3109" inkscape:collect="always" x1="122.74438" x2="122.74438" xlink:href="#linearGradient3067" y1="96.721588" y2="20"/>
+ <linearGradient id="linearGradient3290">
+ <stop id="stop3292" offset="0" style="stop-color:yellow;stop-opacity:1;"/>
+ <stop id="stop3294" offset="1" style="stop-color:#ffb66d;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient3273">
+ <stop id="stop3275" offset="0" style="stop-color:#ffffff;stop-opacity:0.55035973;"/>
+ <stop id="stop3277" offset="1" style="stop-color:#ffffff;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient3291">
+ <stop id="stop3293" offset="0" style="stop-color:black;stop-opacity:1"/>
+ <stop id="stop3295" offset="1" style="stop-color:black;stop-opacity:0"/>
+ </linearGradient>
+ <linearGradient id="linearGradient3638">
+ <stop id="stop3640" offset="0" style="stop-color:#ffffff;stop-opacity:0;"/>
+ <stop id="stop3661" offset="0.06868132" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop3659" offset="0.5" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop3642" offset="1" style="stop-color:#ffffff;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient12948">
+ <stop id="stop12950" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop12952" offset="1" style="stop-color:#c0c0c0;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient1563">
+ <stop id="stop1565" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop1567" offset="1" style="stop-color:white;stop-opacity:0;"/>
+ </linearGradient>
+ <radialGradient cx="41.233166" cy="39.832623" fx="41.409943" fy="44.369892" gradientTransform="matrix(1,0,0,0.75,0,9.9581557)" gradientUnits="userSpaceOnUse" id="radialGradient3673" inkscape:collect="always" r="8.1317282" xlink:href="#linearGradient3309"/>
+ <radialGradient cx="41.233166" cy="39.832623" fx="41.409943" fy="44.369892" gradientTransform="matrix(1,0,0,0.75,0,9.9581557)" gradientUnits="userSpaceOnUse" id="radialGradient3669" inkscape:collect="always" r="8.1317282" xlink:href="#linearGradient3309"/>
+ <filter id="filter3663" inkscape:collect="always">
+ <feGaussianBlur id="feGaussianBlur3665" inkscape:collect="always" stdDeviation="0.24178075"/>
+ </filter>
+ <radialGradient cx="41.233166" cy="39.832623" fx="41.409943" fy="44.369892" gradientTransform="matrix(1,0,0,0.75,0,9.9581557)" gradientUnits="userSpaceOnUse" id="radialGradient3638" inkscape:collect="always" r="8.1317282" xlink:href="#linearGradient3640"/>
+ <radialGradient cx="122.69361" cy="52.672272" fx="122.55822" fy="51.026066" gradientTransform="matrix(1.2538745,-0.4598801,0.2575547,0.7022291,-43.321636,71.69735)" gradientUnits="userSpaceOnUse" id="radialGradient3620" inkscape:collect="always" r="3.1883843" xlink:href="#linearGradient1563"/>
+ <radialGradient cx="121.58587" cy="52.85474" fx="121.58587" fy="52.85474" gradientTransform="matrix(2.2248115,-0.5961364,0.2773621,1.0351295,-163.57967,70.62501)" gradientUnits="userSpaceOnUse" id="radialGradient3618" inkscape:collect="always" r="3.1883843" xlink:href="#linearGradient1563"/>
+ <filter height="1.2126913" id="filter3604" inkscape:collect="always" width="1.2307636" x="-0.11538182" y="-0.10634566">
+ <feGaussianBlur id="feGaussianBlur3606" inkscape:collect="always" stdDeviation="0.25849222"/>
+ </filter>
+ <radialGradient cx="122.69361" cy="52.672272" fx="122.55822" fy="51.026066" gradientTransform="matrix(1.2538745,-0.4598801,0.2575547,0.7022291,-43.321636,71.69735)" gradientUnits="userSpaceOnUse" id="radialGradient3570" inkscape:collect="always" r="3.1883843" xlink:href="#linearGradient1563"/>
+ <filter height="1.3358284" id="filter3564" inkscape:collect="always" width="1.3643636" x="-0.18218182" y="-0.1679142">
+ <feGaussianBlur id="feGaussianBlur3566" inkscape:collect="always" stdDeviation="0.40814561"/>
+ </filter>
+ <radialGradient cx="121.58587" cy="52.85474" fx="121.58587" fy="52.85474" gradientTransform="matrix(2.2248115,-0.5961364,0.2773621,1.0351295,-163.57967,70.62501)" gradientUnits="userSpaceOnUse" id="radialGradient3382" inkscape:collect="always" r="3.1883843" xlink:href="#linearGradient1563"/>
+ <radialGradient cx="64.101562" cy="48.703125" fx="64.101562" fy="48.703125" gradientTransform="matrix(1,0,0,0.6476898,0,17.158608)" gradientUnits="userSpaceOnUse" id="radialGradient3372" inkscape:collect="always" r="56.812496" xlink:href="#linearGradient3309"/>
+ <filter id="filter3362" inkscape:collect="always">
+ <feGaussianBlur id="feGaussianBlur3364" inkscape:collect="always" stdDeviation="0.3785028"/>
+ </filter>
+ <radialGradient cx="26.573795" cy="73.493042" fx="35.587811" fy="102.79941" gradientTransform="matrix(4.6812453,-5.2700969e-7,3.571426e-8,0.3172375,-85.242554,44.725131)" gradientUnits="userSpaceOnUse" id="radialGradient3300" inkscape:collect="always" r="60.700562" xlink:href="#linearGradient3946"/>
+ <filter id="filter3285" inkscape:collect="always">
+ <feGaussianBlur id="feGaussianBlur3287" inkscape:collect="always" stdDeviation="0.26585998"/>
+ </filter>
+ <radialGradient cx="64.35347" cy="106.71302" fx="64.35347" fy="106.71302" gradientTransform="matrix(0.4443044,1.2598841e-8,0,0.1825067,35.563425,89.646593)" gradientUnits="userSpaceOnUse" id="radialGradient3267" inkscape:collect="always" r="60.700505" xlink:href="#linearGradient3946"/>
+ <radialGradient cx="64.07962" cy="66.197433" fx="64.07962" fy="66.197433" gradientTransform="matrix(1,0,0,0.9554688,0,2.9478533)" gradientUnits="userSpaceOnUse" id="radialGradient3263" inkscape:collect="always" r="60.700504" xlink:href="#XMLID_1_"/>
+ <filter id="filter3259" inkscape:collect="always">
+ <feGaussianBlur id="feGaussianBlur3261" inkscape:collect="always" stdDeviation="0.23739589"/>
+ </filter>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient2475" inkscape:collect="always" x1="64.07962" x2="64.07962" xlink:href="#XMLID_1_" y1="-14.227339" y2="120.44466"/>
+ <radialGradient cx="64.35347" cy="98.207405" fx="64.35347" fy="98.207405" gradientTransform="matrix(9.1358439e-2,-2.9656957e-8,4.5207376e-8,0.1392616,58.276716,94.261412)" gradientUnits="userSpaceOnUse" id="radialGradient3956" inkscape:collect="always" r="60.700505" xlink:href="#linearGradient3946"/>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient3934" inkscape:collect="always" spreadMethod="reflect" x1="28.637825" x2="31.289474" xlink:href="#linearGradient3844" y1="120.84999" y2="122.08743"/>
+ <filter id="filter3928" inkscape:collect="always">
+ <feGaussianBlur id="feGaussianBlur3930" inkscape:collect="always" stdDeviation="0.18346262"/>
+ </filter>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient2728" inkscape:collect="always" spreadMethod="reflect" x1="28.637825" x2="31.289474" xlink:href="#linearGradient3844" y1="120.84999" y2="122.08743"/>
+ <filter height="1.3101371" id="filter3838" inkscape:collect="always" width="1.3563383" x="-0.17816916" y="-0.15506857">
+ <feGaussianBlur id="feGaussianBlur3840" inkscape:collect="always" stdDeviation="0.46259975"/>
+ </filter>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient3800" inkscape:collect="always" spreadMethod="reflect" x1="63.948792" x2="67.219337" xlink:href="#linearGradient3363" y1="12.034382" y2="12.034382"/>
+ <filter id="filter3401" inkscape:collect="always">
+ <feGaussianBlur id="feGaussianBlur3403" inkscape:collect="always" stdDeviation="0.11157909"/>
+ </filter>
+ <filter id="filter3391" inkscape:collect="always">
+ <feGaussianBlur id="feGaussianBlur3393" inkscape:collect="always" stdDeviation="0.55939545"/>
+ </filter>
+ <linearGradient gradientTransform="translate(-152,0)" gradientUnits="userSpaceOnUse" id="linearGradient3385" inkscape:collect="always" x1="216.88614" x2="216.88614" xlink:href="#linearGradient3379" y1="122.5867" y2="37.969955"/>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient3369" inkscape:collect="always" x1="177.42397" x2="177.60074" xlink:href="#linearGradient3363" y1="22.377773" y2="93.022789"/>
+ <linearGradient gradientTransform="translate(-37.771032,-0.1213203)" gradientUnits="userSpaceOnUse" id="linearGradient3345" inkscape:collect="always" x1="261.50107" x2="200.17728" xlink:href="#linearGradient1563" y1="77.652245" y2="31.10997"/>
+ <linearGradient gradientTransform="translate(-170.08594,0)" gradientUnits="userSpaceOnUse" id="linearGradient3315" inkscape:collect="always" x1="219.22163" x2="219.22163" xlink:href="#linearGradient3363" y1="28.149843" y2="116.41813"/>
+ <radialGradient cx="69.526619" cy="60.115833" fx="69.526619" fy="60.115833" gradientTransform="matrix(0.5227399,0,-1.554444e-8,0.5266221,349.81061,60.575712)" gradientUnits="userSpaceOnUse" id="radialGradient3304" inkscape:collect="always" r="111.65377" xlink:href="#linearGradient3290"/>
+ <radialGradient cx="69.526619" cy="60.115833" fx="69.526619" fy="89.655701" gradientTransform="matrix(0.9439139,-0.3301918,0.332644,0.9509241,-16.097695,27.249949)" gradientUnits="userSpaceOnUse" id="radialGradient2906" inkscape:collect="always" r="111.65377" xlink:href="#linearGradient3290"/>
+ <linearGradient gradientTransform="matrix(0,1.022977,-1.022977,0,111.9686,137.8125)" gradientUnits="userSpaceOnUse" id="linearGradient3230" inkscape:collect="always" x1="-88.058083" x2="-45.096584" xlink:href="#linearGradient3711" y1="-131.93112" y2="-131.93112"/>
+ <radialGradient cx="343.99899" cy="92" fx="343.99899" fy="92" gradientUnits="userSpaceOnUse" id="radialGradient3228" inkscape:collect="always" r="36" xlink:href="#linearGradient3711"/>
+ <linearGradient gradientTransform="matrix(0,1,-1,0,-39.9985,140.0029)" gradientUnits="userSpaceOnUse" id="linearGradient3226" inkscape:collect="always" x1="-70.002899" x2="-11.91648" xlink:href="#linearGradient26907" y1="-383.9971" y2="-383.9971"/>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient2149" inkscape:collect="always" x1="62.112335" x2="67.887672" xlink:href="#linearGradient3081" y1="90.513916" y2="39.095695"/>
+ <linearGradient gradientUnits="userSpaceOnUse" id="XMLID_4_" x1="64.000504" x2="64.000504" y1="108.8652" y2="92.865196">
+ <stop id="stop7270" offset="0" style="stop-color:#EEEEEC"/>
+ <stop id="stop7272" offset="1" style="stop-color:#FFFFFF"/>
+ </linearGradient>
+ <linearGradient gradientTransform="translate(175.0067,11.74752)" gradientUnits="userSpaceOnUse" id="XMLID_3_" x1="63.9995" x2="63.9995" y1="92.865196" y2="120.8652">
+ <stop id="stop7261" offset="0" style="stop-color:#888A85"/>
+ <stop id="stop7263" offset="0.3226" style="stop-color:#A6A7A3"/>
+ <stop id="stop7265" offset="1" style="stop-color:#EEEEEC"/>
+ </linearGradient>
+ <linearGradient gradientUnits="userSpaceOnUse" id="XMLID_1_" x1="95.693398" x2="32.308601" y1="141.1738" y2="77.789001">
+ <stop id="stop7227" offset="0" style="stop-color:#ffc60a;stop-opacity:1;"/>
+ <stop id="stop7233" offset="1" style="stop-color:#b03b00;stop-opacity:1;"/>
+ </linearGradient>
+ <foreignObject height="1" id="foreignObject7221" requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/" width="1" x="0" y="0">
+ <i:pgfRef xlink:href="#adobe_illustrator_pgf"/>
+ </foreignObject>
+ <linearGradient id="linearGradient5073" inkscape:collect="always">
+ <stop id="stop5075" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop5077" offset="1" style="stop-color:#000000;stop-opacity:0;"/>
+ </linearGradient>
+ <radialGradient cx="80.738739" cy="155.37218" fx="80.738739" fy="177.29686" gradientTransform="matrix(1,0,0,0.111111,0,138.1081)" gradientUnits="userSpaceOnUse" id="radialGradient5079" inkscape:collect="always" r="64.796692" xlink:href="#linearGradient5073"/>
+ <linearGradient id="linearGradient2690">
+ <stop id="stop2692" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop2694" offset="1" style="stop-color:#c0c0c0;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient2684">
+ <stop id="stop2686" offset="0" style="stop-color:#ffffff;stop-opacity:0.55035973;"/>
+ <stop id="stop2688" offset="1" style="stop-color:#ffffff;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient2678">
+ <stop id="stop2680" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop2682" offset="1" style="stop-color:white;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient2668">
+ <stop id="stop2670" offset="0" style="stop-color:#ffffff;stop-opacity:0;"/>
+ <stop id="stop2672" offset="0.06868132" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop2674" offset="0.5" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop2676" offset="1" style="stop-color:#ffffff;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient2662">
+ <stop id="stop2664" offset="0" style="stop-color:yellow;stop-opacity:1;"/>
+ <stop id="stop2666" offset="1" style="stop-color:#f07800;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient3081">
+ <stop id="stop3083" offset="0" style="stop-color:#28691f;stop-opacity:1;"/>
+ <stop id="stop3085" offset="1" style="stop-color:#00bf00;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient gradientTransform="matrix(0,1,-1,0,-39.9985,140.0029)" gradientUnits="userSpaceOnUse" id="linearGradient3711" x1="-84.002403" x2="-23.516129" y1="-383.9971" y2="-383.9975">
+ <stop id="stop3713" offset="0" style="stop-color:white;stop-opacity:1;"/>
+ <stop id="stop3715" offset="1" style="stop-color:white;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient gradientTransform="matrix(0,1,-1,0,-39.9985,140.0029)" gradientUnits="userSpaceOnUse" id="linearGradient26907" x1="-84.002403" x2="-12.0029" y1="-383.9971" y2="-383.9971">
+ <stop id="stop26909" offset="0" style="stop-color:#888a85;stop-opacity:1;"/>
+ <stop id="stop26911" offset="1" style="stop-color:#2e3436;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient3309">
+ <stop id="stop3311" offset="0" style="stop-color:#f4ff3f;stop-opacity:1;"/>
+ <stop id="stop3313" offset="1" style="stop-color:#ffffff;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient3363" inkscape:collect="always">
+ <stop id="stop3365" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop3367" offset="1" style="stop-color:#ffffff;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient3379" inkscape:collect="always">
+ <stop id="stop3381" offset="0" style="stop-color:#fffc07;stop-opacity:1;"/>
+ <stop id="stop3383" offset="1" style="stop-color:#fffc07;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient3844" inkscape:collect="always">
+ <stop id="stop3846" offset="0" style="stop-color:#faff64;stop-opacity:1;"/>
+ <stop id="stop3848" offset="1" style="stop-color:#faff64;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient3946">
+ <stop id="stop3948" offset="0" style="stop-color:#7e0000;stop-opacity:1;"/>
+ <stop id="stop3950" offset="1" style="stop-color:#673400;stop-opacity:0;"/>
+ </linearGradient>
+ <inkscape:perspective id="perspective102" inkscape:persp3d-origin="64 : 42.666667 : 1" inkscape:vp_x="0 : 64 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_z="128 : 64 : 1" sodipodi:type="inkscape:persp3d"/>
+ <linearGradient id="linearGradient3640">
+ <stop id="stop3643" offset="0" style="stop-color:#7e0000;stop-opacity:0.50990099"/>
+ <stop id="stop3645" offset="1" style="stop-color:#673400;stop-opacity:0;"/>
+ </linearGradient>
+ <radialGradient cx="64.07962" cy="66.197433" fx="64.07962" fy="66.197433" gradientTransform="matrix(1,0,0,0.9554688,0,2.9478533)" gradientUnits="userSpaceOnUse" id="radialGradient2810" inkscape:collect="always" r="60.700504" xlink:href="#XMLID_1_"/>
+ <radialGradient cx="69.526619" cy="60.115833" fx="69.526619" fy="89.655701" gradientTransform="matrix(0.9439139,-0.3301918,0.332644,0.9509241,-16.097695,27.249949)" gradientUnits="userSpaceOnUse" id="radialGradient2812" inkscape:collect="always" r="111.65377" xlink:href="#linearGradient3290"/>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient2814" inkscape:collect="always" x1="64.07962" x2="64.07962" xlink:href="#XMLID_1_" y1="-14.227339" y2="120.44466"/>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient2816" inkscape:collect="always" spreadMethod="reflect" x1="63.948792" x2="67.219337" xlink:href="#linearGradient3363" y1="12.034382" y2="12.034382"/>
+ <radialGradient cx="64.101562" cy="48.703125" fx="64.101562" fy="48.703125" gradientTransform="matrix(1,0,0,0.6476898,0,17.158608)" gradientUnits="userSpaceOnUse" id="radialGradient2818" inkscape:collect="always" r="56.812496" xlink:href="#linearGradient3309"/>
+ <radialGradient cx="41.233166" cy="39.832623" fx="41.409943" fy="44.369892" gradientTransform="matrix(1,0,0,0.75,0,9.9581557)" gradientUnits="userSpaceOnUse" id="radialGradient2820" inkscape:collect="always" r="8.1317282" xlink:href="#linearGradient3309"/>
+ <linearGradient gradientTransform="translate(-170.08594,0)" gradientUnits="userSpaceOnUse" id="linearGradient2823" inkscape:collect="always" x1="219.22163" x2="219.22163" xlink:href="#linearGradient3363" y1="28.149843" y2="116.41813"/>
+ <radialGradient cx="41.233166" cy="39.832623" fx="41.409943" fy="44.369892" gradientTransform="matrix(1,0,0,0.75,0,9.9581557)" gradientUnits="userSpaceOnUse" id="radialGradient2825" inkscape:collect="always" r="8.1317282" xlink:href="#linearGradient3309"/>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient2827" inkscape:collect="always" x1="177.42397" x2="177.60074" xlink:href="#linearGradient3363" y1="22.377773" y2="93.022789"/>
+ <linearGradient gradientTransform="translate(-37.771032,-0.1213203)" gradientUnits="userSpaceOnUse" id="linearGradient2829" inkscape:collect="always" x1="261.50107" x2="200.17728" xlink:href="#linearGradient1563" y1="77.652245" y2="31.10997"/>
+ <linearGradient gradientTransform="matrix(0.479981,0,0,0.479981,33.177757,62.637707)" gradientUnits="userSpaceOnUse" id="linearGradient2831" inkscape:collect="always" spreadMethod="reflect" x1="80.100487" x2="77.714729" xlink:href="#linearGradient3273" y1="44.807674" y2="101.4734"/>
+ <radialGradient cx="64.35347" cy="98.207405" fx="64.35347" fy="98.207405" gradientTransform="matrix(9.1358439e-2,-2.9656957e-8,4.5207376e-8,0.1392616,58.276716,94.261412)" gradientUnits="userSpaceOnUse" id="radialGradient2833" inkscape:collect="always" r="60.700505" xlink:href="#linearGradient3946"/>
+ <linearGradient gradientTransform="translate(-152,0)" gradientUnits="userSpaceOnUse" id="linearGradient2835" inkscape:collect="always" x1="216.88614" x2="216.88614" xlink:href="#linearGradient3379" y1="122.5867" y2="37.969955"/>
+ <radialGradient cx="121.58587" cy="52.85474" fx="121.58587" fy="52.85474" gradientTransform="matrix(2.2248115,-0.5961364,0.2773621,1.0351295,-163.57967,70.62501)" gradientUnits="userSpaceOnUse" id="radialGradient2837" inkscape:collect="always" r="3.1883843" xlink:href="#linearGradient1563"/>
+ <radialGradient cx="122.69361" cy="52.672272" fx="122.55822" fy="51.026066" gradientTransform="matrix(1.2538745,-0.4598801,0.2575547,0.7022291,-43.321636,71.69735)" gradientUnits="userSpaceOnUse" id="radialGradient2839" inkscape:collect="always" r="3.1883843" xlink:href="#linearGradient1563"/>
+ <radialGradient cx="121.58587" cy="52.85474" fx="121.58587" fy="52.85474" gradientTransform="matrix(2.2248115,-0.5961364,0.2773621,1.0351295,-163.57967,70.62501)" gradientUnits="userSpaceOnUse" id="radialGradient2841" inkscape:collect="always" r="3.1883843" xlink:href="#linearGradient1563"/>
+ <radialGradient cx="122.69361" cy="52.672272" fx="122.55822" fy="51.026066" gradientTransform="matrix(1.2538745,-0.4598801,0.2575547,0.7022291,-43.321636,71.69735)" gradientUnits="userSpaceOnUse" id="radialGradient2843" inkscape:collect="always" r="3.1883843" xlink:href="#linearGradient1563"/>
+ <linearGradient gradientTransform="translate(-152,0)" gradientUnits="userSpaceOnUse" id="linearGradient2845" inkscape:collect="always" x1="216.88614" x2="216.88614" xlink:href="#linearGradient3379" y1="122.5867" y2="37.969955"/>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient2847" inkscape:collect="always" spreadMethod="reflect" x1="28.637825" x2="31.289474" xlink:href="#linearGradient3844" y1="120.84999" y2="122.08743"/>
+ <radialGradient cx="64.35347" cy="106.71302" fx="64.35347" fy="106.71302" gradientTransform="matrix(0.4443044,1.2598841e-8,0,0.1825067,35.563425,89.646593)" gradientUnits="userSpaceOnUse" id="radialGradient2849" inkscape:collect="always" r="60.700505" xlink:href="#linearGradient3946"/>
+ <radialGradient cx="26.573795" cy="73.493042" fx="35.587811" fy="102.79941" gradientTransform="matrix(4.6812453,-5.2700969e-7,3.571426e-8,0.3172375,-85.242554,44.725131)" gradientUnits="userSpaceOnUse" id="radialGradient2851" inkscape:collect="always" r="60.700562" xlink:href="#linearGradient3946"/>
+ <linearGradient gradientTransform="matrix(0.479981,0,0,0.479981,33.177757,62.637707)" gradientUnits="userSpaceOnUse" id="linearGradient2853" inkscape:collect="always" spreadMethod="reflect" x1="80.100487" x2="77.714729" xlink:href="#linearGradient3273" y1="44.807674" y2="101.4734"/>
+ <linearGradient gradientTransform="translate(-152,0)" gradientUnits="userSpaceOnUse" id="linearGradient2855" inkscape:collect="always" x1="216.88614" x2="216.88614" xlink:href="#linearGradient3379" y1="122.5867" y2="37.969955"/>
+ <radialGradient cx="66.977158" cy="54.133701" fx="66.977158" fy="54.133701" gradientTransform="matrix(1.6011045,0,0,1.0874708,-40.260269,-12.584491)" gradientUnits="userSpaceOnUse" id="radialGradient3635" inkscape:collect="always" r="41.380203" xlink:href="#linearGradient3629"/>
+ <filter id="filter3653" inkscape:collect="always">
+ <feGaussianBlur id="feGaussianBlur3655" inkscape:collect="always" stdDeviation="2.160955"/>
+ </filter>
+ <radialGradient cx="64.111018" cy="72.034855" fx="64.111018" fy="72.034855" gradientTransform="matrix(1,0,0,0.6792004,0,23.108756)" gradientUnits="userSpaceOnUse" id="radialGradient3659" inkscape:collect="always" r="41.380203" xlink:href="#linearGradient3629"/>
+ <radialGradient cx="66.890625" cy="94.021507" fx="66.890625" fy="94.021507" gradientTransform="matrix(1.3950344,0,0,0.9475079,-26.4241,-2.1179212)" gradientUnits="userSpaceOnUse" id="radialGradient3663" inkscape:collect="always" r="41.380203" xlink:href="#linearGradient3629"/>
+ </defs>
+ <sodipodi:namedview bordercolor="#666666" borderlayer="true" borderopacity="1.0" id="base" inkscape:current-layer="layer1" inkscape:cx="1.7230397" inkscape:cy="67.535605" inkscape:document-units="px" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:showpageshadow="true" inkscape:window-height="750" inkscape:window-width="991" inkscape:window-x="45" inkscape:window-y="0" inkscape:zoom="2.34375" pagecolor="#ffffff" showborder="true" showgrid="true">
+ <inkscape:grid enabled="true" id="grid3665" spacingx="4px" spacingy="4px" type="xygrid" visible="true"/>
+ </sodipodi:namedview>
+ <g id="layer1" inkscape:groupmode="layer" inkscape:label="Livello 1">
+ <path d="M 117.983,19 C 117.992,17.35 116.64999,16 114.99999,16 L 44.961007,16 L 38.375006,9.414 C 37.597005,8.636 36.061006,8 34.961,8 L 13.999998,8 C 11.799996,8 9.999999,9.8 9.999999,12 L 9.999999,19 C 9.999999,19 10.999999,104 7,104 L 121,104 C 116.99999,104 117.983,19 117.983,19 z" id="path15" style="fill:url(#XMLID_6_)"/>
+ <g id="g17" style="opacity:0.6;filter:url(#filter2807)" transform="matrix(1.0033404,0,0,1,-8.2374684,8)">
+ <path d="M 132,95.146667 C 132,96.877333 128.4,98.293333 124,98.293333 L 20,98.293333 C 15.6,98.293333 12,96.877333 12,95.146667 C 12,93.416 15.6,92 20,92 L 124,92 C 128.4,92 132,93.416 132,95.146667 z" id="path19"/>
+ </g>
+ <path d="M 124.36598,101.004 C 124.27969,102.652 122.85389,104 121.19831,104 L 6.812906,104 C 5.157329,104 3.731522,102.652 3.644228,101.004 L 0.007982,30.992 C -0.112423,29.347 1.143808,28 2.799384,28 L 125.21183,28 C 126.86741,28 128.11762,29.346 127.9912,30.991 L 124.36598,101.004 z" id="path30" style="opacity:0.9;fill:url(#linearGradient3109);fill-opacity:1"/>
+ <path d="M 10.580094,28 C 10.551086,23.609 10.516087,20.392 10.500078,19 L 10.500078,12 C 10.500078,10.07 12.07033,8.5 14.000627,8.5 L 34.964921,8.5 C 35.937077,8.5 37.339294,9.081 38.026407,9.768 L 44.759457,16.5 L 115.01648,16.5 C 115.68059,16.5 116.30469,16.76 116.77576,17.233 C 117.24683,17.706 117.50487,18.333 117.50087,18.997 C 117.50087,18.997 117.57288,18.925 117.60989,18.888 C 117.48787,19.495 117.47487,21.062 117.44687,25.161 L 117.43687,28 L 117.92894,28 C 117.95994,22.468 117.99995,19 117.99995,19 C 118.00896,17.35 116.66674,16 115.01648,16 L 44.966498,16 L 38.379463,9.414 C 37.60134,8.636 36.065099,8 34.964921,8 L 14.000627,8 C 11.80028,8 10,9.8 10,12 L 10,19 C 10,19 10.041009,22.468 10.073018,28 L 10.580094,28 z" id="path32" style="fill:#5293ee;fill-opacity:1"/>
+ <path d="M 9.8848616,22 C 9.8938916,23.75 9.9029216,25.755 9.9109516,28 L 118.09511,28 C 118.10414,25.755 118.11317,23.75 118.1212,22 L 9.8848616,22 z" id="path50" style="fill:url(#XMLID_9_);opacity:0.5"/>
+ <path clip-path="url(#clipPath2844)" d="M 12.8125,28.5 C 12.153269,28.5 11.52721,28.754751 11.09375,29.21875 C 10.661289,29.68375 10.452847,30.312749 10.5,30.96875 C 10.5,30.968937 10.559992,32.232788 10.5625,32.28125 C 10.647737,31.886257 10.815287,31.518165 11.09375,31.21875 C 11.52721,30.754751 12.153269,30.5 12.8125,30.5 L 135.21875,30.5 C 135.87797,30.500001 136.47579,30.75575 136.90625,31.21875 C 137.18342,31.516877 137.35439,31.883216 137.4375,32.28125 L 137.5,30.96875 C 137.55117,30.30075 137.3367,29.68175 136.90625,29.21875 C 136.47579,28.75575 135.87797,28.500001 135.21875,28.5 L 12.8125,28.5 z" id="path2788" style="fill:url(#linearGradient2828);fill-opacity:1;filter:url(#filter2848)" transform="translate(-10,0)"/>
+ <path d="M 125.21268,28 L 2.799403,28 C 1.143815,28 -0.1124237,29.347 0.007982,30.992 L 3.645263,101.004 C 3.731547,102.652 5.157364,104 6.812952,104 L 121.19913,104 C 122.85472,104 124.28053,102.652 124.36682,101.004 L 127.99106,30.991 C 128.11849,29.346 126.86827,28 125.21268,28 z M 123.86613,100.978 C 123.79288,102.369 122.59585,103.5 121.19913,103.5 L 6.812952,103.5 C 5.415236,103.5 4.2192,102.368 4.145947,100.979 C 4.145947,100.979 0.508666,30.967 0.508666,30.957 C 0.461513,30.301 0.673223,29.685 1.105684,29.22 C 1.539144,28.756 2.140172,28.501 2.799403,28.501 L 125.21268,28.501 C 125.8719,28.501 126.47293,28.756 126.90339,29.219 C 127.33384,29.682 127.54254,30.298 127.49137,30.966 L 123.86613,100.978 z" id="path2836" style="fill:url(#linearGradient2838)"/>
+ <path d="M 65.931929,44.786008 C 55.175741,44.634267 51.043165,70.978907 35.902168,70.978907 L 97.750451,73.3925 C 81.772038,73.3925 79.337655,44.975127 65.931929,44.786008 z" id="path2857" sodipodi:nodetypes="cccs" style="fill:url(#radialGradient3635);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3653)" transform="matrix(1.0562371,0,0,1.0562371,-3.6968591,-4.2252662)"/>
+ <g id="g2758" inkscape:label="Layer 1" transform="matrix(0.6943204,0,0,0.6943204,21.245436,37.651516)">
+ <g id="g3675">
+ <path d="M 64.03125,8.2 C 56.162818,8.2100117 46.828561,34.754451 40.46875,39.3875 C 34.10894,44.020548 5.9844574,44.776082 3.5625,52.2625 C 1.1405426,59.748917 23.465249,76.813524 25.90625,84.29375 C 28.347251,91.77398 20.40967,118.7394 26.78125,123.35625 C 33.15283,127.9731 56.287818,112.02251 64.15625,112.0125 C 72.024682,112.00249 95.202691,127.89555 101.5625,123.2625 C 107.92231,118.62945 99.890544,91.686414 102.3125,84.2 C 104.73446,76.713583 127.03475,59.58648 124.59375,52.10625 C 122.15275,44.626021 94.027829,43.941849 87.65625,39.325 C 81.28467,34.708152 71.899685,8.1899879 64.03125,8.2 z M 64.03125,12.10625 C 64.208046,12.245423 65.56776,12.912264 67.15625,14.85625 C 68.97167,17.077947 71.031426,20.410059 73.0625,23.95 C 75.093573,27.48994 77.113982,31.248819 79.09375,34.5125 C 81.073519,37.776182 82.75512,40.528991 85.40625,42.45 C 88.057376,44.371009 91.18831,45.11637 94.90625,45.98125 C 98.624192,46.846129 102.81606,47.591152 106.8125,48.41875 C 110.80894,49.246347 114.60465,50.166787 117.28125,51.2 C 119.62327,52.104061 120.71845,53.200764 120.90625,53.325 C 120.82618,53.533062 120.57672,54.994782 119.21875,57.10625 C 117.66679,59.519356 115.1453,62.518181 112.40625,65.54375 C 109.66721,68.569316 106.71091,71.652346 104.21875,74.54375 C 101.72659,77.435155 99.632744,79.897501 98.625,83.0125 C 97.617256,86.127495 97.892393,89.334266 98.21875,93.1375 C 98.545107,96.940738 99.114622,101.17466 99.5625,105.23125 C 100.01038,109.28783 100.31178,113.17888 100.15625,116.04375 C 100.02016,118.55052 99.34151,119.89095 99.28125,120.10625 C 99.057443,120.09786 97.552762,120.37027 95.125,119.73125 C 92.350417,119.00093 88.723899,117.49504 85,115.825 C 81.276103,114.15497 77.426259,112.30169 73.90625,110.825 C 70.386242,109.3483 67.4302,108.13334 64.15625,108.1375 C 60.882303,108.14167 57.891241,109.3706 54.375,110.85625 C 50.858761,112.3419 47.032137,114.20799 43.3125,115.8875 C 39.592862,117.567 35.960216,119.05638 33.1875,119.79375 C 30.761373,120.43895 29.286908,120.19088 29.0625,120.2 C 29.004012,119.9864 28.29872,118.6439 28.15625,116.1375 C 27.993428,113.27303 28.281199,109.38271 28.71875,105.325 C 29.156299,101.2673 29.714573,97.035302 30.03125,93.23125 C 30.347928,89.427198 30.609418,86.187425 29.59375,83.075 C 28.578082,79.962573 26.468263,77.522553 23.96875,74.6375 C 21.469238,71.752452 18.527988,68.687339 15.78125,65.66875 C 13.034512,62.650158 10.495601,59.671649 8.9375,57.2625 C 7.5741618,55.154496 7.3592053,53.657399 7.28125,53.45 C 7.2962039,53.537785 8.2681026,52.326785 10.84375,51.325 C 13.517705,50.284977 17.34943,49.350265 21.34375,48.5125 C 25.33807,47.674737 29.534272,46.949339 33.25,46.075 C 36.96573,45.200663 40.103767,44.44025 42.75,42.5125 C 45.396234,40.584748 47.059794,37.812458 49.03125,34.54375 C 51.002705,31.275042 53.009191,27.526347 55.03125,23.98125 C 57.053308,20.436153 59.096493,17.08256 60.90625,14.85625 C 62.489787,12.908229 63.857465,12.244552 64.03125,12.10625 z" id="path3961" style="opacity:1;fill:url(#radialGradient2810);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80851269;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1;filter:url(#filter3259)"/>
+ <path d="M 153.09403,94.713757 C 144.53658,107.09689 92.616372,93.013297 78.414631,98.001518 C 64.21289,102.98974 32.50348,146.4474 18.082028,142.13539 C 3.6605746,137.82337 1.0106378,84.092245 -8.1220219,72.127031 C -17.254681,60.161818 -68.384124,43.433534 -68.739625,28.385431 C -69.095125,13.337327 -18.812666,-5.7867426 -10.255219,-18.169872 C -1.697772,-30.553002 -1.5880954,-84.349316 12.613645,-89.337536 C 26.815387,-94.325757 60.541592,-52.41396 74.963045,-48.101941 C 89.384498,-43.789923 140.58172,-60.30959 149.71438,-48.344376 C 158.84704,-36.379162 129.40853,8.6478227 129.76403,23.695927 C 130.11953,38.74403 161.65148,82.330628 153.09403,94.713757 z" id="path3574" inkscape:flatsided="false" inkscape:randomized="0" inkscape:rounded="0.20136392" sodipodi:arg1="0.60469864" sodipodi:arg2="1.2330172" sodipodi:cx="52.952892" sodipodi:cy="25.510532" sodipodi:r1="121.72647" sodipodi:r2="76.832565" sodipodi:sides="5" sodipodi:type="star" style="opacity:1;fill:url(#radialGradient2812);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80892944;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1" transform="matrix(0.4934214,0.1726044,-0.1726044,0.4934214,42.377875,49.908537)"/>
+ <path d="M 64.03125,8 C 56.162818,8.0100117 46.828561,34.554451 40.46875,39.1875 C 34.10894,43.820548 5.984457,44.576082 3.5625,52.0625 C 1.140543,59.548917 23.465249,76.613524 25.90625,84.09375 C 28.347251,91.57398 20.40967,118.5394 26.78125,123.15625 C 33.15283,127.7731 56.287818,111.82251 64.15625,111.8125 C 72.024682,111.80249 95.202691,127.69555 101.5625,123.0625 C 107.92231,118.42945 99.890544,91.486414 102.3125,84 C 104.73446,76.513583 127.03475,59.38648 124.59375,51.90625 C 122.15275,44.426021 94.027829,43.741849 87.65625,39.125 C 81.28467,34.508152 71.899685,7.9899879 64.03125,8 z M 64.03125,11.90625 C 64.208046,12.045423 65.56776,12.712264 67.15625,14.65625 C 68.97167,16.877947 71.031426,20.210059 73.0625,23.75 C 75.093573,27.28994 77.113982,31.048819 79.09375,34.3125 C 81.073519,37.576182 82.75512,40.328991 85.40625,42.25 C 88.057376,44.171009 91.18831,44.91637 94.90625,45.78125 C 98.624192,46.646129 102.81606,47.391152 106.8125,48.21875 C 110.80894,49.046347 114.60465,49.966787 117.28125,51 C 119.62327,51.904061 120.71845,53.000764 120.90625,53.125 C 120.82618,53.333062 120.57672,54.794782 119.21875,56.90625 C 117.66679,59.319356 115.1453,62.318181 112.40625,65.34375 C 109.66721,68.369316 106.71091,71.452346 104.21875,74.34375 C 101.72659,77.235155 99.632744,79.697501 98.625,82.8125 C 97.617256,85.927495 97.892393,89.134266 98.21875,92.9375 C 98.545107,96.740738 99.114622,100.97466 99.5625,105.03125 C 100.01038,109.08783 100.31178,112.97888 100.15625,115.84375 C 100.02016,118.35052 99.34151,119.69095 99.28125,119.90625 C 99.057443,119.89786 97.552762,120.17027 95.125,119.53125 C 92.350417,118.80093 88.723899,117.29504 85,115.625 C 81.276103,113.95497 77.426259,112.10169 73.90625,110.625 C 70.386242,109.1483 67.4302,107.93334 64.15625,107.9375 C 60.882303,107.94167 57.891241,109.1706 54.375,110.65625 C 50.858761,112.1419 47.032137,114.00799 43.3125,115.6875 C 39.592862,117.367 35.960216,118.85638 33.1875,119.59375 C 30.761373,120.23895 29.286908,119.99088 29.0625,120 C 29.004012,119.7864 28.29872,118.4439 28.15625,115.9375 C 27.993428,113.07303 28.281199,109.18271 28.71875,105.125 C 29.156299,101.0673 29.714573,96.835302 30.03125,93.03125 C 30.347928,89.227198 30.609418,85.987425 29.59375,82.875 C 28.578082,79.762573 26.468263,77.322553 23.96875,74.4375 C 21.469238,71.552452 18.527988,68.487339 15.78125,65.46875 C 13.034512,62.450158 10.495601,59.471649 8.9375,57.0625 C 7.574162,54.954496 7.359205,53.457399 7.28125,53.25 C 7.296204,53.337785 8.268103,52.126785 10.84375,51.125 C 13.517705,50.084977 17.34943,49.150265 21.34375,48.3125 C 25.33807,47.474737 29.534272,46.749339 33.25,45.875 C 36.96573,45.000663 40.103767,44.24025 42.75,42.3125 C 45.396234,40.384748 47.059794,37.612458 49.03125,34.34375 C 51.002705,31.075042 53.009191,27.326347 55.03125,23.78125 C 57.053308,20.236153 59.096493,16.88256 60.90625,14.65625 C 62.489787,12.708229 63.857465,12.044552 64.03125,11.90625 z" id="path2304" style="opacity:1;fill:url(#linearGradient2814);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80851269;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1"/>
+ <path d="M 60.98796,9.471226 C 62.846491,8.2143022 64.889907,8.0204702 67.219338,9.471226 L 64.037358,15.614216 L 60.98796,9.471226 z" id="path3409" sodipodi:nodetypes="cccc" style="fill:url(#linearGradient2816);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3838)"/>
+ <path d="M 64.039064,11.90625 C 63.865274,12.044552 62.497594,12.708229 60.914064,14.65625 C 59.104304,16.88256 57.061124,20.236153 55.039064,23.78125 C 53.017004,27.326347 51.010514,31.075042 49.039064,34.34375 C 47.067604,37.612458 45.404044,40.384748 42.757814,42.3125 C 40.111574,44.24025 36.973544,45.000663 33.257814,45.875 C 29.542084,46.749339 25.345884,47.474737 21.351564,48.3125 C 17.357244,49.150265 13.525514,50.084977 10.851564,51.125 C 8.2759131,52.126785 7.3040131,53.337785 7.2890631,53.25 C 7.3670131,53.457399 7.5819731,54.954496 8.9453131,57.0625 C 10.503414,59.471649 13.042324,62.450158 15.789064,65.46875 C 18.535804,68.487339 21.477054,71.552452 23.976564,74.4375 C 26.476074,77.322553 28.585894,79.762573 29.601564,82.875 C 29.865144,83.682722 30.019904,84.511238 30.132814,85.34375 C 32.540654,85.431079 34.961934,85.5 37.414064,85.5 C 64.456484,85.5 88.974124,80.107134 106.91406,71.34375 C 108.71383,69.370041 110.60784,67.338911 112.41406,65.34375 C 115.15311,62.318181 117.67459,59.319356 119.22656,56.90625 C 120.58453,54.794782 120.83398,53.333062 120.91406,53.125 C 120.72626,53.000764 119.63107,51.904061 117.28906,51 C 114.61246,49.966787 110.81674,49.046347 106.82031,48.21875 C 102.82387,47.391152 98.631994,46.646129 94.914064,45.78125 C 91.196124,44.91637 88.065184,44.171009 85.414064,42.25 C 82.762934,40.328991 81.081334,37.576182 79.101564,34.3125 C 77.121794,31.048819 75.101384,27.28994 73.070314,23.75 C 71.039234,20.210059 68.979484,16.877947 67.164064,14.65625 C 65.575574,12.712264 64.215854,12.045423 64.039064,11.90625 z" id="path3370" style="opacity:1;fill:url(#radialGradient2818);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80892944;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1"/>
+ <path d="M 44.96875,33.9375 L 44.1875,35.21875 C 44.177097,35.219516 44.166653,35.219516 44.15625,35.21875 L 42.8125,36.9375 L 41.53125,38.46875 C 41.521947,38.480223 41.511473,38.490697 41.5,38.5 L 40.03125,39.71875 C 40.021947,39.730223 40.011473,39.740697 40,39.75 L 37.125,41.03125 C 37.115697,41.042723 37.105223,41.053197 37.09375,41.0625 L 33.875,41.96875 L 33.375,45.625 L 35.125,45.21875 L 35.125,45.25 L 39.71875,43.75 L 39.75,43.75 L 42.8125,42.0625 L 42.875,42.03125 L 45.78125,39.09375 L 45.8125,39.0625 L 48.96875,34.03125 L 44.96875,33.9375 z" id="path3667" inkscape:original="M 44.84375 33.71875 L 44 35.09375 L 42.65625 36.8125 L 41.375 38.34375 L 39.90625 39.5625 L 37.03125 40.84375 L 33.6875 41.78125 L 33.09375 45.9375 L 35.1875 45.4375 L 39.8125 43.9375 L 42.96875 42.21875 L 45.96875 39.21875 L 49.375 33.8125 L 44.84375 33.71875 z " inkscape:radius="-0.21269609" sodipodi:type="inkscape:offset" style="opacity:0.64356432;fill:url(#radialGradient2820);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3663)" transform="translate(0,0.3)"/>
+ <path d="M 64.039064,11.90625 C 63.865274,12.044552 62.497594,12.708229 60.914064,14.65625 C 59.104304,16.88256 57.061124,20.236153 55.039064,23.78125 C 53.017004,27.326347 51.010514,31.075042 49.039064,34.34375 C 47.067604,37.612458 45.404044,40.384748 42.757814,42.3125 C 40.111574,44.24025 36.973544,45.000663 33.257814,45.875 C 29.542084,46.749339 25.345884,47.474737 21.351564,48.3125 C 17.357244,49.150265 13.525514,50.084977 10.851564,51.125 C 8.2759131,52.126785 7.3040131,53.337785 7.2890631,53.25 C 7.3670131,53.457399 7.5819731,54.954496 8.9453131,57.0625 C 10.503414,59.471649 13.042324,62.450158 15.789064,65.46875 C 18.535804,68.487339 21.477054,71.552452 23.976564,74.4375 C 26.476074,77.322553 28.585894,79.762573 29.601564,82.875 C 29.865144,83.682722 30.019904,84.511238 30.132814,85.34375 C 32.540654,85.431079 34.961934,85.5 37.414064,85.5 C 64.456484,85.5 88.974124,80.107134 106.91406,71.34375 C 108.71383,69.370041 110.60784,67.338911 112.41406,65.34375 C 115.15311,62.318181 117.67459,59.319356 119.22656,56.90625 C 120.58453,54.794782 120.83398,53.333062 120.91406,53.125 C 120.72626,53.000764 119.63107,51.904061 117.28906,51 C 114.61246,49.966787 110.81674,49.046347 106.82031,48.21875 C 102.82387,47.391152 98.631994,46.646129 94.914064,45.78125 C 91.196124,44.91637 88.065184,44.171009 85.414064,42.25 C 82.762934,40.328991 81.081334,37.576182 79.101564,34.3125 C 77.121794,31.048819 75.101384,27.28994 73.070314,23.75 C 71.039234,20.210059 68.979484,16.877947 67.164064,14.65625 C 65.575574,12.712264 64.215854,12.045423 64.039064,11.90625 z" id="path2910" style="opacity:1;fill:url(#linearGradient2823);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80892944;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1"/>
+ <path d="M 44.96875,33.9375 L 44.1875,35.21875 C 44.177097,35.219516 44.166653,35.219516 44.15625,35.21875 L 42.8125,36.9375 L 41.53125,38.46875 C 41.521947,38.480223 41.511473,38.490697 41.5,38.5 L 40.03125,39.71875 C 40.021947,39.730223 40.011473,39.740697 40,39.75 L 37.125,41.03125 C 37.115697,41.042723 37.105223,41.053197 37.09375,41.0625 L 33.875,41.96875 L 33.375,45.625 L 35.125,45.21875 L 35.125,45.25 L 39.71875,43.75 L 39.75,43.75 L 42.8125,42.0625 L 42.875,42.03125 L 45.78125,39.09375 L 45.8125,39.0625 L 48.96875,34.03125 L 44.96875,33.9375 z" id="path3671" inkscape:original="M 44.84375 33.71875 L 44 35.09375 L 42.65625 36.8125 L 41.375 38.34375 L 39.90625 39.5625 L 37.03125 40.84375 L 33.6875 41.78125 L 33.09375 45.9375 L 35.1875 45.4375 L 39.8125 43.9375 L 42.96875 42.21875 L 45.96875 39.21875 L 49.375 33.8125 L 44.84375 33.71875 z " inkscape:radius="-0.21269609" sodipodi:type="inkscape:offset" style="opacity:0.64356432;fill:url(#radialGradient2825);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3663)" transform="matrix(-1,0,0,1,128.125,0.3)"/>
+ <g id="g3339" transform="translate(-132.29928,0)">
+ <path d="M 196.34375,11.90625 C 196.16996,12.044552 194.80228,12.708229 193.21875,14.65625 C 191.40899,16.88256 189.36581,20.236153 187.34375,23.78125 C 185.32169,27.326347 183.3152,31.075042 181.34375,34.34375 C 179.37229,37.612458 177.70873,40.384748 175.0625,42.3125 C 172.41626,44.24025 169.27823,45.000663 165.5625,45.875 C 161.84677,46.749339 157.65057,47.474737 153.65625,48.3125 C 149.66193,49.150265 145.8302,50.084977 143.15625,51.125 C 140.5806,52.126785 139.6087,53.337785 139.59375,53.25 C 139.62377,53.329884 139.71528,53.638731 139.84375,54.0625 C 140.2595,53.69998 141.25985,52.862595 143.15625,52.125 C 145.8302,51.084977 149.66193,50.150265 153.65625,49.3125 C 157.65057,48.474737 161.84677,47.749339 165.5625,46.875 C 169.27823,46.000663 172.41626,45.24025 175.0625,43.3125 C 177.70873,41.384748 179.37229,38.612458 181.34375,35.34375 C 183.3152,32.075042 185.32169,28.326347 187.34375,24.78125 C 189.36581,21.236153 191.40899,17.88256 193.21875,15.65625 C 194.80228,13.708229 196.16996,13.044552 196.34375,12.90625 C 196.52054,13.045423 197.88026,13.712264 199.46875,15.65625 C 201.28417,17.877947 203.34392,21.210059 205.375,24.75 C 207.40607,28.28994 209.42648,32.048819 211.40625,35.3125 C 213.38602,38.576182 215.06762,41.328991 217.71875,43.25 C 220.36987,45.171009 223.50081,45.91637 227.21875,46.78125 C 230.93668,47.646129 235.12856,48.391152 239.125,49.21875 C 243.12143,50.046347 246.91715,50.966787 249.59375,52 C 251.51448,52.74144 252.56925,53.579608 253,53.9375 C 253.13371,53.522484 253.18802,53.204851 253.21875,53.125 C 253.03095,53.000764 251.93576,51.904061 249.59375,51 C 246.91715,49.966787 243.12143,49.046347 239.125,48.21875 C 235.12856,47.391152 230.93668,46.646129 227.21875,45.78125 C 223.50081,44.91637 220.36987,44.171009 217.71875,42.25 C 215.06762,40.328991 213.38602,37.576182 211.40625,34.3125 C 209.42648,31.048819 207.40607,27.28994 205.375,23.75 C 203.34392,20.210059 201.28417,16.877947 199.46875,14.65625 C 197.88026,12.712264 196.52054,12.045423 196.34375,11.90625 z" id="path3317" style="opacity:1;fill:url(#linearGradient2827);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80892944;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1"/>
+ <path d="M 246.78125,49.937636 C 247.42469,50.142466 248.03845,50.379526 248.59375,50.593886 C 250.93576,51.497946 252.03095,52.594656 252.21875,52.718886 C 252.13867,52.926956 251.88922,54.388676 250.53125,56.500136 C 248.97928,58.913246 246.4578,61.912066 243.71875,64.937636 C 241.91253,66.932796 240.01852,68.963926 238.21875,70.937636 C 220.27881,79.701026 195.76117,85.093886 168.71875,85.093886 C 166.59433,85.093886 164.49568,85.039506 162.40625,84.968886 C 162.4184,85.051736 162.42625,85.135936 162.4375,85.218886 C 164.84534,85.306216 167.26662,85.375136 169.71875,85.375136 C 196.76117,85.375136 221.27881,79.982276 239.21875,71.218886 C 241.01852,69.245176 242.91253,67.214046 244.71875,65.218886 C 247.4578,62.193316 249.97928,59.194496 251.53125,56.781386 C 252.88922,54.669926 253.13867,53.208206 253.21875,53.000136 C 253.03095,52.875906 251.93576,51.779196 249.59375,50.875136 C 248.75868,50.552786 247.80629,50.238636 246.78125,49.937636 z" id="path3325" sodipodi:nodetypes="cscsscsccscsscsc" style="opacity:1;fill:url(#linearGradient2829);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80892944;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1"/>
+ </g>
+ <path d="M 25.190679,119.77989 C 26.414679,122.74238 27.241162,124.11897 31.289475,123.31542 L 30.638356,120.21008 L 29.079766,120.3986 L 28.261711,118.57341 L 25.190679,119.77989 z" id="path3842" sodipodi:nodetypes="cccccc" style="opacity:0.7715356;fill:url(#linearGradient2831);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3928)"/>
+ <path d="M 26.03125,94.25 C 24.983755,105.1142 22.21942,119.85075 26.78125,123.15625 C 33.15283,127.7731 56.287818,111.82251 64.15625,111.8125 C 72.024682,111.80249 95.202691,127.69555 101.5625,123.0625 C 106.10279,119.75495 103.30815,105.10184 102.21875,94.25 L 98.34375,94.25 C 98.677864,97.707156 99.164649,101.42777 99.5625,105.03125 C 100.01038,109.08783 100.31178,112.97888 100.15625,115.84375 C 100.02016,118.35052 99.34151,119.69095 99.28125,119.90625 C 99.057443,119.89786 97.552762,120.17027 95.125,119.53125 C 92.350417,118.80093 88.723899,117.29504 85,115.625 C 81.276103,113.95497 77.426259,112.10169 73.90625,110.625 C 70.386242,109.1483 67.4302,107.93334 64.15625,107.9375 C 60.882303,107.94167 57.891241,109.1706 54.375,110.65625 C 50.858761,112.1419 47.032137,114.00799 43.3125,115.6875 C 39.592862,117.367 35.960216,118.85638 33.1875,119.59375 C 30.761373,120.23895 29.286908,119.99088 29.0625,120 C 29.004012,119.7864 28.29872,118.4439 28.15625,115.9375 C 27.993428,113.07303 28.281199,109.18271 28.71875,105.125 C 29.110886,101.48845 29.580993,97.733027 29.90625,94.25 L 26.03125,94.25 z" id="path3936" style="opacity:1;fill:url(#radialGradient2833);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80851269;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1"/>
+ <path d="M 64.125001,11.90625 C 63.951211,12.044552 62.583531,12.708229 61.000001,14.65625 C 59.190241,16.88256 57.147061,20.236153 55.125001,23.78125 C 53.102941,27.326347 51.096451,31.075042 49.125001,34.34375 C 47.153541,37.612458 45.489981,40.384748 42.843751,42.3125 C 40.197511,44.24025 37.059481,45.000663 33.343751,45.875 C 29.628021,46.749339 25.431821,47.474737 21.437501,48.3125 C 17.443181,49.150265 13.611451,50.084977 10.937501,51.125 C 8.3618506,52.126785 7.3899506,53.337785 7.3750006,53.25 C 7.4529506,53.457399 7.6679106,54.954496 9.0312506,57.0625 C 10.589351,59.471649 13.128261,62.450158 15.875001,65.46875 C 18.621741,68.487339 21.562991,71.552452 24.062501,74.4375 C 26.562011,77.322553 28.671831,79.762573 29.687501,82.875 C 30.703171,85.987425 30.441681,89.227198 30.125001,93.03125 C 29.808321,96.835302 29.250051,101.0673 28.812501,105.125 C 28.374951,109.18271 28.087181,113.07303 28.250001,115.9375 C 28.392471,118.4439 29.097761,119.7864 29.156251,120 C 29.380661,119.99088 30.855121,120.23895 33.281251,119.59375 C 36.053961,118.85638 39.686611,117.367 43.406251,115.6875 C 47.125881,114.00799 50.952511,112.1419 54.468751,110.65625 C 57.984991,109.1706 60.976051,107.94167 64.250001,107.9375 C 67.523951,107.93334 70.479991,109.1483 74.000001,110.625 C 77.520011,112.10169 81.369851,113.95497 85.093751,115.625 C 88.817651,117.29504 92.444151,118.80093 95.218751,119.53125 C 97.646511,120.17027 99.151181,119.89786 99.375001,119.90625 C 99.435261,119.69095 100.1139,118.35052 100.25,115.84375 C 100.40553,112.97888 100.10412,109.08783 99.656251,105.03125 C 99.208371,100.97466 98.638841,96.740738 98.312501,92.9375 C 97.986141,89.134266 97.710991,85.927495 98.718751,82.8125 C 99.726491,79.697501 101.82033,77.235155 104.3125,74.34375 C 106.80466,71.452346 109.76095,68.369316 112.5,65.34375 C 115.23905,62.318181 117.76053,59.319356 119.3125,56.90625 C 120.67047,54.794782 120.91992,53.333062 121,53.125 C 120.8122,53.000764 119.71701,51.904061 117.375,51 C 114.6984,49.966787 110.90268,49.046347 106.90625,48.21875 C 102.90981,47.391152 98.717931,46.646129 95.000001,45.78125 C 91.282061,44.91637 88.151121,44.171009 85.500001,42.25 C 82.848871,40.328991 81.167271,37.576182 79.187501,34.3125 C 77.207731,31.048819 75.187321,27.28994 73.156251,23.75 C 71.125171,20.210059 69.065421,16.877947 67.250001,14.65625 C 65.661511,12.712264 64.301791,12.045423 64.125001,11.90625 z" id="path3375" sodipodi:nodetypes="cssssssssssssssscssssssscssssssscsssssssc" style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient2835);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1;filter:url(#filter3391)"/>
+ <g id="g3612" transform="matrix(-1,0,0,1,128.17175,0)">
+ <path d="M 122.34464,49.937924 L 118.89749,52.943128 L 119.6046,54.97606 L 123.93563,55.771555 C 124.26838,53.827011 124.96313,51.882468 122.34464,49.937924 z" id="path3614" sodipodi:nodetypes="ccccc" style="opacity:0.60891089;fill:url(#radialGradient2837);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3564)"/>
+ <path d="M 122.34464,49.937924 L 118.89749,52.943128 L 119.6046,54.97606 L 123.93563,55.771555 C 124.26838,53.827011 124.96313,51.882468 122.34464,49.937924 z" id="path3616" sodipodi:nodetypes="ccccc" style="opacity:0.60891089;fill:url(#radialGradient2839);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3604)"/>
+ </g>
+ <g id="g3608">
+ <path d="M 122.34464,49.937924 L 118.89749,52.943128 L 119.6046,54.97606 L 123.93563,55.771555 C 124.26838,53.827011 124.96313,51.882468 122.34464,49.937924 z" id="path3374" sodipodi:nodetypes="ccccc" style="opacity:0.60891089;fill:url(#radialGradient2841);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3564)"/>
+ <path d="M 122.34464,49.937924 L 118.89749,52.943128 L 119.6046,54.97606 L 123.93563,55.771555 C 124.26838,53.827011 124.96313,51.882468 122.34464,49.937924 z" id="path3568" sodipodi:nodetypes="ccccc" style="opacity:0.60891089;fill:url(#radialGradient2843);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3604)"/>
+ </g>
+ <path d="M 64.125001,11.90625 C 63.951211,12.044552 62.583531,12.708229 61.000001,14.65625 C 59.190241,16.88256 57.147061,20.236153 55.125001,23.78125 C 53.102941,27.326347 51.096451,31.075042 49.125001,34.34375 C 47.153541,37.612458 45.489981,40.384748 42.843751,42.3125 C 40.197511,44.24025 37.059481,45.000663 33.343751,45.875 C 29.628021,46.749339 25.431821,47.474737 21.437501,48.3125 C 17.443181,49.150265 13.611451,50.084977 10.937501,51.125 C 8.3618506,52.126785 7.3899506,53.337785 7.3750006,53.25 C 7.4529506,53.457399 7.6679106,54.954496 9.0312506,57.0625 C 10.589351,59.471649 13.128261,62.450158 15.875001,65.46875 C 18.621741,68.487339 21.562991,71.552452 24.062501,74.4375 C 26.562011,77.322553 28.671831,79.762573 29.687501,82.875 C 30.703171,85.987425 30.441681,89.227198 30.125001,93.03125 C 29.808321,96.835302 29.250051,101.0673 28.812501,105.125 C 28.374951,109.18271 28.087181,113.07303 28.250001,115.9375 C 28.392471,118.4439 29.097761,119.7864 29.156251,120 C 29.380661,119.99088 30.855121,120.23895 33.281251,119.59375 C 36.053961,118.85638 39.686611,117.367 43.406251,115.6875 C 47.125881,114.00799 50.952511,112.1419 54.468751,110.65625 C 57.984991,109.1706 60.976051,107.94167 64.250001,107.9375 C 67.523951,107.93334 70.479991,109.1483 74.000001,110.625 C 77.520011,112.10169 81.369851,113.95497 85.093751,115.625 C 88.817651,117.29504 92.444151,118.80093 95.218751,119.53125 C 97.646511,120.17027 99.151181,119.89786 99.375001,119.90625 C 99.435261,119.69095 100.1139,118.35052 100.25,115.84375 C 100.40553,112.97888 100.10412,109.08783 99.656251,105.03125 C 99.208371,100.97466 98.638841,96.740738 98.312501,92.9375 C 97.986141,89.134266 97.710991,85.927495 98.718751,82.8125 C 99.726491,79.697501 101.82033,77.235155 104.3125,74.34375 C 106.80466,71.452346 109.76095,68.369316 112.5,65.34375 C 115.23905,62.318181 117.76053,59.319356 119.3125,56.90625 C 120.67047,54.794782 120.91992,53.333062 121,53.125 C 120.8122,53.000764 119.71701,51.904061 117.375,51 C 114.6984,49.966787 110.90268,49.046347 106.90625,48.21875 C 102.90981,47.391152 98.717931,46.646129 95.000001,45.78125 C 91.282061,44.91637 88.151121,44.171009 85.500001,42.25 C 82.848871,40.328991 81.167271,37.576182 79.187501,34.3125 C 77.207731,31.048819 75.187321,27.28994 73.156251,23.75 C 71.125171,20.210059 69.065421,16.877947 67.250001,14.65625 C 65.661511,12.712264 64.301791,12.045423 64.125001,11.90625 z" id="path3395" sodipodi:nodetypes="cssssssssssssssscssssssscssssssscsssssssc" style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient2845);stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1;filter:url(#filter3401)"/>
+ <path d="M 25.190679,119.77989 C 26.414679,122.74238 27.241162,124.11897 31.289475,123.31542 L 30.638356,120.21008 L 29.079766,120.3986 L 28.261711,118.57341 L 25.190679,119.77989 z" id="path3932" sodipodi:nodetypes="cccccc" style="opacity:0.7715356;fill:url(#linearGradient2847);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3928)" transform="matrix(-1,0,0,1,128.10515,0)"/>
+ <path d="M 26.03125,94.25 C 24.983755,105.1142 22.21942,119.85075 26.78125,123.15625 C 33.15283,127.7731 56.287818,110.82251 64.15625,110.8125 C 72.024682,110.80249 95.202691,127.69555 101.5625,123.0625 C 106.10279,119.75495 103.30815,105.10184 102.21875,94.25 L 98.34375,94.25 C 98.677864,97.707156 99.164649,101.42777 99.5625,105.03125 C 100.01038,109.08783 100.31178,112.97888 100.15625,115.84375 C 100.02016,118.35052 99.34151,119.69095 99.28125,119.90625 C 99.057443,119.89786 97.552762,120.17027 95.125,119.53125 C 92.350417,118.80093 88.723899,117.29504 85,115.625 C 81.276103,113.95497 77.426259,112.10169 73.90625,110.625 C 70.386242,109.1483 67.4302,107.93334 64.15625,107.9375 C 60.882303,107.94167 57.891241,109.1706 54.375,110.65625 C 50.858761,112.1419 47.032137,114.00799 43.3125,115.6875 C 39.592862,117.367 35.960216,118.85638 33.1875,119.59375 C 30.761373,120.23895 29.286908,119.99088 29.0625,120 C 29.004012,119.7864 28.29872,118.4439 28.15625,115.9375 C 27.993428,113.07303 28.281199,109.18271 28.71875,105.125 C 29.110886,101.48845 29.580993,97.733027 29.90625,94.25 L 26.03125,94.25 z" id="path3265" sodipodi:nodetypes="csssccsscssssssscsscc" style="opacity:1;fill:url(#radialGradient2849);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80851269;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1;filter:url(#filter3285)"/>
+ <path d="M 3.96875,51.25 C 3.8072482,51.513327 3.653679,51.78066 3.5625,52.0625 C 1.4104994,58.714465 18.791507,72.91663 24.40625,81.25 C 25.066744,82.219734 25.881994,83.560003 26.151902,85.050699 C 27.656842,84.748586 29.576041,82.642021 28.90625,81.25 C 27.768648,78.87567 26.012193,76.796136 23.96875,74.4375 C 21.469238,71.552452 18.527988,68.487339 15.78125,65.46875 C 13.034512,62.450158 10.495601,59.471649 8.9375,57.0625 C 7.574162,54.954496 7.359205,53.457399 7.28125,53.25 C 7.2955626,53.33402 8.1966214,52.223338 10.53125,51.25 L 3.96875,51.25 z M 117.875,51.25 C 119.79897,52.094675 120.73559,53.012104 120.90625,53.125 C 120.82618,53.333062 120.57672,54.794782 119.21875,56.90625 C 117.66679,59.319356 115.1453,62.318181 112.40625,65.34375 C 109.66721,68.369316 106.71091,71.452346 104.21875,74.34375 C 102.16137,76.730721 100.3775,78.839259 99.25,81.25 C 98.389358,83.690958 101.19084,84.749904 102.08854,84.829728 C 102.41731,83.373922 103.07445,82.301223 103.75,81.25 C 109.28341,72.913848 126.77026,58.575986 124.59375,51.90625 C 124.52034,51.681299 124.39982,51.462951 124.28125,51.25 L 117.875,51.25 z" id="rect3289" sodipodi:nodetypes="cscccssssccccssscccscc" style="opacity:0.84158415;fill:url(#radialGradient2851);fill-opacity:1;stroke:none;stroke-width:6.1420002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter3362)"/>
+ </g>
+ <g id="g3701">
+ <path d="M 64.03125,8.2 C 56.162818,8.2100117 46.828561,34.754451 40.46875,39.3875 C 34.10894,44.020548 5.9844574,44.776082 3.5625,52.2625 C 1.1405426,59.748917 23.465249,76.813524 25.90625,84.29375 C 28.347251,91.77398 20.40967,118.7394 26.78125,123.35625 C 33.15283,127.9731 56.287818,112.02251 64.15625,112.0125 C 72.024682,112.00249 95.202691,127.89555 101.5625,123.2625 C 107.92231,118.62945 99.890544,91.686414 102.3125,84.2 C 104.73446,76.713583 127.03475,59.58648 124.59375,52.10625 C 122.15275,44.626021 94.027829,43.941849 87.65625,39.325 C 81.28467,34.708152 71.899685,8.1899879 64.03125,8.2 z M 64.03125,12.10625 C 64.208046,12.245423 65.56776,12.912264 67.15625,14.85625 C 68.97167,17.077947 71.031426,20.410059 73.0625,23.95 C 75.093573,27.48994 77.113982,31.248819 79.09375,34.5125 C 81.073519,37.776182 82.75512,40.528991 85.40625,42.45 C 88.057376,44.371009 91.18831,45.11637 94.90625,45.98125 C 98.624192,46.846129 102.81606,47.591152 106.8125,48.41875 C 110.80894,49.246347 114.60465,50.166787 117.28125,51.2 C 119.62327,52.104061 120.71845,53.200764 120.90625,53.325 C 120.82618,53.533062 120.57672,54.994782 119.21875,57.10625 C 117.66679,59.519356 115.1453,62.518181 112.40625,65.54375 C 109.66721,68.569316 106.71091,71.652346 104.21875,74.54375 C 101.72659,77.435155 99.632744,79.897501 98.625,83.0125 C 97.617256,86.127495 97.892393,89.334266 98.21875,93.1375 C 98.545107,96.940738 99.114622,101.17466 99.5625,105.23125 C 100.01038,109.28783 100.31178,113.17888 100.15625,116.04375 C 100.02016,118.55052 99.34151,119.89095 99.28125,120.10625 C 99.057443,120.09786 97.552762,120.37027 95.125,119.73125 C 92.350417,119.00093 88.723899,117.49504 85,115.825 C 81.276103,114.15497 77.426259,112.30169 73.90625,110.825 C 70.386242,109.3483 67.4302,108.13334 64.15625,108.1375 C 60.882303,108.14167 57.891241,109.3706 54.375,110.85625 C 50.858761,112.3419 47.032137,114.20799 43.3125,115.8875 C 39.592862,117.567 35.960216,119.05638 33.1875,119.79375 C 30.761373,120.43895 29.286908,120.19088 29.0625,120.2 C 29.004012,119.9864 28.29872,118.6439 28.15625,116.1375 C 27.993428,113.27303 28.281199,109.38271 28.71875,105.325 C 29.156299,101.2673 29.714573,97.035302 30.03125,93.23125 C 30.347928,89.427198 30.609418,86.187425 29.59375,83.075 C 28.578082,79.962573 26.468263,77.522553 23.96875,74.6375 C 21.469238,71.752452 18.527988,68.687339 15.78125,65.66875 C 13.034512,62.650158 10.495601,59.671649 8.9375,57.2625 C 7.5741618,55.154496 7.3592053,53.657399 7.28125,53.45 C 7.2962039,53.537785 8.2681026,52.326785 10.84375,51.325 C 13.517705,50.284977 17.34943,49.350265 21.34375,48.5125 C 25.33807,47.674737 29.534272,46.949339 33.25,46.075 C 36.96573,45.200663 40.103767,44.44025 42.75,42.5125 C 45.396234,40.584748 47.059794,37.812458 49.03125,34.54375 C 51.002705,31.275042 53.009191,27.526347 55.03125,23.98125 C 57.053308,20.436153 59.096493,17.08256 60.90625,14.85625 C 62.489787,12.908229 63.857465,12.244552 64.03125,12.10625 z" id="path3703" style="opacity:1;fill:url(#radialGradient3263);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80851269;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1;filter:url(#filter3259)"/>
+ <path d="M 153.09403,94.713757 C 144.53658,107.09689 92.616372,93.013297 78.414631,98.001518 C 64.21289,102.98974 32.50348,146.4474 18.082028,142.13539 C 3.6605746,137.82337 1.0106378,84.092245 -8.1220219,72.127031 C -17.254681,60.161818 -68.384124,43.433534 -68.739625,28.385431 C -69.095125,13.337327 -18.812666,-5.7867426 -10.255219,-18.169872 C -1.697772,-30.553002 -1.5880954,-84.349316 12.613645,-89.337536 C 26.815387,-94.325757 60.541592,-52.41396 74.963045,-48.101941 C 89.384498,-43.789923 140.58172,-60.30959 149.71438,-48.344376 C 158.84704,-36.379162 129.40853,8.6478227 129.76403,23.695927 C 130.11953,38.74403 161.65148,82.330628 153.09403,94.713757 z" id="path3705" inkscape:flatsided="false" inkscape:randomized="0" inkscape:rounded="0.20136392" sodipodi:arg1="0.60469864" sodipodi:arg2="1.2330172" sodipodi:cx="52.952892" sodipodi:cy="25.510532" sodipodi:r1="121.72647" sodipodi:r2="76.832565" sodipodi:sides="5" sodipodi:type="star" style="opacity:1;fill:url(#radialGradient2906);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80892944;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1" transform="matrix(0.4934214,0.1726044,-0.1726044,0.4934214,42.377875,49.908537)"/>
+ <path d="M 64.03125,8 C 56.162818,8.0100117 46.828561,34.554451 40.46875,39.1875 C 34.10894,43.820548 5.984457,44.576082 3.5625,52.0625 C 1.140543,59.548917 23.465249,76.613524 25.90625,84.09375 C 28.347251,91.57398 20.40967,118.5394 26.78125,123.15625 C 33.15283,127.7731 56.287818,111.82251 64.15625,111.8125 C 72.024682,111.80249 95.202691,127.69555 101.5625,123.0625 C 107.92231,118.42945 99.890544,91.486414 102.3125,84 C 104.73446,76.513583 127.03475,59.38648 124.59375,51.90625 C 122.15275,44.426021 94.027829,43.741849 87.65625,39.125 C 81.28467,34.508152 71.899685,7.9899879 64.03125,8 z M 64.03125,11.90625 C 64.208046,12.045423 65.56776,12.712264 67.15625,14.65625 C 68.97167,16.877947 71.031426,20.210059 73.0625,23.75 C 75.093573,27.28994 77.113982,31.048819 79.09375,34.3125 C 81.073519,37.576182 82.75512,40.328991 85.40625,42.25 C 88.057376,44.171009 91.18831,44.91637 94.90625,45.78125 C 98.624192,46.646129 102.81606,47.391152 106.8125,48.21875 C 110.80894,49.046347 114.60465,49.966787 117.28125,51 C 119.62327,51.904061 120.71845,53.000764 120.90625,53.125 C 120.82618,53.333062 120.57672,54.794782 119.21875,56.90625 C 117.66679,59.319356 115.1453,62.318181 112.40625,65.34375 C 109.66721,68.369316 106.71091,71.452346 104.21875,74.34375 C 101.72659,77.235155 99.632744,79.697501 98.625,82.8125 C 97.617256,85.927495 97.892393,89.134266 98.21875,92.9375 C 98.545107,96.740738 99.114622,100.97466 99.5625,105.03125 C 100.01038,109.08783 100.31178,112.97888 100.15625,115.84375 C 100.02016,118.35052 99.34151,119.69095 99.28125,119.90625 C 99.057443,119.89786 97.552762,120.17027 95.125,119.53125 C 92.350417,118.80093 88.723899,117.29504 85,115.625 C 81.276103,113.95497 77.426259,112.10169 73.90625,110.625 C 70.386242,109.1483 67.4302,107.93334 64.15625,107.9375 C 60.882303,107.94167 57.891241,109.1706 54.375,110.65625 C 50.858761,112.1419 47.032137,114.00799 43.3125,115.6875 C 39.592862,117.367 35.960216,118.85638 33.1875,119.59375 C 30.761373,120.23895 29.286908,119.99088 29.0625,120 C 29.004012,119.7864 28.29872,118.4439 28.15625,115.9375 C 27.993428,113.07303 28.281199,109.18271 28.71875,105.125 C 29.156299,101.0673 29.714573,96.835302 30.03125,93.03125 C 30.347928,89.227198 30.609418,85.987425 29.59375,82.875 C 28.578082,79.762573 26.468263,77.322553 23.96875,74.4375 C 21.469238,71.552452 18.527988,68.487339 15.78125,65.46875 C 13.034512,62.450158 10.495601,59.471649 8.9375,57.0625 C 7.574162,54.954496 7.359205,53.457399 7.28125,53.25 C 7.296204,53.337785 8.268103,52.126785 10.84375,51.125 C 13.517705,50.084977 17.34943,49.150265 21.34375,48.3125 C 25.33807,47.474737 29.534272,46.749339 33.25,45.875 C 36.96573,45.000663 40.103767,44.24025 42.75,42.3125 C 45.396234,40.384748 47.059794,37.612458 49.03125,34.34375 C 51.002705,31.075042 53.009191,27.326347 55.03125,23.78125 C 57.053308,20.236153 59.096493,16.88256 60.90625,14.65625 C 62.489787,12.708229 63.857465,12.044552 64.03125,11.90625 z" id="path3707" style="opacity:1;fill:url(#linearGradient2475);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80851269;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1"/>
+ <path d="M 60.98796,9.471226 C 62.846491,8.2143022 64.889907,8.0204702 67.219338,9.471226 L 64.037358,15.614216 L 60.98796,9.471226 z" id="path3709" sodipodi:nodetypes="cccc" style="fill:url(#linearGradient3800);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3838)"/>
+ <path d="M 64.039064,11.90625 C 63.865274,12.044552 62.497594,12.708229 60.914064,14.65625 C 59.104304,16.88256 57.061124,20.236153 55.039064,23.78125 C 53.017004,27.326347 51.010514,31.075042 49.039064,34.34375 C 47.067604,37.612458 45.404044,40.384748 42.757814,42.3125 C 40.111574,44.24025 36.973544,45.000663 33.257814,45.875 C 29.542084,46.749339 25.345884,47.474737 21.351564,48.3125 C 17.357244,49.150265 13.525514,50.084977 10.851564,51.125 C 8.2759131,52.126785 7.3040131,53.337785 7.2890631,53.25 C 7.3670131,53.457399 7.5819731,54.954496 8.9453131,57.0625 C 10.503414,59.471649 13.042324,62.450158 15.789064,65.46875 C 18.535804,68.487339 21.477054,71.552452 23.976564,74.4375 C 26.476074,77.322553 28.585894,79.762573 29.601564,82.875 C 29.865144,83.682722 30.019904,84.511238 30.132814,85.34375 C 32.540654,85.431079 34.961934,85.5 37.414064,85.5 C 64.456484,85.5 88.974124,80.107134 106.91406,71.34375 C 108.71383,69.370041 110.60784,67.338911 112.41406,65.34375 C 115.15311,62.318181 117.67459,59.319356 119.22656,56.90625 C 120.58453,54.794782 120.83398,53.333062 120.91406,53.125 C 120.72626,53.000764 119.63107,51.904061 117.28906,51 C 114.61246,49.966787 110.81674,49.046347 106.82031,48.21875 C 102.82387,47.391152 98.631994,46.646129 94.914064,45.78125 C 91.196124,44.91637 88.065184,44.171009 85.414064,42.25 C 82.762934,40.328991 81.081334,37.576182 79.101564,34.3125 C 77.121794,31.048819 75.101384,27.28994 73.070314,23.75 C 71.039234,20.210059 68.979484,16.877947 67.164064,14.65625 C 65.575574,12.712264 64.215854,12.045423 64.039064,11.90625 z" id="path3711" style="opacity:1;fill:url(#radialGradient3372);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80892944;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1"/>
+ <path d="M 44.96875,33.9375 L 44.1875,35.21875 C 44.177097,35.219516 44.166653,35.219516 44.15625,35.21875 L 42.8125,36.9375 L 41.53125,38.46875 C 41.521947,38.480223 41.511473,38.490697 41.5,38.5 L 40.03125,39.71875 C 40.021947,39.730223 40.011473,39.740697 40,39.75 L 37.125,41.03125 C 37.115697,41.042723 37.105223,41.053197 37.09375,41.0625 L 33.875,41.96875 L 33.375,45.625 L 35.125,45.21875 L 35.125,45.25 L 39.71875,43.75 L 39.75,43.75 L 42.8125,42.0625 L 42.875,42.03125 L 45.78125,39.09375 L 45.8125,39.0625 L 48.96875,34.03125 L 44.96875,33.9375 z" id="path3713" inkscape:original="M 44.84375 33.71875 L 44 35.09375 L 42.65625 36.8125 L 41.375 38.34375 L 39.90625 39.5625 L 37.03125 40.84375 L 33.6875 41.78125 L 33.09375 45.9375 L 35.1875 45.4375 L 39.8125 43.9375 L 42.96875 42.21875 L 45.96875 39.21875 L 49.375 33.8125 L 44.84375 33.71875 z " inkscape:radius="-0.21269609" sodipodi:type="inkscape:offset" style="opacity:0.64356432;fill:url(#radialGradient3669);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3663)" transform="translate(0,0.3)"/>
+ <path d="M 64.039064,11.90625 C 63.865274,12.044552 62.497594,12.708229 60.914064,14.65625 C 59.104304,16.88256 57.061124,20.236153 55.039064,23.78125 C 53.017004,27.326347 51.010514,31.075042 49.039064,34.34375 C 47.067604,37.612458 45.404044,40.384748 42.757814,42.3125 C 40.111574,44.24025 36.973544,45.000663 33.257814,45.875 C 29.542084,46.749339 25.345884,47.474737 21.351564,48.3125 C 17.357244,49.150265 13.525514,50.084977 10.851564,51.125 C 8.2759131,52.126785 7.3040131,53.337785 7.2890631,53.25 C 7.3670131,53.457399 7.5819731,54.954496 8.9453131,57.0625 C 10.503414,59.471649 13.042324,62.450158 15.789064,65.46875 C 18.535804,68.487339 21.477054,71.552452 23.976564,74.4375 C 26.476074,77.322553 28.585894,79.762573 29.601564,82.875 C 29.865144,83.682722 30.019904,84.511238 30.132814,85.34375 C 32.540654,85.431079 34.961934,85.5 37.414064,85.5 C 64.456484,85.5 88.974124,80.107134 106.91406,71.34375 C 108.71383,69.370041 110.60784,67.338911 112.41406,65.34375 C 115.15311,62.318181 117.67459,59.319356 119.22656,56.90625 C 120.58453,54.794782 120.83398,53.333062 120.91406,53.125 C 120.72626,53.000764 119.63107,51.904061 117.28906,51 C 114.61246,49.966787 110.81674,49.046347 106.82031,48.21875 C 102.82387,47.391152 98.631994,46.646129 94.914064,45.78125 C 91.196124,44.91637 88.065184,44.171009 85.414064,42.25 C 82.762934,40.328991 81.081334,37.576182 79.101564,34.3125 C 77.121794,31.048819 75.101384,27.28994 73.070314,23.75 C 71.039234,20.210059 68.979484,16.877947 67.164064,14.65625 C 65.575574,12.712264 64.215854,12.045423 64.039064,11.90625 z" id="path3715" style="opacity:1;fill:url(#linearGradient3315);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80892944;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1"/>
+ <path d="M 44.96875,33.9375 L 44.1875,35.21875 C 44.177097,35.219516 44.166653,35.219516 44.15625,35.21875 L 42.8125,36.9375 L 41.53125,38.46875 C 41.521947,38.480223 41.511473,38.490697 41.5,38.5 L 40.03125,39.71875 C 40.021947,39.730223 40.011473,39.740697 40,39.75 L 37.125,41.03125 C 37.115697,41.042723 37.105223,41.053197 37.09375,41.0625 L 33.875,41.96875 L 33.375,45.625 L 35.125,45.21875 L 35.125,45.25 L 39.71875,43.75 L 39.75,43.75 L 42.8125,42.0625 L 42.875,42.03125 L 45.78125,39.09375 L 45.8125,39.0625 L 48.96875,34.03125 L 44.96875,33.9375 z" id="path3717" inkscape:original="M 44.84375 33.71875 L 44 35.09375 L 42.65625 36.8125 L 41.375 38.34375 L 39.90625 39.5625 L 37.03125 40.84375 L 33.6875 41.78125 L 33.09375 45.9375 L 35.1875 45.4375 L 39.8125 43.9375 L 42.96875 42.21875 L 45.96875 39.21875 L 49.375 33.8125 L 44.84375 33.71875 z " inkscape:radius="-0.21269609" sodipodi:type="inkscape:offset" style="opacity:0.64356432;fill:url(#radialGradient3673);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3663)" transform="matrix(-1,0,0,1,128.125,0.3)"/>
+ <g id="g3719" transform="translate(-132.29928,0)">
+ <path d="M 196.34375,11.90625 C 196.16996,12.044552 194.80228,12.708229 193.21875,14.65625 C 191.40899,16.88256 189.36581,20.236153 187.34375,23.78125 C 185.32169,27.326347 183.3152,31.075042 181.34375,34.34375 C 179.37229,37.612458 177.70873,40.384748 175.0625,42.3125 C 172.41626,44.24025 169.27823,45.000663 165.5625,45.875 C 161.84677,46.749339 157.65057,47.474737 153.65625,48.3125 C 149.66193,49.150265 145.8302,50.084977 143.15625,51.125 C 140.5806,52.126785 139.6087,53.337785 139.59375,53.25 C 139.62377,53.329884 139.71528,53.638731 139.84375,54.0625 C 140.2595,53.69998 141.25985,52.862595 143.15625,52.125 C 145.8302,51.084977 149.66193,50.150265 153.65625,49.3125 C 157.65057,48.474737 161.84677,47.749339 165.5625,46.875 C 169.27823,46.000663 172.41626,45.24025 175.0625,43.3125 C 177.70873,41.384748 179.37229,38.612458 181.34375,35.34375 C 183.3152,32.075042 185.32169,28.326347 187.34375,24.78125 C 189.36581,21.236153 191.40899,17.88256 193.21875,15.65625 C 194.80228,13.708229 196.16996,13.044552 196.34375,12.90625 C 196.52054,13.045423 197.88026,13.712264 199.46875,15.65625 C 201.28417,17.877947 203.34392,21.210059 205.375,24.75 C 207.40607,28.28994 209.42648,32.048819 211.40625,35.3125 C 213.38602,38.576182 215.06762,41.328991 217.71875,43.25 C 220.36987,45.171009 223.50081,45.91637 227.21875,46.78125 C 230.93668,47.646129 235.12856,48.391152 239.125,49.21875 C 243.12143,50.046347 246.91715,50.966787 249.59375,52 C 251.51448,52.74144 252.56925,53.579608 253,53.9375 C 253.13371,53.522484 253.18802,53.204851 253.21875,53.125 C 253.03095,53.000764 251.93576,51.904061 249.59375,51 C 246.91715,49.966787 243.12143,49.046347 239.125,48.21875 C 235.12856,47.391152 230.93668,46.646129 227.21875,45.78125 C 223.50081,44.91637 220.36987,44.171009 217.71875,42.25 C 215.06762,40.328991 213.38602,37.576182 211.40625,34.3125 C 209.42648,31.048819 207.40607,27.28994 205.375,23.75 C 203.34392,20.210059 201.28417,16.877947 199.46875,14.65625 C 197.88026,12.712264 196.52054,12.045423 196.34375,11.90625 z" id="path3721" style="opacity:1;fill:url(#linearGradient3369);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80892944;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1"/>
+ <path d="M 246.78125,49.937636 C 247.42469,50.142466 248.03845,50.379526 248.59375,50.593886 C 250.93576,51.497946 252.03095,52.594656 252.21875,52.718886 C 252.13867,52.926956 251.88922,54.388676 250.53125,56.500136 C 248.97928,58.913246 246.4578,61.912066 243.71875,64.937636 C 241.91253,66.932796 240.01852,68.963926 238.21875,70.937636 C 220.27881,79.701026 195.76117,85.093886 168.71875,85.093886 C 166.59433,85.093886 164.49568,85.039506 162.40625,84.968886 C 162.4184,85.051736 162.42625,85.135936 162.4375,85.218886 C 164.84534,85.306216 167.26662,85.375136 169.71875,85.375136 C 196.76117,85.375136 221.27881,79.982276 239.21875,71.218886 C 241.01852,69.245176 242.91253,67.214046 244.71875,65.218886 C 247.4578,62.193316 249.97928,59.194496 251.53125,56.781386 C 252.88922,54.669926 253.13867,53.208206 253.21875,53.000136 C 253.03095,52.875906 251.93576,51.779196 249.59375,50.875136 C 248.75868,50.552786 247.80629,50.238636 246.78125,49.937636 z" id="path3723" sodipodi:nodetypes="cscsscsccscsscsc" style="opacity:1;fill:url(#linearGradient3345);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80892944;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1"/>
+ </g>
+ <path d="M 25.190679,119.77989 C 26.414679,122.74238 27.241162,124.11897 31.289475,123.31542 L 30.638356,120.21008 L 29.079766,120.3986 L 28.261711,118.57341 L 25.190679,119.77989 z" id="path3725" sodipodi:nodetypes="cccccc" style="opacity:0.7715356;fill:url(#linearGradient2853);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3928)"/>
+ <path d="M 26.03125,94.25 C 24.983755,105.1142 22.21942,119.85075 26.78125,123.15625 C 33.15283,127.7731 56.287818,111.82251 64.15625,111.8125 C 72.024682,111.80249 95.202691,127.69555 101.5625,123.0625 C 106.10279,119.75495 103.30815,105.10184 102.21875,94.25 L 98.34375,94.25 C 98.677864,97.707156 99.164649,101.42777 99.5625,105.03125 C 100.01038,109.08783 100.31178,112.97888 100.15625,115.84375 C 100.02016,118.35052 99.34151,119.69095 99.28125,119.90625 C 99.057443,119.89786 97.552762,120.17027 95.125,119.53125 C 92.350417,118.80093 88.723899,117.29504 85,115.625 C 81.276103,113.95497 77.426259,112.10169 73.90625,110.625 C 70.386242,109.1483 67.4302,107.93334 64.15625,107.9375 C 60.882303,107.94167 57.891241,109.1706 54.375,110.65625 C 50.858761,112.1419 47.032137,114.00799 43.3125,115.6875 C 39.592862,117.367 35.960216,118.85638 33.1875,119.59375 C 30.761373,120.23895 29.286908,119.99088 29.0625,120 C 29.004012,119.7864 28.29872,118.4439 28.15625,115.9375 C 27.993428,113.07303 28.281199,109.18271 28.71875,105.125 C 29.110886,101.48845 29.580993,97.733027 29.90625,94.25 L 26.03125,94.25 z" id="path3727" style="opacity:1;fill:url(#radialGradient3956);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80851269;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1"/>
+ <path d="M 64.125001,11.90625 C 63.951211,12.044552 62.583531,12.708229 61.000001,14.65625 C 59.190241,16.88256 57.147061,20.236153 55.125001,23.78125 C 53.102941,27.326347 51.096451,31.075042 49.125001,34.34375 C 47.153541,37.612458 45.489981,40.384748 42.843751,42.3125 C 40.197511,44.24025 37.059481,45.000663 33.343751,45.875 C 29.628021,46.749339 25.431821,47.474737 21.437501,48.3125 C 17.443181,49.150265 13.611451,50.084977 10.937501,51.125 C 8.3618506,52.126785 7.3899506,53.337785 7.3750006,53.25 C 7.4529506,53.457399 7.6679106,54.954496 9.0312506,57.0625 C 10.589351,59.471649 13.128261,62.450158 15.875001,65.46875 C 18.621741,68.487339 21.562991,71.552452 24.062501,74.4375 C 26.562011,77.322553 28.671831,79.762573 29.687501,82.875 C 30.703171,85.987425 30.441681,89.227198 30.125001,93.03125 C 29.808321,96.835302 29.250051,101.0673 28.812501,105.125 C 28.374951,109.18271 28.087181,113.07303 28.250001,115.9375 C 28.392471,118.4439 29.097761,119.7864 29.156251,120 C 29.380661,119.99088 30.855121,120.23895 33.281251,119.59375 C 36.053961,118.85638 39.686611,117.367 43.406251,115.6875 C 47.125881,114.00799 50.952511,112.1419 54.468751,110.65625 C 57.984991,109.1706 60.976051,107.94167 64.250001,107.9375 C 67.523951,107.93334 70.479991,109.1483 74.000001,110.625 C 77.520011,112.10169 81.369851,113.95497 85.093751,115.625 C 88.817651,117.29504 92.444151,118.80093 95.218751,119.53125 C 97.646511,120.17027 99.151181,119.89786 99.375001,119.90625 C 99.435261,119.69095 100.1139,118.35052 100.25,115.84375 C 100.40553,112.97888 100.10412,109.08783 99.656251,105.03125 C 99.208371,100.97466 98.638841,96.740738 98.312501,92.9375 C 97.986141,89.134266 97.710991,85.927495 98.718751,82.8125 C 99.726491,79.697501 101.82033,77.235155 104.3125,74.34375 C 106.80466,71.452346 109.76095,68.369316 112.5,65.34375 C 115.23905,62.318181 117.76053,59.319356 119.3125,56.90625 C 120.67047,54.794782 120.91992,53.333062 121,53.125 C 120.8122,53.000764 119.71701,51.904061 117.375,51 C 114.6984,49.966787 110.90268,49.046347 106.90625,48.21875 C 102.90981,47.391152 98.717931,46.646129 95.000001,45.78125 C 91.282061,44.91637 88.151121,44.171009 85.500001,42.25 C 82.848871,40.328991 81.167271,37.576182 79.187501,34.3125 C 77.207731,31.048819 75.187321,27.28994 73.156251,23.75 C 71.125171,20.210059 69.065421,16.877947 67.250001,14.65625 C 65.661511,12.712264 64.301791,12.045423 64.125001,11.90625 z" id="path3729" sodipodi:nodetypes="cssssssssssssssscssssssscssssssscsssssssc" style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient2855);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1;filter:url(#filter3391)"/>
+ <g id="g3731" transform="matrix(-1,0,0,1,128.17175,0)">
+ <path d="M 122.34464,49.937924 L 118.89749,52.943128 L 119.6046,54.97606 L 123.93563,55.771555 C 124.26838,53.827011 124.96313,51.882468 122.34464,49.937924 z" id="path3733" sodipodi:nodetypes="ccccc" style="opacity:0.60891089;fill:url(#radialGradient3618);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3564)"/>
+ <path d="M 122.34464,49.937924 L 118.89749,52.943128 L 119.6046,54.97606 L 123.93563,55.771555 C 124.26838,53.827011 124.96313,51.882468 122.34464,49.937924 z" id="path3735" sodipodi:nodetypes="ccccc" style="opacity:0.60891089;fill:url(#radialGradient3620);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3604)"/>
+ </g>
+ <g id="g3737">
+ <path d="M 122.34464,49.937924 L 118.89749,52.943128 L 119.6046,54.97606 L 123.93563,55.771555 C 124.26838,53.827011 124.96313,51.882468 122.34464,49.937924 z" id="path3739" sodipodi:nodetypes="ccccc" style="opacity:0.60891089;fill:url(#radialGradient3382);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3564)"/>
+ <path d="M 122.34464,49.937924 L 118.89749,52.943128 L 119.6046,54.97606 L 123.93563,55.771555 C 124.26838,53.827011 124.96313,51.882468 122.34464,49.937924 z" id="path3741" sodipodi:nodetypes="ccccc" style="opacity:0.60891089;fill:url(#radialGradient3570);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3604)"/>
+ </g>
+ <path d="M 64.125001,11.90625 C 63.951211,12.044552 62.583531,12.708229 61.000001,14.65625 C 59.190241,16.88256 57.147061,20.236153 55.125001,23.78125 C 53.102941,27.326347 51.096451,31.075042 49.125001,34.34375 C 47.153541,37.612458 45.489981,40.384748 42.843751,42.3125 C 40.197511,44.24025 37.059481,45.000663 33.343751,45.875 C 29.628021,46.749339 25.431821,47.474737 21.437501,48.3125 C 17.443181,49.150265 13.611451,50.084977 10.937501,51.125 C 8.3618506,52.126785 7.3899506,53.337785 7.3750006,53.25 C 7.4529506,53.457399 7.6679106,54.954496 9.0312506,57.0625 C 10.589351,59.471649 13.128261,62.450158 15.875001,65.46875 C 18.621741,68.487339 21.562991,71.552452 24.062501,74.4375 C 26.562011,77.322553 28.671831,79.762573 29.687501,82.875 C 30.703171,85.987425 30.441681,89.227198 30.125001,93.03125 C 29.808321,96.835302 29.250051,101.0673 28.812501,105.125 C 28.374951,109.18271 28.087181,113.07303 28.250001,115.9375 C 28.392471,118.4439 29.097761,119.7864 29.156251,120 C 29.380661,119.99088 30.855121,120.23895 33.281251,119.59375 C 36.053961,118.85638 39.686611,117.367 43.406251,115.6875 C 47.125881,114.00799 50.952511,112.1419 54.468751,110.65625 C 57.984991,109.1706 60.976051,107.94167 64.250001,107.9375 C 67.523951,107.93334 70.479991,109.1483 74.000001,110.625 C 77.520011,112.10169 81.369851,113.95497 85.093751,115.625 C 88.817651,117.29504 92.444151,118.80093 95.218751,119.53125 C 97.646511,120.17027 99.151181,119.89786 99.375001,119.90625 C 99.435261,119.69095 100.1139,118.35052 100.25,115.84375 C 100.40553,112.97888 100.10412,109.08783 99.656251,105.03125 C 99.208371,100.97466 98.638841,96.740738 98.312501,92.9375 C 97.986141,89.134266 97.710991,85.927495 98.718751,82.8125 C 99.726491,79.697501 101.82033,77.235155 104.3125,74.34375 C 106.80466,71.452346 109.76095,68.369316 112.5,65.34375 C 115.23905,62.318181 117.76053,59.319356 119.3125,56.90625 C 120.67047,54.794782 120.91992,53.333062 121,53.125 C 120.8122,53.000764 119.71701,51.904061 117.375,51 C 114.6984,49.966787 110.90268,49.046347 106.90625,48.21875 C 102.90981,47.391152 98.717931,46.646129 95.000001,45.78125 C 91.282061,44.91637 88.151121,44.171009 85.500001,42.25 C 82.848871,40.328991 81.167271,37.576182 79.187501,34.3125 C 77.207731,31.048819 75.187321,27.28994 73.156251,23.75 C 71.125171,20.210059 69.065421,16.877947 67.250001,14.65625 C 65.661511,12.712264 64.301791,12.045423 64.125001,11.90625 z" id="path3743" sodipodi:nodetypes="cssssssssssssssscssssssscssssssscsssssssc" style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3385);stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1;filter:url(#filter3401)"/>
+ <path d="M 25.190679,119.77989 C 26.414679,122.74238 27.241162,124.11897 31.289475,123.31542 L 30.638356,120.21008 L 29.079766,120.3986 L 28.261711,118.57341 L 25.190679,119.77989 z" id="path3745" sodipodi:nodetypes="cccccc" style="opacity:0.7715356;fill:url(#linearGradient3934);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3928)" transform="matrix(-1,0,0,1,128.10515,0)"/>
+ <path d="M 26.03125,94.25 C 24.983755,105.1142 22.21942,119.85075 26.78125,123.15625 C 33.15283,127.7731 56.287818,110.82251 64.15625,110.8125 C 72.024682,110.80249 95.202691,127.69555 101.5625,123.0625 C 106.10279,119.75495 103.30815,105.10184 102.21875,94.25 L 98.34375,94.25 C 98.677864,97.707156 99.164649,101.42777 99.5625,105.03125 C 100.01038,109.08783 100.31178,112.97888 100.15625,115.84375 C 100.02016,118.35052 99.34151,119.69095 99.28125,119.90625 C 99.057443,119.89786 97.552762,120.17027 95.125,119.53125 C 92.350417,118.80093 88.723899,117.29504 85,115.625 C 81.276103,113.95497 77.426259,112.10169 73.90625,110.625 C 70.386242,109.1483 67.4302,107.93334 64.15625,107.9375 C 60.882303,107.94167 57.891241,109.1706 54.375,110.65625 C 50.858761,112.1419 47.032137,114.00799 43.3125,115.6875 C 39.592862,117.367 35.960216,118.85638 33.1875,119.59375 C 30.761373,120.23895 29.286908,119.99088 29.0625,120 C 29.004012,119.7864 28.29872,118.4439 28.15625,115.9375 C 27.993428,113.07303 28.281199,109.18271 28.71875,105.125 C 29.110886,101.48845 29.580993,97.733027 29.90625,94.25 L 26.03125,94.25 z" id="path3747" sodipodi:nodetypes="csssccsscssssssscsscc" style="opacity:1;fill:url(#radialGradient3267);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.80851269;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1;filter:url(#filter3285)"/>
+ <path d="M 3.96875,51.25 C 3.8072482,51.513327 3.653679,51.78066 3.5625,52.0625 C 1.4104994,58.714465 18.791507,72.91663 24.40625,81.25 C 25.066744,82.219734 25.881994,83.560003 26.151902,85.050699 C 27.656842,84.748586 29.576041,82.642021 28.90625,81.25 C 27.768648,78.87567 26.012193,76.796136 23.96875,74.4375 C 21.469238,71.552452 18.527988,68.487339 15.78125,65.46875 C 13.034512,62.450158 10.495601,59.471649 8.9375,57.0625 C 7.574162,54.954496 7.359205,53.457399 7.28125,53.25 C 7.2955626,53.33402 8.1966214,52.223338 10.53125,51.25 L 3.96875,51.25 z M 117.875,51.25 C 119.79897,52.094675 120.73559,53.012104 120.90625,53.125 C 120.82618,53.333062 120.57672,54.794782 119.21875,56.90625 C 117.66679,59.319356 115.1453,62.318181 112.40625,65.34375 C 109.66721,68.369316 106.71091,71.452346 104.21875,74.34375 C 102.16137,76.730721 100.3775,78.839259 99.25,81.25 C 98.389358,83.690958 101.19084,84.749904 102.08854,84.829728 C 102.41731,83.373922 103.07445,82.301223 103.75,81.25 C 109.28341,72.913848 126.77026,58.575986 124.59375,51.90625 C 124.52034,51.681299 124.39982,51.462951 124.28125,51.25 L 117.875,51.25 z" id="path3749" sodipodi:nodetypes="cscccssssccccssscccscc" style="opacity:0.84158415;fill:url(#radialGradient3300);fill-opacity:1;stroke:none;stroke-width:6.1420002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter3362)"/>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/application/resources/multimc/scalable/checkupdate.svg b/application/resources/multimc/scalable/checkupdate.svg
new file mode 100644
index 00000000..fc09cb4c
--- /dev/null
+++ b/application/resources/multimc/scalable/checkupdate.svg
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) --><svg height="48px" id="svg7270" inkscape:output_extension="org.inkscape.output.svg.inkscape" inkscape:version="0.46" sodipodi:docname="system-software-update.svg" sodipodi:version="0.32" width="48px" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <metadata>
+ <rdf:RDF xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <cc:Work rdf:about="">
+ <dc:title></dc:title>
+ <dc:description></dc:description>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>unsorted</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <dc:publisher>
+ <cc:Agent rdf:about="http://www.openclipart.org/">
+ <dc:title>Open Clip Art Library, Source: GNOME-Colors, Source: GNOME-Colors, Source: GNOME-Colors, Source: GNOME-Colors, Source: GNOME-Colors</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title></dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title></dc:title>
+ </cc:Agent>
+ </dc:rights>
+ <dc:date></dc:date>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <cc:license rdf:resource="http://creativecommons.org/licenses/GPL/2.0/"/>
+ <dc:language>en</dc:language>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id="defs7272">
+ <linearGradient id="linearGradient4873" inkscape:collect="always">
+ <stop id="stop4875" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop4877" offset="1" style="stop-color:#ffffff;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient gradientTransform="matrix(1.5436745,0,0,1.5436393,-63.017183,37.419463)" gradientUnits="userSpaceOnUse" id="linearGradient2704" inkscape:collect="always" x1="62.771355" x2="62.579906" xlink:href="#linearGradient4873" y1="-13.185048" y2="7.4599638"/>
+ <linearGradient id="linearGradient3811">
+ <stop id="stop3813" offset="0" style="stop-color:#42770c;stop-opacity:1"/>
+ <stop id="stop3815" offset="1" style="stop-color:#789e2d;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient gradientTransform="matrix(0.7287372,0,0,0.7287206,15.796514,14.228326)" gradientUnits="userSpaceOnUse" id="linearGradient3927" inkscape:collect="always" x1="15.046636" x2="15.046636" xlink:href="#linearGradient3811" y1="44.787998" y2="3.8851264"/>
+ <linearGradient id="linearGradient5106">
+ <stop id="stop5108" offset="0" style="stop-color:#a7cc5c;stop-opacity:1"/>
+ <stop id="stop5110" offset="1" style="stop-color:#789e2d;stop-opacity:1"/>
+ </linearGradient>
+ <radialGradient cx="62.200348" cy="-8.5060539" fx="62.200348" fy="-8.5060539" gradientTransform="matrix(-5.9025587,-9.7773057e-8,3.8757273e-8,-2.3442794,400.1412,4.1903282)" gradientUnits="userSpaceOnUse" id="radialGradient2707" inkscape:collect="always" r="9.7552834" xlink:href="#linearGradient5106"/>
+ <linearGradient id="linearGradient10691" inkscape:collect="always">
+ <stop id="stop10693" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop10695" offset="1" style="stop-color:#000000;stop-opacity:0;"/>
+ </linearGradient>
+ <radialGradient cx="6.702713" cy="73.615715" fx="6.702713" fy="73.615715" gradientTransform="scale(1.902215,0.525703)" gradientUnits="userSpaceOnUse" id="radialGradient3042" inkscape:collect="always" r="7.228416" xlink:href="#linearGradient10691"/>
+ <linearGradient id="linearGradient3540" inkscape:collect="always">
+ <stop id="stop3542" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop3544" offset="1" style="stop-color:#ffffff;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient7581" inkscape:collect="always" x1="322.26392" x2="329.12961" xlink:href="#linearGradient3540" y1="55.34375" y2="64.329506"/>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient7579" inkscape:collect="always" x1="325.65164" x2="328.24478" xlink:href="#linearGradient3497" y1="62.475075" y2="61.084908"/>
+ <linearGradient id="linearGradient7088">
+ <stop id="stop7090" offset="0" style="stop-color:#c17d11;stop-opacity:1;"/>
+ <stop id="stop7092" offset="1" style="stop-color:#e9b96e;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient gradientTransform="matrix(0.1516675,0,0,0.1638445,300.96358,54.165417)" gradientUnits="userSpaceOnUse" id="linearGradient7577" inkscape:collect="always" x1="251.94502" x2="161.94502" xlink:href="#linearGradient7088" y1="18.836056" y2="46.195984"/>
+ <linearGradient gradientTransform="matrix(0.8365572,0,0,1,52.219983,0)" gradientUnits="userSpaceOnUse" id="linearGradient7575" inkscape:collect="always" x1="334.77948" x2="327.34198" xlink:href="#linearGradient3582" y1="69.490768" y2="69.490768"/>
+ <linearGradient id="linearGradient3532" inkscape:collect="always">
+ <stop id="stop3534" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop3536" offset="1" style="stop-color:#ffffff;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient7573" inkscape:collect="always" x1="316.42142" x2="304.1875" xlink:href="#linearGradient3532" y1="58.144356" y2="67.203125"/>
+ <linearGradient id="linearGradient3516" inkscape:collect="always">
+ <stop id="stop3518" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop3520" offset="1" style="stop-color:#ffffff;stop-opacity:0;"/>
+ </linearGradient>
+ <radialGradient cx="318.26694" cy="81.264877" fx="318.26694" fy="81.264877" gradientTransform="matrix(11.694835,-3.1336215,0.2338827,0.8728621,-3435.8358,1012.645)" gradientUnits="userSpaceOnUse" id="radialGradient7571" inkscape:collect="always" r="15.375" xlink:href="#linearGradient3516"/>
+ <linearGradient id="linearGradient3497" inkscape:collect="always">
+ <stop id="stop3499" offset="0" style="stop-color:#c17d11;stop-opacity:1;"/>
+ <stop id="stop3501" offset="1" style="stop-color:#c17d11;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient7569" inkscape:collect="always" x1="317" x2="313.625" xlink:href="#linearGradient3497" y1="65.25" y2="62.475075"/>
+ <linearGradient id="linearGradient7000" inkscape:collect="always">
+ <stop id="stop7002" offset="0" style="stop-color:#eeeeec;stop-opacity:1"/>
+ <stop id="stop7005" offset="1" style="stop-color:#e9b96e;stop-opacity:1"/>
+ </linearGradient>
+ <radialGradient cx="93.23716" cy="132.00948" fx="93.23716" fy="132.00948" gradientTransform="matrix(0.194642,-0.362756,0.2778653,0.17262,263.08914,83.463419)" gradientUnits="userSpaceOnUse" id="radialGradient7567" inkscape:collect="always" r="48.719242" xlink:href="#linearGradient7000"/>
+ <linearGradient id="linearGradient3582" inkscape:collect="always">
+ <stop id="stop3584" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop3586" offset="1" style="stop-color:#000000;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient gradientTransform="matrix(0.914635,0,0,1,27.274119,0)" gradientUnits="userSpaceOnUse" id="linearGradient7565" inkscape:collect="always" x1="314.81003" x2="321.78522" xlink:href="#linearGradient3582" y1="69.553268" y2="69.490768"/>
+ <linearGradient id="linearGradient3757" inkscape:collect="always">
+ <stop id="stop3759" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop3761" offset="1" style="stop-color:#ffffff;stop-opacity:0;"/>
+ </linearGradient>
+ <radialGradient cx="321.375" cy="70.5" fx="321.375" fy="70.5" gradientTransform="matrix(1,0,0,0.4274194,0,40.366935)" gradientUnits="userSpaceOnUse" id="radialGradient7563" inkscape:collect="always" r="15.5" xlink:href="#linearGradient3757"/>
+ <linearGradient id="linearGradient3737">
+ <stop id="stop3739" offset="0" style="stop-color:#faefde;stop-opacity:1"/>
+ <stop id="stop3741" offset="0.68321055" style="stop-color:#e9b96e;stop-opacity:1"/>
+ <stop id="stop3743" offset="1" style="stop-color:#e9b96e;stop-opacity:0"/>
+ </linearGradient>
+ <radialGradient cx="320.7493" cy="70.499977" fx="320.7493" fy="70.499977" gradientTransform="matrix(1.1851374,0,0,0.1612901,-56.76846,59.129051)" gradientUnits="userSpaceOnUse" id="radialGradient7561" inkscape:collect="always" r="15.500023" xlink:href="#linearGradient3737"/>
+ <linearGradient id="linearGradient3712" inkscape:collect="always">
+ <stop id="stop3714" offset="0" style="stop-color:#e9b96e;stop-opacity:1;"/>
+ <stop id="stop3716" offset="1" style="stop-color:#e9b96e;stop-opacity:0;"/>
+ </linearGradient>
+ <radialGradient cx="321.7785" cy="96.847473" fx="321.7785" fy="96.847473" gradientTransform="matrix(4.6140944,0,0,0.6613562,-1154.7032,27.949324)" gradientUnits="userSpaceOnUse" id="radialGradient7559" inkscape:collect="always" r="15.5" xlink:href="#linearGradient3712"/>
+ <linearGradient id="linearGradient5967">
+ <stop id="stop5969" offset="0" style="stop-color:#c17d11;stop-opacity:1;"/>
+ <stop id="stop5971" offset="1" style="stop-color:#e9b96e;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient gradientTransform="matrix(0.1549758,0,0,0.1517241,299.35074,56.193103)" gradientUnits="userSpaceOnUse" id="linearGradient7557" inkscape:collect="always" x1="174.01562" x2="30" xlink:href="#linearGradient5967" y1="236" y2="64"/>
+ <linearGradient id="linearGradient6977">
+ <stop id="stop7039" offset="0" style="stop-color:#ebd3ad;stop-opacity:1;"/>
+ <stop id="stop6981" offset="1" style="stop-color:#e9b96e;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient gradientTransform="matrix(0.159975,0,0,0.1765787,298.70076,53.371862)" gradientUnits="userSpaceOnUse" id="linearGradient7555" inkscape:collect="always" x1="52" x2="52" xlink:href="#linearGradient6977" y1="40.482288" y2="76.67421"/>
+ <linearGradient id="linearGradient3703">
+ <stop id="stop3705" offset="0" style="stop-color:black;stop-opacity:0;"/>
+ <stop id="stop3711" offset="0.5" style="stop-color:black;stop-opacity:1;"/>
+ <stop id="stop3707" offset="1" style="stop-color:black;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient gradientTransform="matrix(1.179548,0,0,1,-4.219389,0)" gradientUnits="userSpaceOnUse" id="linearGradient7462" inkscape:collect="always" x1="17.554192" x2="17.554192" xlink:href="#linearGradient3703" y1="46.000275" y2="34.999718"/>
+ <radialGradient cx="5" cy="41.5" fx="5" fy="41.5" gradientTransform="matrix(0.99001,0,0,1.1,-14.88523,-86.15)" gradientUnits="userSpaceOnUse" id="radialGradient7460" inkscape:collect="always" r="5" xlink:href="#linearGradient3681"/>
+ <linearGradient id="linearGradient3681" inkscape:collect="always">
+ <stop id="stop3683" offset="0" style="stop-color:black;stop-opacity:1;"/>
+ <stop id="stop3685" offset="1" style="stop-color:black;stop-opacity:0;"/>
+ </linearGradient>
+ <radialGradient cx="5" cy="41.5" fx="5" fy="41.5" gradientTransform="matrix(0.990017,0,0,1.1,32.1147,-5.15)" gradientUnits="userSpaceOnUse" id="radialGradient7458" inkscape:collect="always" r="5" xlink:href="#linearGradient3681"/>
+ </defs>
+ <sodipodi:namedview bordercolor="#666666" borderopacity="1.0" id="base" inkscape:current-layer="layer1" inkscape:cx="24" inkscape:cy="24" inkscape:document-units="px" inkscape:grid-bbox="true" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-height="690" inkscape:window-width="641" inkscape:window-x="0" inkscape:window-y="331" inkscape:zoom="7" pagecolor="#ffffff" showgrid="true"/>
+ <g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1">
+ <g id="g3713" style="opacity:0.4" transform="matrix(1.000001,0,0,1.2727273,-5e-6,-12.545454)">
+ <rect height="11" id="rect1907" style="opacity:1;fill:url(#radialGradient7458);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:1" width="4.9352183" x="37.064781" y="35"/>
+ <rect height="11" id="rect3689" style="opacity:1;fill:url(#radialGradient7460);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:1" transform="scale(-1,-1)" width="4.9351835" x="-9.9351835" y="-46"/>
+ <rect height="11" id="rect3693" style="opacity:1;fill:url(#linearGradient7462);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.20000057;stroke-opacity:1" width="27.129599" x="9.9351835" y="35"/>
+ </g>
+ <g id="g4045" style="display:inline;enable-background:new" transform="translate(-296.00045,-50)">
+ <path d="M 322.875,54.40625 C 322.64926,54.465917 322.49407,54.672835 322.5,54.90625 L 322.59375,61.5 L 318.40625,61.5 L 318.4375,58.9375 C 318.44168,58.796741 318.39241,58.648956 318.28125,58.5625 C 318.17008,58.476044 318.0104,58.461295 317.875,58.5 L 306.5,61.5 C 306.35947,61.54996 306.25368,61.667506 306.21875,61.8125 L 306.15625,62.03125 C 306.05939,62.200213 305.96316,62.375835 305.90625,62.5625 L 303.5625,70.09375 C 303.51406,70.207689 303.5,70.305686 303.5,70.4375 C 303.4981,70.458668 303.5019,70.478889 303.5,70.5 L 303.5,90.84375 C 303.5,91.371002 303.93699,92.499999 304.46875,92.5 L 334.53125,92.5 C 335.06301,92.5 335.5,91.371004 335.5,90.84375 L 335.5,70.5 L 335.4375,70.09375 L 335.40625,70 C 335.40291,69.966972 335.41634,69.938782 335.40625,69.90625 L 332.9375,61.78125 C 332.9115,61.684204 332.85709,61.597145 332.78125,61.53125 L 323.3125,54.5 C 323.18929,54.402174 323.02747,54.367498 322.875,54.40625 z" id="path3678" sodipodi:nodetypes="cccccsccccccsccccccccccccc" style="fill:url(#linearGradient7555);fill-opacity:1;fill-rule:evenodd;stroke:#8f5902;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0.69999992;stroke-opacity:1;display:inline;enable-background:new"/>
+ <rect height="1" id="rect3606" style="opacity:0.18918918;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.50000001;stroke-opacity:1;display:inline;enable-background:new" width="23.340202" x="309" y="66"/>
+ <path d="M 304.92985,70 C 304.41471,70 304,70.406014 304,70.910345 L 304,90.482758 L 304,91.089654 C 304,91.593985 304.41471,91.999999 304.92985,92 L 334.07015,92 C 334.5853,92 335,91.593984 335,91.089654 L 335,70.910345 C 335,70.406014 334.5853,70 334.07015,70 L 304.92985,70 z" id="path3628" sodipodi:nodetypes="cccccccccc" style="fill:url(#linearGradient7557);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0.69999992;stroke-opacity:1;display:inline;enable-background:new"/>
+ <path d="M 304.92985,70 C 304.41471,70 304,70.406014 304,70.910345 L 304,90.482758 L 304,91.089654 C 304,91.593985 304.41471,91.999999 304.92985,92 L 334.07015,92 C 334.5853,92 335,91.593984 335,91.089654 L 335,70.910345 C 335,70.406014 334.5853,70 334.07015,70 L 304.92985,70 z" id="path3702" sodipodi:nodetypes="cccccccccc" style="opacity:0.81531528;fill:url(#radialGradient7559);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0.69999992;stroke-opacity:1;display:inline;enable-background:new"/>
+ <path d="M 304.71875,68 L 304.03125,70.25 C 304.03158,70.260414 304.03158,70.270836 304.03125,70.28125 C 304.00957,70.33225 304,70.341241 304,70.4375 C 304.00033,70.447914 304.00033,70.458336 304,70.46875 C 304.00297,70.435653 303.99952,70.489668 304,70.5 C 304.00048,70.510332 304.0049,70.47686 304,70.53125 L 304,73 L 335,73 L 335,70.5625 L 335,70.5 L 334.96875,70.25 L 334.9375,70.15625 L 334.28125,68 L 304.71875,68 z" id="path3723" style="opacity:0.5;fill:url(#radialGradient7561);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0.69999992;stroke-opacity:1;display:inline;enable-background:new"/>
+ <rect height="1" id="rect3746" style="opacity:0.62330568;fill:url(#radialGradient7563);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.50000001;stroke-opacity:1;display:inline;enable-background:new" width="31" x="304" y="70"/>
+ <path d="M 307.9375,61.90625 C 307.82039,61.90625 307.7549,61.954412 307.65625,62.09375 C 307.55761,62.233088 307.47013,62.458403 307.40625,62.6875 L 305.28125,70.09375 L 323.5,70.09375 L 323.5,61.90625 L 307.9375,61.90625 z" id="path3558" style="opacity:0.36936939;fill:url(#linearGradient7565);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0.69999992;stroke-opacity:1;display:inline;enable-background:new"/>
+ <rect height="1" id="rect3602" style="opacity:0.39639641;fill:#c17d11;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.50000001;stroke-opacity:1" width="23.340202" x="309" y="65"/>
+ <path d="M 317.875,59.09375 L 306.71875,62.03125 L 304.25,69.8125 L 317.75,66.875 L 317.875,59.09375 z" id="path3466" inkscape:original="M 318 58.9375 L 306.625 61.9375 L 304.0625 70 L 317.875 66.96875 L 318 58.9375 z " inkscape:radius="-0.11941363" sodipodi:type="inkscape:offset" style="fill:url(#radialGradient7567);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:new"/>
+ <path d="M 317.875,58.5 L 306.5,61.5 C 306.35947,61.54996 306.25368,61.667506 306.21875,61.8125 L 303.65625,69.875 C 303.61173,70.021945 303.64677,70.181469 303.74877,70.296228 C 303.85078,70.410987 304.0051,70.464488 304.15625,70.4375 L 317.96875,67.40625 C 318.1724,67.360088 318.31583,67.177536 318.3125,66.96875 L 318.4375,58.9375 C 318.44168,58.796741 318.37845,58.662433 318.2673,58.575977 C 318.15614,58.489521 318.0104,58.461295 317.875,58.5 L 317.875,58.5 z" id="path3489" inkscape:original="M 318 58.9375 L 306.625 61.9375 L 304.0625 70 L 317.875 66.96875 L 318 58.9375 z " inkscape:radius="0.44133759" sodipodi:type="inkscape:offset" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient7569);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:new"/>
+ <path d="M 323.65625,56.125 L 323.71875,61.46875 C 323.73018,61.77333 323.61637,62.069302 323.40382,62.287756 C 323.19127,62.506209 322.89853,62.628083 322.59375,62.625 L 318.40625,62.625 C 318.10702,62.627829 317.81923,62.510212 317.60763,62.298617 C 317.39604,62.087022 317.27842,61.799227 317.28125,61.5 L 317.3125,59.78125 L 307.1875,62.4375 C 307.18765,62.447916 307.18765,62.458334 307.1875,62.46875 C 307.1693,62.511683 307.14843,62.553432 307.125,62.59375 C 307.03546,62.749944 306.98033,62.837024 306.96875,62.875 C 306.9689,62.885416 306.9689,62.895834 306.96875,62.90625 L 304.625,70.4375 C 304.625,70.405959 304.63178,70.465233 304.625,70.5 L 304.625,70.53125 C 304.64058,70.357706 304.64449,70.377244 304.625,70.59375 L 304.625,90.84375 C 304.625,90.799502 304.68196,91.178267 304.78125,91.375 L 334.21875,91.375 C 334.31804,91.178267 334.375,90.799504 334.375,90.84375 L 334.375,70.5 L 334.375,70.4375 L 334.34375,70.34375 C 334.32611,70.272049 334.31564,70.198772 334.3125,70.125 L 331.9375,62.3125 L 323.65625,56.125 z" id="path3512" inkscape:original="M 322.875 54.40625 C 322.64926 54.465917 322.49407 54.672835 322.5 54.90625 L 322.59375 61.5 L 318.40625 61.5 L 318.4375 58.9375 C 318.44168 58.796741 318.39241 58.648956 318.28125 58.5625 C 318.17008 58.476044 318.0104 58.461295 317.875 58.5 L 306.5 61.5 C 306.35947 61.54996 306.25368 61.667506 306.21875 61.8125 L 306.15625 62.03125 C 306.05939 62.200213 305.96316 62.375835 305.90625 62.5625 L 303.5625 70.09375 C 303.51406 70.207689 303.5 70.305686 303.5 70.4375 C 303.4981 70.458668 303.5019 70.478889 303.5 70.5 L 303.5 90.84375 C 303.5 91.371002 303.93699 92.499999 304.46875 92.5 L 334.53125 92.5 C 335.06301 92.5 335.5 91.371004 335.5 90.84375 L 335.5 70.5 L 335.4375 70.09375 L 335.40625 70 C 335.40291 69.966972 335.41634 69.938782 335.40625 69.90625 L 332.9375 61.78125 C 332.9115 61.684204 332.85709 61.597145 332.78125 61.53125 L 323.3125 54.5 C 323.18929 54.402174 323.02747 54.367498 322.875 54.40625 z " inkscape:radius="-1.1144003" sodipodi:type="inkscape:offset" style="opacity:0.36936939;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient7571);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0.69999992;stroke-opacity:1;display:inline;enable-background:new"/>
+ <path d="M 317.5625,59.5 L 306.96875,62.28125 L 304.6875,69.40625 L 317.4375,66.59375 L 317.5625,59.5 z" id="path3524" inkscape:original="M 318 58.9375 L 306.625 61.9375 L 304.0625 70 L 317.875 66.96875 L 318 58.9375 z " inkscape:radius="-0.43543664" sodipodi:type="inkscape:offset" style="opacity:0.53153154;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient7573);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:new"/>
+ <path d="M 323.0625,61.90625 L 323.0625,70.09375 L 333.71875,70.09375 L 331.59375,62.5625 C 331.53244,62.342161 331.46293,62.136199 331.375,62.03125 C 331.28708,61.926301 331.20816,61.90625 331.0625,61.90625 L 323.0625,61.90625 z" id="path3593" style="opacity:0.36936939;fill:url(#linearGradient7575);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0.69999992;stroke-opacity:1;display:inline;enable-background:new"/>
+ <g id="g3562">
+ <path d="M 323,54.90625 L 323.125,63.03125 L 334.9375,70.0625 L 332.46875,61.9375 L 323,54.90625 z" id="path3468" inkscape:original="M 323 54.90625 L 323.125 63.03125 L 334.9375 70.0625 L 332.46875 61.9375 L 323 54.90625 z " inkscape:radius="-0.0019137046" sodipodi:type="inkscape:offset" style="fill:url(#linearGradient7577);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:new"/>
+ <path d="M 322.875,54.40625 C 322.64926,54.465917 322.49407,54.672835 322.5,54.90625 L 322.625,63.03125 C 322.62421,63.211268 322.71951,63.378038 322.875,63.46875 L 334.6875,70.5 C 334.86776,70.596275 335.08831,70.574158 335.24586,70.444006 C 335.40342,70.313855 335.46677,70.101441 335.40625,69.90625 L 332.9375,61.78125 C 332.9115,61.684204 332.85709,61.597145 332.78125,61.53125 L 323.3125,54.5 C 323.18929,54.402174 323.02747,54.367498 322.875,54.40625 z" id="path3491" inkscape:original="M 323 54.90625 L 323.125 63.03125 L 334.9375 70.0625 L 332.46875 61.9375 L 323 54.90625 z " inkscape:radius="0.50389111" sodipodi:type="inkscape:offset" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient7579);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:new"/>
+ <path d="M 323.46875,55.84375 L 323.59375,62.75 L 334.125,69.03125 L 332.03125,62.21875 L 323.46875,55.84375 z" id="path3526" inkscape:original="M 323 54.90625 L 323.125 63.03125 L 334.9375 70.0625 L 332.46875 61.9375 L 323 54.90625 z " inkscape:radius="-0.47827792" sodipodi:type="inkscape:offset" style="opacity:0.25225226;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient7581);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:new"/>
+ <path d="M 323,54.90625 L 323.125,63.03125 L 334.9375,70.0625 L 324.0625,62.81342 L 324,56.49908 L 332.46875,61.9375 L 323,54.90625 z" id="path3548" sodipodi:nodetypes="ccccccc" style="opacity:0.36936939;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:new"/>
+ </g>
+ <rect height="1" id="rect3604" style="opacity:0.20720723;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.50000001;stroke-opacity:1;display:inline;enable-background:new" width="3" x="319" y="62"/>
+ </g>
+ <path d="M 26.5,38.700001 A 13.75,3.8 0 1 1 -1,38.700001 A 13.75,3.8 0 1 1 26.5,38.700001 z" id="path2858" sodipodi:cx="12.75" sodipodi:cy="38.700001" sodipodi:rx="13.75" sodipodi:ry="3.8" sodipodi:type="arc" style="opacity:0.5;fill:url(#radialGradient3042);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" transform="matrix(1.0181818,0,0,1.0526316,20.018182,3.2631562)"/>
+ <path d="M 47.500174,31.999486 C 47.500174,40.007969 41.007746,46.500175 33.000183,46.500175 C 24.991885,46.500175 18.499825,40.007895 18.499825,31.999486 C 18.499825,23.99137 24.991885,17.499825 33.000183,17.499825 C 41.007746,17.499825 47.500174,23.99137 47.500174,31.999486 L 47.500174,31.999486 z" id="path6495" style="fill:url(#radialGradient2707);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3927);stroke-width:0.9996503;stroke-miterlimit:4;stroke-dasharray:none"/>
+ <path d="M 46.500204,31.99952 C 46.500204,39.455718 40.455512,45.500205 33.00017,45.500205 C 25.544146,45.500205 19.499795,39.45565 19.499795,31.99952 C 19.499795,24.543666 25.544146,18.499795 33.00017,18.499795 C 40.455512,18.499795 46.500204,24.543666 46.500204,31.99952 L 46.500204,31.99952 z" id="path8655" style="opacity:0.6;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient2704);stroke-width:0.99959099;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
+ <path d="M 23.5,32.5 L 33,22.5 L 42.5,32.5 L 36.75,32.5 L 36.75,41.5 L 29.25,41.5 L 29.25,32.5 L 23.5,32.5 z" id="path4236" sodipodi:nodetypes="cccccccc" style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"/>
+ </g>
+</svg>
diff --git a/application/resources/multimc/scalable/console.svg b/application/resources/multimc/scalable/console.svg
new file mode 100644
index 00000000..ec14ab68
--- /dev/null
+++ b/application/resources/multimc/scalable/console.svg
@@ -0,0 +1,228 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32px"
+ height="32px"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="console.svg"
+ inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/console.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs2987">
+ <linearGradient
+ id="linearGradient6244">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop6246" />
+ <stop
+ id="stop6254"
+ offset="0.4642857"
+ style="stop-color:#000000;stop-opacity:1" />
+ <stop
+ id="stop6252"
+ offset="0.53571427"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop6248" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6212">
+ <stop
+ style="stop-color:#959595;stop-opacity:1"
+ offset="0"
+ id="stop6214" />
+ <stop
+ id="stop6224"
+ offset="0.14849657"
+ style="stop-color:#b0b0b0;stop-opacity:1;" />
+ <stop
+ id="stop6220"
+ offset="0.41380492"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#cacaca;stop-opacity:1;"
+ offset="0.65110856"
+ id="stop6222" />
+ <stop
+ id="stop6228"
+ offset="0.87847149"
+ style="stop-color:#b0b0b0;stop-opacity:1;" />
+ <stop
+ style="stop-color:#969696;stop-opacity:1;"
+ offset="1"
+ id="stop6216" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6194"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#8e8e8e;stop-opacity:1;"
+ offset="0"
+ id="stop6196" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3050">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3052" />
+ <stop
+ id="stop3840"
+ offset="0.64285713"
+ style="stop-color:#164315;stop-opacity:1" />
+ <stop
+ id="stop3838"
+ offset="0.85714287"
+ style="stop-color:#24a91f;stop-opacity:1" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop3054" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3050"
+ id="linearGradient3056"
+ x1="15"
+ y1="16"
+ x2="15"
+ y2="2"
+ gradientUnits="userSpaceOnUse"
+ spreadMethod="reflect" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6212"
+ id="linearGradient6218"
+ x1="19.373737"
+ y1="18.689655"
+ x2="30.317204"
+ y2="31.204504"
+ gradientUnits="userSpaceOnUse"
+ spreadMethod="repeat" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6244"
+ id="linearGradient6250"
+ x1="2"
+ y1="2"
+ x2="30"
+ y2="30"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6244"
+ id="linearGradient6258"
+ gradientUnits="userSpaceOnUse"
+ x1="2"
+ y1="2"
+ x2="30"
+ y2="30"
+ gradientTransform="matrix(1.0666667,0,0,1.0666667,-33.066667,-33.066667)" />
+ <filter
+ inkscape:collect="always"
+ id="filter6272">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.32596875"
+ id="feGaussianBlur6274" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.5"
+ inkscape:cx="-151.66767"
+ inkscape:cy="-123.35228"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1607"
+ inkscape:window-height="1030"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2995"
+ empspacing="2"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata2990">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ id="rect2993"
+ width="32"
+ height="32"
+ x="-1.9984014e-15"
+ y="4.4408921e-16"
+ ry="2.6666667" />
+ <rect
+ style="fill:url(#linearGradient3056);fill-opacity:1;stroke:none"
+ id="rect2993-1"
+ width="28"
+ height="28"
+ x="2"
+ y="2"
+ ry="2.3333333" />
+ <g
+ style="font-size:85.93203735px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#00ff00;fill-opacity:1;stroke:none;font-family:Sans"
+ id="text3001">
+ <path
+ style="font-size:45.2372551px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;filter:url(#filter6272);font-family:Sans"
+ d="m 7.4824597,10.427541 2.2812496,5.78125 0.2812497,-0.71875 -1.9999993,-5.0625 -0.5625,0 z m 8.4687493,0 0,11.34375 -1.875,0 0,0.65625 2.6875,0 0,-12 -0.8125,0 z m 11.625,0.3125 0,2.21875 c -0.5312,-0.3906 -1.046212,-0.693063 -1.5625,-0.875 -0.516305,-0.181918 -1.054102,-0.24999 -1.625,-0.25 -1.022671,10e-6 -1.820457,0.324952 -2.40625,1.03125 -0.585803,0.706316 -0.875004,1.696118 -0.875,2.9375 -4e-6,1.236043 0.289197,2.199946 0.875,2.90625 0.23333,0.281334 0.509858,0.486976 0.8125,0.65625 -0.585803,-0.706304 -0.875004,-1.670207 -0.875,-2.90625 -4e-6,-1.241382 0.289197,-2.231184 0.875,-2.9375 0.585793,-0.706298 1.383579,-1.06249 2.40625,-1.0625 0.570898,10e-6 1.139945,0.09933 1.65625,0.28125 0.516288,0.181937 1.0313,0.45315 1.5625,0.84375 l 0,-2.46875 c -0.271888,-0.152046 -0.55994,-0.261514 -0.84375,-0.375 z m -21.2812493,2.28125 0,8.75 -1.875,0 0,0.65625 2.71875,0 0,-7.28125 -0.84375,-2.125 z m 6.9374993,0 -2.5625,6.46875 -1.2187493,0 0.2499996,0.625 1.8124997,0 1.71875,-4.34375 0,-2.75 z m 15.1875,6.25 c -0.287318,0.211276 -0.560795,0.412277 -0.84375,0.5625 l 0,1.28125 c -0.526236,0.294295 -1.054104,0.537677 -1.625,0.6875 -0.570913,0.149823 -1.191958,0.21875 -1.8125,0.21875 -1.332472,0 -2.440972,-0.298702 -3.375,-0.875 1.063521,0.998245 2.465058,1.5 4.21875,1.5 0.620542,0 1.210337,-0.06893 1.78125,-0.21875 0.570896,-0.149823 1.130014,-0.361955 1.65625,-0.65625 l 0,-2.5 z"
+ id="text3022"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:45.2372551px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#00ff00;fill-opacity:1;stroke:none;font-family:Sans"
+ x="2.7196128"
+ y="21.15748"
+ id="text3014"
+ sodipodi:linespacing="125%"
+ transform="scale(0.9632149,1.0381899)"><tspan
+ sodipodi:role="line"
+ id="tspan3016"
+ x="2.7196128"
+ y="21.15748"
+ style="font-size:15.83304024000000076px;font-weight:bold;-inkscape-font-specification:Bitstream Vera Sans Bold;font-family:Bitstream Vera Sans;font-style:normal;font-stretch:normal;font-variant:normal">MC</tspan></text>
+ </g>
+ </g>
+</svg>
diff --git a/application/resources/multimc/scalable/console_error.svg b/application/resources/multimc/scalable/console_error.svg
new file mode 100644
index 00000000..a71c6b35
--- /dev/null
+++ b/application/resources/multimc/scalable/console_error.svg
@@ -0,0 +1,247 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32px"
+ height="32px"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="console_error.svg"
+ inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/console_error.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs2987">
+ <linearGradient
+ id="linearGradient6244">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop6246" />
+ <stop
+ id="stop6254"
+ offset="0.4642857"
+ style="stop-color:#000000;stop-opacity:1" />
+ <stop
+ id="stop6252"
+ offset="0.53571427"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop6248" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6212">
+ <stop
+ style="stop-color:#959595;stop-opacity:1"
+ offset="0"
+ id="stop6214" />
+ <stop
+ id="stop6224"
+ offset="0.14849657"
+ style="stop-color:#b0b0b0;stop-opacity:1;" />
+ <stop
+ id="stop6220"
+ offset="0.41380492"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#cacaca;stop-opacity:1;"
+ offset="0.65110856"
+ id="stop6222" />
+ <stop
+ id="stop6228"
+ offset="0.87847149"
+ style="stop-color:#b0b0b0;stop-opacity:1;" />
+ <stop
+ style="stop-color:#969696;stop-opacity:1;"
+ offset="1"
+ id="stop6216" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6194"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#8e8e8e;stop-opacity:1;"
+ offset="0"
+ id="stop6196" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3050">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3052" />
+ <stop
+ id="stop3840"
+ offset="0.64285713"
+ style="stop-color:#431515;stop-opacity:1;" />
+ <stop
+ id="stop3838"
+ offset="0.85714287"
+ style="stop-color:#a91f1f;stop-opacity:1;" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop3054" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3050"
+ id="linearGradient3056"
+ x1="15"
+ y1="16"
+ x2="15"
+ y2="2"
+ gradientUnits="userSpaceOnUse"
+ spreadMethod="reflect" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6244"
+ id="linearGradient6250"
+ x1="2"
+ y1="2"
+ x2="30"
+ y2="30"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6244"
+ id="linearGradient6258"
+ gradientUnits="userSpaceOnUse"
+ x1="2"
+ y1="2"
+ x2="30"
+ y2="30"
+ gradientTransform="matrix(1.0666667,0,0,1.0666667,-33.066667,-33.066667)" />
+ <filter
+ inkscape:collect="always"
+ id="filter6373">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.64"
+ id="feGaussianBlur6375" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4142136"
+ inkscape:cx="149.24645"
+ inkscape:cy="89.508966"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1607"
+ inkscape:window-height="1030"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2995"
+ empspacing="2"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata2990">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ id="rect2993"
+ width="32"
+ height="32"
+ x="-1.9984014e-15"
+ y="4.4408921e-16"
+ ry="2.6666667" />
+ <rect
+ style="fill:url(#linearGradient3056);fill-opacity:1;stroke:none"
+ id="rect2993-1"
+ width="28"
+ height="28"
+ x="2"
+ y="2"
+ ry="2.3333333" />
+ <g
+ style="font-size:85.93203735px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#00ff00;fill-opacity:1;stroke:none;font-family:Sans"
+ id="text3001" />
+ <g
+ id="g6331"
+ transform="translate(6,-7)">
+ <rect
+ style="fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter6373)"
+ id="rect6363"
+ width="16"
+ height="16"
+ x="8"
+ y="8"
+ transform="translate(-6,7)" />
+ <path
+ id="path6377"
+ d="m 4,17 0,4 4,0 0,-4 z"
+ style="fill:#800000;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#800000;fill-opacity:1;stroke:none"
+ d="m 8,21 0,2 -2,0 0,6 2,0 0,-2 4,0 0,2 2,0 0,-6 -2,0 0,-2 z"
+ id="path6379"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ style="fill:#800000;fill-opacity:1;stroke:none"
+ d="m 12,17 0,4 4,0 0,-4 z"
+ id="path6381" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ style="fill:#ff0000;fill-opacity:1;stroke:none"
+ d="m 6,19 0,2 2,0 0,-2 z"
+ id="path6383" />
+ <path
+ id="path6385"
+ d="m 12,19 0,2 2,0 0,-2 z"
+ style="fill:#ff0000;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path6387"
+ d="m 8,23 0,2 -2,0 0,4 2,0 0,-2 4,0 0,2 2,0 0,-4 -2,0 0,-2 z"
+ style="fill:#ff0000;fill-opacity:1;stroke:none" />
+ </g>
+ </g>
+</svg>
diff --git a/application/resources/multimc/scalable/java.svg b/application/resources/multimc/scalable/java.svg
new file mode 100644
index 00000000..fd15e5c6
--- /dev/null
+++ b/application/resources/multimc/scalable/java.svg
@@ -0,0 +1,773 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="160.00024"
+ height="159.99788"
+ id="svg12972"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="java.svg">
+ <defs
+ id="defs12974">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3935">
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="0"
+ id="stop3937" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1"
+ id="stop3939" />
+ </linearGradient>
+ <linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0,-126.08191,-126.08191,0,113.7417,390.27905)"
+ spreadMethod="pad"
+ id="linearGradient1722">
+ <stop
+ style="stop-opacity:1;stop-color:#dfe3e5"
+ offset="0"
+ id="stop1724" />
+ <stop
+ style="stop-opacity:1;stop-color:#bcc5ca"
+ offset="1"
+ id="stop1726" />
+ </linearGradient>
+ <linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0,68.061096,68.061096,0,113.7417,266.44751)"
+ spreadMethod="pad"
+ id="linearGradient1760">
+ <stop
+ style="stop-opacity:1;stop-color:#ffffff"
+ offset="0"
+ id="stop1762" />
+ <stop
+ style="stop-opacity:1;stop-color:#000000"
+ offset="1"
+ id="stop1764" />
+ </linearGradient>
+ <linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0,-21.014618,-21.014618,0,113.7417,386.83423)"
+ spreadMethod="pad"
+ id="linearGradient1798">
+ <stop
+ style="stop-opacity:1;stop-color:#ffffff"
+ offset="0"
+ id="stop1800" />
+ <stop
+ style="stop-opacity:1;stop-color:#000000"
+ offset="1"
+ id="stop1802" />
+ </linearGradient>
+ <linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0,-126.08191,-126.08191,0,113.7417,390.27905)"
+ spreadMethod="pad"
+ id="linearGradient1722-2">
+ <stop
+ style="stop-opacity:1;stop-color:#dfe3e5"
+ offset="0"
+ id="stop1724-7" />
+ <stop
+ style="stop-opacity:1;stop-color:#bcc5ca"
+ offset="1"
+ id="stop1726-8" />
+ </linearGradient>
+ <linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0,68.061096,68.061096,0,113.7417,266.44751)"
+ spreadMethod="pad"
+ id="linearGradient1760-4">
+ <stop
+ style="stop-opacity:1;stop-color:#ffffff"
+ offset="0"
+ id="stop1762-0" />
+ <stop
+ style="stop-color:#838383;stop-opacity:1;"
+ offset="1"
+ id="stop1764-8" />
+ </linearGradient>
+ <linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0,-21.014618,-21.014618,0,113.7417,386.83423)"
+ spreadMethod="pad"
+ id="linearGradient1798-6">
+ <stop
+ style="stop-opacity:1;stop-color:#ffffff"
+ offset="0"
+ id="stop1800-8" />
+ <stop
+ style="stop-opacity:1;stop-color:#000000"
+ offset="1"
+ id="stop1802-6" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1722-2"
+ id="linearGradient3923"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0,-126.08191,-126.08191,0,113.7417,390.27905)"
+ spreadMethod="pad"
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1760-4"
+ id="linearGradient3933"
+ x1="113.341"
+ y1="267.14597"
+ x2="114.54707"
+ y2="417.25464"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3935"
+ id="linearGradient3941"
+ x1="112.53288"
+ y1="365.57138"
+ x2="112.52676"
+ y2="386.9866"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1760-4"
+ id="linearGradient3943"
+ gradientUnits="userSpaceOnUse"
+ x1="113.341"
+ y1="267.14597"
+ x2="114.54707"
+ y2="417.25464" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1760-4"
+ id="linearGradient3945"
+ gradientUnits="userSpaceOnUse"
+ x1="113.341"
+ y1="267.14597"
+ x2="114.54707"
+ y2="417.25464" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1760-4"
+ id="linearGradient3947"
+ gradientUnits="userSpaceOnUse"
+ x1="113.341"
+ y1="267.14597"
+ x2="114.54707"
+ y2="417.25464" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1760-4"
+ id="linearGradient3949"
+ gradientUnits="userSpaceOnUse"
+ x1="113.341"
+ y1="267.14597"
+ x2="114.54707"
+ y2="417.25464" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1760-4"
+ id="linearGradient3951"
+ gradientUnits="userSpaceOnUse"
+ x1="113.341"
+ y1="267.14597"
+ x2="114.54707"
+ y2="417.25464" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1760-4"
+ id="linearGradient3953"
+ gradientUnits="userSpaceOnUse"
+ x1="113.341"
+ y1="267.14597"
+ x2="114.54707"
+ y2="417.25464" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1760-4"
+ id="linearGradient3955"
+ gradientUnits="userSpaceOnUse"
+ x1="113.341"
+ y1="267.14597"
+ x2="114.54707"
+ y2="417.25464" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3935"
+ id="linearGradient3957"
+ gradientUnits="userSpaceOnUse"
+ x1="112.53288"
+ y1="365.57138"
+ x2="112.52676"
+ y2="386.9866" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3935"
+ id="linearGradient3961"
+ gradientUnits="userSpaceOnUse"
+ x1="112.53288"
+ y1="365.57138"
+ x2="112.52676"
+ y2="386.9866" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3935"
+ id="linearGradient3963"
+ gradientUnits="userSpaceOnUse"
+ x1="112.53288"
+ y1="365.57138"
+ x2="112.52676"
+ y2="386.9866" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3935"
+ id="linearGradient3965"
+ gradientUnits="userSpaceOnUse"
+ x1="112.53288"
+ y1="365.57138"
+ x2="112.52676"
+ y2="386.9866" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3935"
+ id="linearGradient3967"
+ gradientUnits="userSpaceOnUse"
+ x1="112.53288"
+ y1="365.57138"
+ x2="112.52676"
+ y2="386.9866" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3935"
+ id="linearGradient3969"
+ gradientUnits="userSpaceOnUse"
+ x1="112.53288"
+ y1="365.57138"
+ x2="112.52676"
+ y2="386.9866" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3935"
+ id="linearGradient3971"
+ gradientUnits="userSpaceOnUse"
+ x1="112.53288"
+ y1="365.57138"
+ x2="112.52676"
+ y2="386.9866" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3935"
+ id="linearGradient3973"
+ gradientUnits="userSpaceOnUse"
+ x1="112.53288"
+ y1="365.57138"
+ x2="112.52676"
+ y2="386.9866" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1760-4-8"
+ id="linearGradient3943-2"
+ gradientUnits="userSpaceOnUse"
+ x1="113.341"
+ y1="267.14597"
+ x2="114.54707"
+ y2="417.25464" />
+ <linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0,68.061096,68.061096,0,113.7417,266.44751)"
+ spreadMethod="pad"
+ id="linearGradient1760-4-8">
+ <stop
+ style="stop-opacity:1;stop-color:#ffffff"
+ offset="0"
+ id="stop1762-0-6" />
+ <stop
+ style="stop-opacity:1;stop-color:#000000"
+ offset="1"
+ id="stop1764-8-4" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1760-4"
+ id="linearGradient4033"
+ gradientUnits="userSpaceOnUse"
+ x1="113.341"
+ y1="267.14597"
+ x2="113.94098"
+ y2="387.35413" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.979899"
+ inkscape:cx="-0.08087368"
+ inkscape:cy="54.594259"
+ inkscape:document-units="px"
+ inkscape:current-layer="g1676-6"
+ showgrid="false"
+ showborder="true"
+ borderlayer="false"
+ inkscape:showpageshadow="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1613"
+ inkscape:window-height="1026"
+ inkscape:window-x="1677"
+ inkscape:window-y="-4"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid14007"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ originx="-3.4602454px"
+ originy="2.8306126px"
+ spacingx="8px"
+ spacingy="8px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata12977">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-269.17466,-423.7599)">
+ <g
+ transform="matrix(1.25,0,0,-1.25,203.53691,909.61217)"
+ id="g1674">
+ <g
+ id="g1676"
+ clip-path="url(#clipPath1678)">
+ <g
+ transform="translate(2.7683963,-2.2641865)"
+ id="g1674-5">
+ <g
+ id="g1676-6"
+ clip-path="url(#clipPath1678)">
+ <path
+ id="path3993"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ d="m 71.121479,387.39443 c -9.563,0 -17.336,-7.8193 -17.336,-17.42155 l 0,0 0,-85.75999 c 0,-9.61029 7.773,-17.42255 17.336,-17.42255 l 0,0 85.327991,0 c 9.562,0 17.336,7.81226 17.336,17.42255 l 0,0 0,85.75999 c 0,9.60225 -7.774,17.42155 -17.336,17.42155 l 0,0 z"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sccsccsccsccs" />
+ <g
+ id="g1682">
+ <g
+ id="g1684" />
+ <g
+ id="g1694">
+ <g
+ clip-path="url(#clipPath1686)"
+ id="g1696">
+ <g
+ id="g1698">
+ <g
+ clip-path="url(#clipPath1690)"
+ id="g1700">
+ <g
+ transform="translate(156.4058,390.9377)"
+ id="g1702">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -85.328,0 c -11.735,0 -21.336,-9.6 -21.336,-21.334 l 0,-85.32 c 0,-11.742 9.601,-21.336 21.336,-21.336 l 85.328,0 c 11.734,0 21.336,9.594 21.336,21.336 l 0,85.32 C 21.336,-9.6 11.734,0 0,0 m 0,-1 c 11.211,0 20.336,-9.123 20.336,-20.334 l 0,-85.32 c 0,-11.219 -9.125,-20.336 -20.336,-20.336 l -85.328,0 c -11.215,0 -20.336,9.117 -20.336,20.336 l 0,85.32 c 0,11.211 9.121,20.334 20.336,20.334 L 0,-1"
+ style="fill:#b3b1b3;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1704" />
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g
+ id="g1706-5">
+ <g
+ id="g1708-7" />
+ <g
+ id="g1728-8">
+ <g
+ clip-path="url(#clipPath1710)"
+ id="g1730-3">
+ <g
+ id="g1732-3">
+ <g
+ clip-path="url(#clipPath1714)"
+ id="g1734-1">
+ <g
+ id="g1736-0">
+ <g
+ id="g1738-5">
+ <g
+ clip-path="url(#clipPath1718)"
+ id="g1740-7">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 71.078,390.946 c -11.735,0 -21.336,-9.6 -21.336,-21.334 l 0,0 0,-85.329 c 0,-11.742 9.601,-21.335 21.336,-21.335 l 0,0 85.328,0 c 11.734,0 21.336,9.593 21.336,21.335 l 0,0 0,85.329 c 0,11.734 -9.602,21.334 -21.336,21.334 l 0,0 -85.328,0 z m -17.336,-106.663 0,85.329 c 0,9.554 7.773,17.334 17.336,17.334 l 0,0 85.328,0 c 9.562,0 17.336,-7.78 17.336,-17.334 l 0,0 0,-85.329 c 0,-9.562 -7.774,-17.335 -17.336,-17.335 l 0,0 -85.328,0 c -9.563,0 -17.336,7.773 -17.336,17.335"
+ style="fill:url(#linearGradient3923);stroke:none"
+ id="path1742-8" />
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g
+ id="g1744-9">
+ <g
+ id="g1746-7" />
+ <g
+ id="g1766-3"
+ style="fill:url(#linearGradient4033);fill-opacity:1">
+ <g
+ style="opacity:0.69999701;fill:url(#linearGradient3955);fill-opacity:1"
+ clip-path="url(#clipPath1748)"
+ id="g1768-8">
+ <g
+ id="g1770-7"
+ style="fill:url(#linearGradient3953);fill-opacity:1">
+ <g
+ clip-path="url(#clipPath1752)"
+ id="g1772-5"
+ style="fill:url(#linearGradient3951);fill-opacity:1">
+ <g
+ id="g1774-4"
+ style="fill:url(#linearGradient3949);fill-opacity:1">
+ <g
+ id="g1776-9"
+ style="fill:url(#linearGradient3947);fill-opacity:1">
+ <g
+ clip-path="url(#clipPath1756)"
+ id="g1778-9"
+ style="fill:url(#linearGradient3945);fill-opacity:1">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 71.078,386.946 c -9.563,0 -17.336,-7.78 -17.336,-17.334 l 0,0 0,-85.329 c 0,-9.562 7.773,-17.335 17.336,-17.335 l 0,0 85.328,0 c 9.562,0 17.336,7.773 17.336,17.335 l 0,0 0,85.329 c 0,9.554 -7.774,17.334 -17.336,17.334 l 0,0 -85.328,0 z m -13.336,-102.663 0,85.329 c 0,7.351 5.984,13.336 13.336,13.336 l 0,0 85.328,0 c 7.351,0 13.336,-5.985 13.336,-13.336 l 0,0 0,-85.329 c 0,-7.351 -5.985,-13.335 -13.336,-13.335 l 0,0 -85.328,0 c -7.352,0 -13.336,5.984 -13.336,13.335"
+ style="fill:url(#linearGradient3943);fill-opacity:1;stroke:none"
+ id="path1780-1" />
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g
+ id="g1820-4"
+ transform="translate(99.772903,299.7866)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c -2.18,-0.91 -2.281,-0.98 -4.141,-2.281 -0.148,-0.223 -0.613,-2.258 1.102,-3.602 2.082,-1.633 7.559,-3.285 15.098,-3.285 4.445,0 11.136,0.598 17.898,3.434 l -0.129,0.882 c -3.148,-0.57 -6.539,-0.843 -10.34,-0.843 -5.386,0 -10.515,0.539 -16.183,1.187 -2.727,0.309 -4.086,0.895 -4.282,1.836 -0.148,0.692 0.414,1.289 0.852,1.641 -0.07,0.281 0.02,0.633 0.117,1 0,0.008 0,0.023 0.008,0.031 m 12.059,-9.969 c -6.692,0 -12.957,1.391 -15.59,3.457 -1.414,1.106 -1.586,2.551 -1.567,3.317 0.016,0.601 0.18,1.343 0.5,1.57 2.02,1.414 2.067,1.437 4.754,2.539 L 0.391,0.965 C 0.543,0.965 0.68,0.898 0.773,0.781 0.961,0.539 0.879,0.215 0.766,-0.23 0.719,-0.406 0.633,-0.734 0.648,-0.836 0.641,-0.766 0.543,-0.668 0.434,-0.668 l 0.308,-0.73 c -0.422,-0.243 -1.008,-0.766 -0.937,-1.11 0.039,-0.191 0.422,-0.844 3.593,-1.211 5.641,-0.64 10.743,-1.179 16.09,-1.179 3.918,0 7.383,0.296 10.598,0.906 l 0.469,-0.336 0.242,-1.594 -0.242,-0.426 C 23.57,-9.34 16.641,-9.969 12.059,-9.969"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1822-3" />
+ </g>
+ <g
+ id="g1824-2"
+ transform="translate(100.3159,298.73581)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,0 -3.941,-2.289 2.809,-3.063 8.175,-0.933 17.8,-1.976 26.808,-0.269 l 0.238,-1.598 c -13.5,-5.785 -29.367,-3.609 -33.687,-0.215 -2.016,1.586 -1.367,4.043 -1.078,4.243 2,1.398 2,1.398 4.672,2.5 C 0.359,1.84 -0.801,-0.223 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1826-2" />
+ </g>
+ <g
+ id="g1828-6"
+ transform="translate(97.741699,311.24749)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c -0.293,-0.156 -0.641,-0.32 -1.016,-0.492 -2.539,-1.18 -4.589,-2.36 -3.949,-4.93 0.457,-1.84 6.442,-3.797 16.621,-3.797 7.43,0 15.282,1.086 22.149,3.059 l -0.121,0.84 c -4.723,-0.883 -9.606,-1.313 -14.914,-1.313 -6.184,0 -11.832,0.586 -16.372,1.055 -2.457,0.25 -3.785,0.871 -4.062,1.89 C -2,-2.477 -0.641,-1.289 -0.23,-0.965 -0.098,-0.594 -0.016,-0.223 0,0 m 11.656,-10.016 c -8.113,0 -16.64,1.36 -17.398,4.399 -0.852,3.422 2.304,4.883 4.39,5.851 0.383,0.18 0.739,0.344 1.032,0.5 C 0.094,0.961 0.461,0.898 0.656,0.617 0.992,0.133 0.645,-0.922 0.477,-1.352 L 0.344,-1.531 c -0.383,-0.285 -1.43,-1.25 -1.239,-1.946 0.102,-0.367 0.676,-1.031 3.372,-1.304 C 7,-5.25 12.629,-5.832 18.77,-5.832 c 5.41,0 10.371,0.449 15.171,1.371 l 0.473,-0.332 0.234,-1.598 -0.281,-0.441 c -7.023,-2.055 -15.09,-3.184 -22.711,-3.184"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1830-5" />
+ </g>
+ <g
+ id="g1832-4"
+ transform="translate(97.847199,310.0366)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,0 -4.426,-3.273 2.332,-3.969 8.734,-0.906 19.641,-1.969 31.578,0.328 l 0.238,-1.593 c -18.253,-5.344 -38.582,-3.18 -39.605,0.925 -0.922,3.7 3.383,4.899 5.219,5.903 C 0.613,2.063 0.246,0.641 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1834-7" />
+ </g>
+ <g
+ id="g1836-0"
+ transform="translate(136.40581,358.5717)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c -0.09,0 -0.25,-0.031 -0.512,-0.18 -0.707,-0.402 -1.515,-0.84 -2.394,-1.312 -6.344,-3.43 -16.961,-9.168 -18.367,-16.887 -0.633,-3.465 0.656,-7.07 3.828,-10.726 2.808,-3.231 0.652,-6.844 -0.633,-9 l -0.242,-0.407 c -0.328,-0.562 -0.446,-0.922 -0.481,-1.148 1.52,0.879 6.508,4.047 7.524,8.23 0.461,1.907 0.035,3.801 -1.27,5.637 l -0.687,0.957 c -2.258,3.137 -4.207,5.84 -3.532,9.004 0.86,4.023 5.973,8.508 17.082,14.969 C 0.32,-0.574 0.273,-0.207 0.141,-0.059 0.109,-0.023 0.074,0 0,0 m -18.871,-40.613 -0.324,0.183 -0.11,-0.136 c -0.234,0.187 -0.679,0.804 0.293,2.461 l 0.246,0.41 c 1.25,2.097 3.145,5.269 0.719,8.066 -3.34,3.844 -4.691,7.68 -4.016,11.391 1.477,8.101 12.305,13.953 18.774,17.449 0.875,0.473 1.68,0.91 2.383,1.305 0.699,0.402 1.273,0.371 1.644,-0.043 0.469,-0.524 0.375,-1.508 0.364,-1.618 L 0.906,-1.449 c -10.879,-6.309 -16.086,-10.797 -16.89,-14.555 -0.602,-2.812 1.164,-5.262 3.398,-8.363 l 0.688,-0.961 c 1.445,-2.035 1.914,-4.152 1.398,-6.293 -1.281,-5.281 -8.082,-8.844 -8.371,-8.992"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1838-3" />
+ </g>
+ <g
+ id="g1840-7"
+ transform="translate(118.6597,329.2006)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 2.793,-3.211 0.277,-6.891 -0.918,-8.938 -0.937,-1.597 -0.391,-1.945 -0.391,-1.945 0,0 12.641,6.524 6.832,14.696 -5.421,7.617 -9.574,11.402 12.926,24.457 0,0 0.242,2.207 -1.414,1.269 C 8.871,24.93 -13.129,15.133 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1842-9" />
+ </g>
+ <g
+ id="g1844-3"
+ transform="translate(90.905807,292.3256)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c -4.941,-0.07 -14.234,-4.152 -14.438,-6.926 -0.078,-1.09 1.547,-1.957 4.571,-2.449 10.109,-1.641 20.023,-2.469 29.476,-2.469 20.106,0 34.25,3.938 36.305,7.746 0.219,0.403 0.289,0.793 0.203,1.168 -0.676,-0.711 -2.32,-1.84 -6.316,-3.054 -6.61,-2 -21.028,-3.454 -34.289,-3.454 -10.922,0 -19.16,0.969 -23.196,2.719 -0.918,0.403 -1.355,0.91 -1.293,1.508 0.204,2.047 6.704,3.531 6.766,3.547 1.633,0.351 2.777,0.41 3.336,0.414 0.055,0.328 0,0.617 -0.16,0.836 C 0.773,-0.148 0.43,0 0,0 m 19.609,-12.648 0,0 c -9.492,0 -19.453,0.835 -29.601,2.484 -3.594,0.582 -5.36,1.691 -5.242,3.297 0.257,3.508 10.101,7.594 15.195,7.664 0.734,0 1.305,-0.262 1.652,-0.738 0.356,-0.497 0.43,-1.004 0.207,-1.696 l -0.41,-0.129 -0.238,0 c -0.512,0 -1.61,-0.195 -3.211,-0.539 -2.414,-0.519 -6.055,-2.011 -6.145,-2.914 -0.019,-0.199 0.286,-0.496 0.821,-0.726 3.933,-1.715 12.058,-2.676 22.875,-2.676 13.191,0 27.511,1.432 34.058,3.412 5.657,1.719 6.231,3.202 6.235,3.218 l 0.718,0.105 c 0.54,-0.817 0.571,-1.717 0.094,-2.592 -2.137,-3.961 -15.836,-8.17 -37.008,-8.17"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1846-0" />
+ </g>
+ <g
+ id="g1848-9"
+ transform="translate(147.09331,290.21631)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,0 -0.367,-1.629 -6.5,-3.492 -11.664,-3.531 -46.965,-5.203 -57.211,-0.75 -3.68,1.605 3.227,3.828 5.398,4.297 2.266,0.484 3.563,0.398 3.563,0.398 0.375,1.141 -0.242,2.07 -1.469,2.055 C -63.281,2.406 -78.988,-5.57 -66.117,-7.664 -24.926,-14.34 3.961,-6.043 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1850-0" />
+ </g>
+ <g
+ id="g1852-7"
+ transform="translate(101.40581,322.55999)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -0.133,0 c -2.879,0 -10.93,-1.609 -16.5,-4.305 -0.695,-0.336 -0.59,-0.871 -0.383,-1.672 0.055,-0.214 0.094,-0.351 0.102,-0.484 0.086,-1.477 7.898,-3.043 20.367,-3.043 9.969,0 19.508,1.014 26.188,2.764 1.078,0.742 2.308,1.913 3.187,2.8 C 30.172,-4.851 24.617,-6.55 19.008,-7.023 13.605,-7.476 7.953,-7.724 3.09,-7.724 c -3.746,0 -6.848,0.153 -8.981,0.434 -3.007,0.406 -4.371,1 -4.418,1.938 -0.105,2.059 7.961,4.188 10.801,4.872 0.059,0.234 0.094,0.355 -0.019,0.523 C 0.398,0.148 0.242,0 0,0 m 3.453,-10.281 c -2.14,0 -20.953,0.109 -21.164,3.82 -0.004,0.102 -0.043,0.231 -0.082,0.383 -0.168,0.664 -0.527,2.047 0.813,2.695 5.73,2.774 13.761,4.352 16.789,4.578 0.777,0.075 1.152,-0.25 1.324,-0.504 0.43,-0.628 0.086,-1.55 0.043,-1.656 L 0.898,-1.203 c -5.066,-1.203 -10.457,-3.141 -10.406,-4.11 0,-0.023 0.074,-0.695 3.727,-1.179 2.093,-0.281 5.164,-0.43 8.871,-0.43 4.84,0 10.473,0.25 15.848,0.699 7.609,0.641 15.132,3.586 15.207,3.614 l 0.441,-0.637 C 34.484,-3.359 32.035,-6.066 30.039,-7.43 L 29.914,-7.484 C 23.164,-9.262 13.52,-10.281 3.453,-10.281"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1854-4" />
+ </g>
+ <g
+ id="g1856-9"
+ transform="translate(102.2104,321.7436)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,0 -18.754,-4.457 -6.641,-6.074 5.114,-0.684 15.313,-0.528 24.809,0.269 7.762,0.653 15.316,3.645 15.316,3.645 0,0 -2.496,-2.774 -4.476,-4.125 -16.664,-4.383 -46.906,-3.141 -47.125,0.664 -0.031,0.547 -0.821,2.055 0.508,2.695 5.699,2.758 13.75,4.321 16.64,4.539 C 0.688,1.738 0,0 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1858-7" />
+ </g>
+ <g
+ id="g1860-7"
+ transform="translate(135.56979,302.0444)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -0.367,0.68 c 0.09,0.086 0.242,0.258 0.281,0.359 L 0.273,0.898 c 11.25,3.071 13.993,7.801 14.618,10.368 0.609,2.5 -0.219,5.004 -2.282,6.867 -2.695,2.445 -6.703,3.133 -10.48,1.812 -0.098,-0.039 -0.152,-0.078 -0.16,-0.101 -0.024,-0.125 0.164,-0.418 0.375,-0.656 0.328,0.109 0.984,0.304 2.019,0.523 3.262,0.687 6.711,-0.977 7.68,-3.695 C 12.742,14.051 12.992,8.766 0.234,2.133 L -0.133,2.844 C 12.066,9.184 11.918,13.98 11.289,15.75 10.379,18.301 7.078,19.461 4.527,18.93 3.066,18.621 2.391,18.355 2.383,18.352 L 1.961,18.43 c -0.152,0.14 -0.914,0.886 -0.773,1.578 0.046,0.219 0.203,0.523 0.675,0.687 4.051,1.43 8.371,0.672 11.285,-1.968 2.282,-2.071 3.204,-4.856 2.52,-7.649 C 14.992,8.301 12.055,3.168 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1862-4" />
+ </g>
+ <g
+ id="g1864-5"
+ transform="translate(135.6245,304.5366)">
+ <path
+ inkscape:connector-curvature="0"
+ d="M 0,0 C 19.359,10.059 10.645,18.129 4.391,16.828 2.867,16.508 2.18,16.234 2.18,16.234 c 0,0 -1.321,1.211 -0.239,1.594 12.364,4.344 23.762,-13.133 -2.097,-19.937 0,0 0.297,0.269 0.39,0.511"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1866-7" />
+ </g>
+ <g
+ id="g1868-4"
+ transform="translate(124.9565,376.80999)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 1.715,-10.453 -5.746,-16.297 -12.973,-21.953 -3.843,-3.008 -7.468,-5.848 -9.785,-9.324 -4.574,-6.864 2.379,-14.461 10.973,-22.301 -0.016,0.066 -0.031,0.137 -0.043,0.203 -0.145,0.656 -0.27,1.227 -0.836,2.043 -0.41,0.598 -0.84,1.199 -1.277,1.809 -4.758,6.636 -10.149,14.16 2.75,24.351 8.101,6.399 12.39,12.633 12.746,18.531 C 1.738,-3.633 0.801,-1.359 0,0 m -11.215,-55.172 c -9.359,8.438 -17.332,16.649 -12.207,24.336 2.387,3.586 6.234,6.602 9.957,9.512 7.438,5.824 15.133,11.847 12.305,22.965 l 0.672,0.379 c 0.125,-0.129 3.164,-3.231 2.843,-8.684 -0.359,-6.145 -4.75,-12.582 -13.046,-19.133 -12.305,-9.719 -7.375,-16.601 -2.602,-23.262 0.438,-0.613 0.875,-1.218 1.289,-1.82 0.652,-0.945 0.801,-1.613 0.957,-2.324 0.098,-0.453 0.203,-0.922 0.465,-1.512 l -0.633,-0.457 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1870-4" />
+ </g>
+ <g
+ id="g1872-9"
+ transform="translate(124.18311,378.5444)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,0 10.723,-10.723 -10.168,-27.219 -13.789,-10.89 -6.187,-18.664 -1.391,-25.621 1.032,-1.496 0.711,-2.246 1.383,-3.769 -9.781,8.82 -16.961,16.586 -12.14,23.82 C -15.25,-22.18 4.332,-17.031 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1874-2" />
+ </g>
+ <g
+ id="g1876-2"
+ transform="translate(89.905807,281.85381)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0.625,-0.367 3.828,-1.914 14.234,-2.582 3.352,-0.215 6.875,-0.324 10.481,-0.324 16.652,0 36.281,2.457 36.89,9.375 -0.05,0.344 -0.144,0.57 -0.199,0.609 C 61.281,6.906 61.141,6.781 60.977,6.641 59.297,5.172 55.371,1.727 46.723,0.102 41.859,-0.813 35.746,-1.277 28.555,-1.277 17.664,-1.277 6.852,-0.199 0.363,0.813 0.199,0.805 0.16,0.789 0.141,0.762 0.016,0.617 -0.012,0.258 0,0 m 24.719,-4.094 -0.004,0 c -3.621,0 -7.164,0.305 -10.527,0.52 -12.211,0.781 -14.719,2.859 -14.821,2.945 l -0.14,0.295 c -0.016,0.105 -0.141,1.075 0.304,1.595 0.235,0.261 0.551,0.391 0.957,0.328 6.457,-1.007 17.223,-2.072 28.067,-2.072 7.14,0 13.203,0.464 18.019,1.367 8.434,1.59 12.246,4.927 13.871,6.357 0.172,0.148 0.321,0.278 0.45,0.383 0.187,0.156 0.378,0.923 0.574,0.923 0.492,0 0.828,-0.641 0.937,-0.641 l -0.031,0 0.031,-0.968 C 61.828,-0.547 42.559,-4.094 24.719,-4.094"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1878-6" />
+ </g>
+ <g
+ id="g1880-7"
+ transform="translate(104.1167,278.87331)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 18.582,-1.188 47.117,0.664 47.797,9.457 0,0 -0.149,1.434 -0.859,0.844 C 45.516,9.117 41.82,5.238 32.438,3.473 18.891,0.926 -2.184,2.379 -13.785,4.188 -14.828,4.348 -14.59,2.754 -14.59,2.754 -14.59,2.754 -12.219,0.785 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1882-9" />
+ </g>
+ <g
+ id="g1884-1"
+ transform="translate(100.07761,300.3334)">
+ <path
+ inkscape:connector-curvature="0"
+ d="M 0,0 C 0,0 -3.941,-2.289 2.809,-3.063 10.984,-4 15.168,-3.867 24.18,-2.164 c 0,0 2.367,-1.484 5.675,-2.766 C 9.648,-13.594 -15.867,-4.434 0,0"
+ style="fill:#5382a1;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1886-9" />
+ </g>
+ <g
+ id="g1888-1"
+ transform="translate(97.608902,311.63031)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,0 -4.422,-3.273 2.336,-3.969 8.734,-0.902 15.633,-0.976 27.57,1.321 0,0 1.649,-1.672 4.242,-2.586 C 9.727,-12.379 -17.48,-5.797 0,0"
+ style="fill:#5382a1;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1890-8" />
+ </g>
+ <g
+ id="g1892-5"
+ transform="translate(118.4214,330.79831)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 4.98,-5.73 -1.309,-10.887 -1.309,-10.887 0,0 12.641,6.524 6.832,14.696 -5.421,7.617 -9.574,11.406 12.93,24.461 0,0 -35.328,-8.829 -18.453,-28.27"
+ style="fill:#f8981d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1894-5" />
+ </g>
+ <g
+ id="g1896-7"
+ transform="translate(145.14011,291.9819)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,0 2.922,-2.406 -3.215,-4.27 -11.66,-3.531 -48.535,-4.597 -58.777,-0.14 -3.68,1.605 3.226,3.824 5.398,4.293 2.262,0.488 3.559,0.398 3.559,0.398 -4.098,2.883 -26.473,-5.664 -11.367,-8.113 C -23.211,-14.508 10.684,-4.824 0,0"
+ style="fill:#5382a1;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1898-7" />
+ </g>
+ <g
+ id="g1900-1"
+ transform="translate(101.9761,323.34131)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,0 -18.758,-4.457 -6.645,-6.078 5.114,-0.68 15.313,-0.524 24.809,0.273 7.766,0.649 15.555,2.047 15.555,2.047 0,0 -2.735,-1.176 -4.711,-2.527 -19.051,-5.012 -55.84,-2.676 -45.25,2.441 C -7.281,0.492 0,0 0,0"
+ style="fill:#5382a1;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1902-4" />
+ </g>
+ <g
+ id="g1904-9"
+ transform="translate(135.6245,304.5366)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 19.359,10.059 10.406,19.727 4.156,18.422 -1.527,-0.32 -2.215,-0.594 -2.215,-0.594 0,0 0.571,0.895 1.653,1.274 12.367,4.347 21.871,-12.813 -3.985,-19.614 0,0 0.297,0.27 0.391,0.512"
+ style="fill:#5382a1;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1906-4" />
+ </g>
+ <g
+ id="g1908-6"
+ transform="translate(123.94479,380.142)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,0 10.723,-10.723 -10.168,-27.223 -16.75,-13.226 -3.824,-20.769 -0.004,-29.39 -9.781,8.824 -16.961,16.59 -12.144,23.82 C -15.25,-22.18 4.332,-17.035 0,0"
+ style="fill:#f8981d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1910-0" />
+ </g>
+ <g
+ id="g1912-6"
+ transform="translate(103.8784,277.2709)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 18.582,-1.188 47.121,0.664 47.801,9.453 0,0 -1.301,-3.336 -15.36,-5.98 C 16.578,0.488 -2.988,0.836 -14.59,2.75 -14.59,2.75 -12.215,0.781 0,0"
+ style="fill:#5382a1;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path1914-4" />
+ </g>
+ <g
+ id="g3975">
+ <g
+ id="g3977" />
+ <g
+ style="fill:url(#linearGradient3933);fill-opacity:1"
+ id="g3979">
+ <g
+ id="g3981"
+ clip-path="url(#clipPath1748)"
+ style="opacity:0.69999701;fill:url(#linearGradient3955);fill-opacity:1">
+ <g
+ style="fill:url(#linearGradient3953);fill-opacity:1"
+ id="g3983">
+ <g
+ style="fill:url(#linearGradient3951);fill-opacity:1"
+ id="g3985"
+ clip-path="url(#clipPath1752)">
+ <g
+ style="fill:url(#linearGradient3949);fill-opacity:1"
+ id="g3987">
+ <g
+ style="fill:url(#linearGradient3947);fill-opacity:1"
+ id="g3989">
+ <g
+ style="fill:url(#linearGradient3945);fill-opacity:1"
+ id="g3991"
+ clip-path="url(#clipPath1756)" />
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/application/resources/multimc/scalable/multimc.svg b/application/resources/multimc/scalable/multimc.svg
new file mode 100644
index 00000000..178509ac
--- /dev/null
+++ b/application/resources/multimc/scalable/multimc.svg
@@ -0,0 +1,1993 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg4427"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="multimc.svg"
+ inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/infinity128.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180">
+ <defs
+ id="defs4429">
+ <linearGradient
+ id="linearGradient5668"
+ inkscape:collect="always">
+ <stop
+ id="stop5670"
+ offset="0"
+ style="stop-color:#75b54b;stop-opacity:1;" />
+ <stop
+ id="stop5672"
+ offset="1"
+ style="stop-color:#75b54b;stop-opacity:0.6" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5084"
+ inkscape:collect="always">
+ <stop
+ id="stop5086"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:0.8" />
+ <stop
+ id="stop5088"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0.35" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5668"
+ id="linearGradient5072"
+ x1="6.7342591"
+ y1="28.510933"
+ x2="50.506943"
+ y2="61.773685"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.01532073,-0.00938002)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5084"
+ id="linearGradient5082"
+ x1="14.312115"
+ y1="9.7948904"
+ x2="44.097023"
+ y2="82.973114"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5668"
+ id="linearGradient3281"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.01532073,-0.00938002)"
+ x1="6.7342591"
+ y1="28.510933"
+ x2="50.506943"
+ y2="61.773685" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5668"
+ id="linearGradient3283"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.01532073,-0.00938002)"
+ x1="6.7342591"
+ y1="28.510933"
+ x2="50.506943"
+ y2="61.773685" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5668"
+ id="linearGradient3286"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1879555,0,0,0.84178237,-0.01820035,-0.00789594)"
+ x1="6.7342591"
+ y1="28.510933"
+ x2="50.506943"
+ y2="61.773685" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5084"
+ id="linearGradient3288"
+ gradientUnits="userSpaceOnUse"
+ x1="14.312115"
+ y1="9.7948904"
+ x2="44.097023"
+ y2="82.973114" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5084"
+ id="linearGradient3290"
+ gradientUnits="userSpaceOnUse"
+ x1="14.312115"
+ y1="9.7948904"
+ x2="44.097023"
+ y2="82.973114" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5084"
+ id="linearGradient3293"
+ gradientUnits="userSpaceOnUse"
+ x1="14.312115"
+ y1="9.7948904"
+ x2="44.097023"
+ y2="82.973114"
+ gradientTransform="scale(1.1879555,0.84178237)" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="6"
+ inkscape:cx="10.09561"
+ inkscape:cy="35.232628"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1607"
+ inkscape:window-height="1030"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid4446"
+ empspacing="16"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingx="4px"
+ spacingy="4px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4432">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="opacity:0.34999999999999998;fill:#552200;fill-opacity:1;stroke:none"
+ id="rect5674"
+ width="64.125"
+ height="64"
+ x="-0.125"
+ y="0.1249999" />
+ <rect
+ style="fill:#74b44a;fill-opacity:1;stroke:none"
+ id="rect4448"
+ width="4"
+ height="4"
+ x="0"
+ y="0" />
+ <rect
+ y="0"
+ x="4"
+ height="4"
+ width="4"
+ id="rect4450"
+ style="fill:#76b64c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#73b349;fill-opacity:1;stroke:none"
+ id="rect4452"
+ width="4"
+ height="4"
+ x="8"
+ y="0" />
+ <rect
+ y="0"
+ x="12"
+ height="4"
+ width="4"
+ id="rect4454"
+ style="fill:#66a63c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#66a63c;fill-opacity:1;stroke:none"
+ id="rect4456"
+ width="4"
+ height="4"
+ x="16"
+ y="0" />
+ <rect
+ y="0"
+ x="20"
+ height="4"
+ width="4"
+ id="rect4458"
+ style="fill:#6faf45;fill-opacity:1;stroke:none" />
+ <rect
+ y="4"
+ x="0"
+ height="4"
+ width="4"
+ id="rect4460"
+ style="fill:#75b54b;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#6cac42;fill-opacity:1;stroke:none"
+ id="rect4462"
+ width="4"
+ height="4"
+ x="4"
+ y="4" />
+ <rect
+ y="4"
+ x="8"
+ height="4"
+ width="4"
+ id="rect4464"
+ style="fill:#8ab95a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#81b051;fill-opacity:1;stroke:none"
+ id="rect4466"
+ width="4"
+ height="4"
+ x="12"
+ y="4" />
+ <rect
+ y="4"
+ x="16"
+ height="4"
+ width="4"
+ id="rect4468"
+ style="fill:#83b253;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4470"
+ width="4"
+ height="4"
+ x="20"
+ y="4" />
+ <rect
+ y="0"
+ x="24"
+ height="4"
+ width="4"
+ id="rect4472"
+ style="fill:#5f9f35;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#6cac42;fill-opacity:1;stroke:none"
+ id="rect4474"
+ width="4"
+ height="4"
+ x="28"
+ y="0" />
+ <rect
+ y="0"
+ x="32"
+ height="4"
+ width="4"
+ id="rect4476"
+ style="fill:#7ebe54;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#76b64c;fill-opacity:1;stroke:none"
+ id="rect4478"
+ width="4"
+ height="4"
+ x="36"
+ y="0" />
+ <rect
+ y="0"
+ x="40"
+ height="4"
+ width="4"
+ id="rect4480"
+ style="fill:#6aaa40;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#67a73d;fill-opacity:1;stroke:none"
+ id="rect4482"
+ width="4"
+ height="4"
+ x="44"
+ y="0" />
+ <rect
+ style="fill:#68a83e;fill-opacity:1;stroke:none"
+ id="rect4484"
+ width="4"
+ height="4"
+ x="24"
+ y="4" />
+ <rect
+ y="4"
+ x="28"
+ height="4"
+ width="4"
+ id="rect4486"
+ style="fill:#62a238;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#5f9f35;fill-opacity:1;stroke:none"
+ id="rect4488"
+ width="4"
+ height="4"
+ x="32"
+ y="4" />
+ <rect
+ y="4"
+ x="36"
+ height="4"
+ width="4"
+ id="rect4490"
+ style="fill:#93c263;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#90bf60;fill-opacity:1;stroke:none"
+ id="rect4492"
+ width="4"
+ height="4"
+ x="40"
+ y="4" />
+ <rect
+ y="4"
+ x="44"
+ height="4"
+ width="4"
+ id="rect4494"
+ style="fill:#73b349;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#69a93f;fill-opacity:1;stroke:none"
+ id="rect4496"
+ width="4"
+ height="4"
+ x="48"
+ y="0" />
+ <rect
+ y="0"
+ x="52"
+ height="4"
+ width="4"
+ id="rect4498"
+ style="fill:#61a137;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#509026;fill-opacity:1;stroke:none"
+ id="rect4500"
+ width="4"
+ height="4"
+ x="56"
+ y="0" />
+ <rect
+ y="0"
+ x="60"
+ height="4"
+ width="4"
+ id="rect4502"
+ style="fill:#6dad43;fill-opacity:1;stroke:none" />
+ <rect
+ y="4"
+ x="48"
+ height="4"
+ width="4"
+ id="rect4508"
+ style="fill:#61a137;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#6cac42;fill-opacity:1;stroke:none"
+ id="rect4510"
+ width="4"
+ height="4"
+ x="52"
+ y="4" />
+ <rect
+ y="4"
+ x="56"
+ height="4"
+ width="4"
+ id="rect4512"
+ style="fill:#67a73d;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#6bab41;fill-opacity:1;stroke:none"
+ id="rect4514"
+ width="4"
+ height="4"
+ x="60"
+ y="4" />
+ <rect
+ y="8"
+ x="0"
+ height="4"
+ width="4"
+ id="rect4520"
+ style="fill:#8dbc5d;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4522"
+ width="4"
+ height="4"
+ x="4"
+ y="8" />
+ <rect
+ y="8"
+ x="8"
+ height="4"
+ width="4"
+ id="rect4524"
+ style="fill:#9ccb6c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#64a43a;fill-opacity:1;stroke:none"
+ id="rect4526"
+ width="4"
+ height="4"
+ x="12"
+ y="8" />
+ <rect
+ y="8"
+ x="16"
+ height="4"
+ width="4"
+ id="rect4528"
+ style="fill:#69a93f;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4530"
+ width="4"
+ height="4"
+ x="20"
+ y="8" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4532"
+ width="4"
+ height="4"
+ x="0"
+ y="12" />
+ <rect
+ y="12"
+ x="4"
+ height="4"
+ width="4"
+ id="rect4534"
+ style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4536"
+ width="4"
+ height="4"
+ x="8"
+ y="12" />
+ <rect
+ y="12"
+ x="12"
+ height="4"
+ width="4"
+ id="rect4538"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#71b147;fill-opacity:1;stroke:none"
+ id="rect4540"
+ width="4"
+ height="4"
+ x="16"
+ y="12" />
+ <rect
+ y="12"
+ x="20"
+ height="4"
+ width="4"
+ id="rect4542"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#70b046;fill-opacity:1;stroke:none"
+ id="rect4544"
+ width="4"
+ height="4"
+ x="24"
+ y="8" />
+ <rect
+ y="8"
+ x="28"
+ height="4"
+ width="4"
+ id="rect4546"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#74b44a;fill-opacity:1;stroke:none"
+ id="rect4548"
+ width="4"
+ height="4"
+ x="32"
+ y="8" />
+ <rect
+ y="8"
+ x="36"
+ height="4"
+ width="4"
+ id="rect4550"
+ style="fill:#7fbf55;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#92c162;fill-opacity:1;stroke:none"
+ id="rect4552"
+ width="4"
+ height="4"
+ x="40"
+ y="8" />
+ <rect
+ y="8"
+ x="44"
+ height="4"
+ width="4"
+ id="rect4554"
+ style="fill:#97c667;fill-opacity:1;stroke:none" />
+ <rect
+ y="12"
+ x="24"
+ height="4"
+ width="4"
+ id="rect4556"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4558"
+ width="4"
+ height="4"
+ x="28"
+ y="12" />
+ <rect
+ y="12"
+ x="32"
+ height="4"
+ width="4"
+ id="rect4560"
+ style="fill:#5f9f35;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4562"
+ width="4"
+ height="4"
+ x="36"
+ y="12" />
+ <rect
+ y="12"
+ x="40"
+ height="4"
+ width="4"
+ id="rect4564"
+ style="fill:#6dad43;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4566"
+ width="4"
+ height="4"
+ x="44"
+ y="12" />
+ <rect
+ y="8"
+ x="48"
+ height="4"
+ width="4"
+ id="rect4568"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#57972d;fill-opacity:1;stroke:none"
+ id="rect4570"
+ width="4"
+ height="4"
+ x="52"
+ y="8" />
+ <rect
+ y="8"
+ x="56"
+ height="4"
+ width="4"
+ id="rect4572"
+ style="fill:#60a036;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4574"
+ width="4"
+ height="4"
+ x="60"
+ y="8" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4576"
+ width="4"
+ height="4"
+ x="48"
+ y="12" />
+ <rect
+ y="12"
+ x="52"
+ height="4"
+ width="4"
+ id="rect4578"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4580"
+ width="4"
+ height="4"
+ x="56"
+ y="12" />
+ <rect
+ y="12"
+ x="60"
+ height="4"
+ width="4"
+ id="rect4582"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ y="16"
+ x="0"
+ height="4"
+ width="4"
+ id="rect4584"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4586"
+ width="4"
+ height="4"
+ x="4"
+ y="16" />
+ <rect
+ y="16"
+ x="8"
+ height="4"
+ width="4"
+ id="rect4588"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b9855c;fill-opacity:1;stroke:none"
+ id="rect4590"
+ width="4"
+ height="4"
+ x="12"
+ y="16" />
+ <rect
+ y="16"
+ x="16"
+ height="4"
+ width="4"
+ id="rect4592"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4594"
+ width="4"
+ height="4"
+ x="20"
+ y="16" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4596"
+ width="4"
+ height="4"
+ x="0"
+ y="20" />
+ <rect
+ y="20"
+ x="4"
+ height="4"
+ width="4"
+ id="rect4598"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4600"
+ width="4"
+ height="4"
+ x="8"
+ y="20" />
+ <rect
+ y="20"
+ x="12"
+ height="4"
+ width="4"
+ id="rect4602"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4604"
+ width="4"
+ height="4"
+ x="16"
+ y="20" />
+ <rect
+ y="20"
+ x="20"
+ height="4"
+ width="4"
+ id="rect4606"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4608"
+ width="4"
+ height="4"
+ x="24"
+ y="16" />
+ <rect
+ y="16"
+ x="28"
+ height="4"
+ width="4"
+ id="rect4610"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4612"
+ width="4"
+ height="4"
+ x="32"
+ y="16" />
+ <rect
+ y="16"
+ x="36"
+ height="4"
+ width="4"
+ id="rect4614"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4616"
+ width="4"
+ height="4"
+ x="40"
+ y="16" />
+ <rect
+ y="16"
+ x="44"
+ height="4"
+ width="4"
+ id="rect4618"
+ style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+ <rect
+ y="20"
+ x="24"
+ height="4"
+ width="4"
+ id="rect4620"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4622"
+ width="4"
+ height="4"
+ x="28"
+ y="20" />
+ <rect
+ y="20"
+ x="32"
+ height="4"
+ width="4"
+ id="rect4624"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4626"
+ width="4"
+ height="4"
+ x="36"
+ y="20" />
+ <rect
+ y="20"
+ x="40"
+ height="4"
+ width="4"
+ id="rect4628"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4630"
+ width="4"
+ height="4"
+ x="44"
+ y="20" />
+ <rect
+ y="16"
+ x="48"
+ height="4"
+ width="4"
+ id="rect4632"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4634"
+ width="4"
+ height="4"
+ x="52"
+ y="16" />
+ <rect
+ y="16"
+ x="56"
+ height="4"
+ width="4"
+ id="rect4636"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4638"
+ width="4"
+ height="4"
+ x="60"
+ y="16" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4640"
+ width="4"
+ height="4"
+ x="48"
+ y="20" />
+ <rect
+ y="20"
+ x="52"
+ height="4"
+ width="4"
+ id="rect4642"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4644"
+ width="4"
+ height="4"
+ x="56"
+ y="20" />
+ <rect
+ y="20"
+ x="60"
+ height="4"
+ width="4"
+ id="rect4646"
+ style="fill:#b9855c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b9855c;fill-opacity:1;stroke:none"
+ id="rect4648"
+ width="4"
+ height="4"
+ x="0"
+ y="24" />
+ <rect
+ y="24"
+ x="4"
+ height="4"
+ width="4"
+ id="rect4650"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4652"
+ width="4"
+ height="4"
+ x="8"
+ y="24" />
+ <rect
+ y="24"
+ x="12"
+ height="4"
+ width="4"
+ id="rect4654"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#878787;fill-opacity:1;stroke:none"
+ id="rect4656"
+ width="4"
+ height="4"
+ x="16"
+ y="24" />
+ <rect
+ y="24"
+ x="20"
+ height="4"
+ width="4"
+ id="rect4658"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ y="28"
+ x="0"
+ height="4"
+ width="4"
+ id="rect4660"
+ style="fill:#b9855c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4662"
+ width="4"
+ height="4"
+ x="4"
+ y="28" />
+ <rect
+ y="28"
+ x="8"
+ height="4"
+ width="4"
+ id="rect4664"
+ style="fill:#b9855c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b9855c;fill-opacity:1;stroke:none"
+ id="rect4666"
+ width="4"
+ height="4"
+ x="12"
+ y="28" />
+ <rect
+ y="28"
+ x="16"
+ height="4"
+ width="4"
+ id="rect4668"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4670"
+ width="4"
+ height="4"
+ x="20"
+ y="28" />
+ <rect
+ y="24"
+ x="24"
+ height="4"
+ width="4"
+ id="rect4672"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b9855c;fill-opacity:1;stroke:none"
+ id="rect4674"
+ width="4"
+ height="4"
+ x="28"
+ y="24" />
+ <rect
+ y="24"
+ x="32"
+ height="4"
+ width="4"
+ id="rect4676"
+ style="fill:#b9855c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4678"
+ width="4"
+ height="4"
+ x="36"
+ y="24" />
+ <rect
+ y="24"
+ x="40"
+ height="4"
+ width="4"
+ id="rect4680"
+ style="fill:#b9855c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b9855c;fill-opacity:1;stroke:none"
+ id="rect4682"
+ width="4"
+ height="4"
+ x="44"
+ y="24" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4684"
+ width="4"
+ height="4"
+ x="24"
+ y="28" />
+ <rect
+ y="28"
+ x="28"
+ height="4"
+ width="4"
+ id="rect4686"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4688"
+ width="4"
+ height="4"
+ x="32"
+ y="28" />
+ <rect
+ y="28"
+ x="36"
+ height="4"
+ width="4"
+ id="rect4690"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4692"
+ width="4"
+ height="4"
+ x="40"
+ y="28" />
+ <rect
+ y="28"
+ x="44"
+ height="4"
+ width="4"
+ id="rect4694"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4696"
+ width="4"
+ height="4"
+ x="48"
+ y="24" />
+ <rect
+ y="24"
+ x="52"
+ height="4"
+ width="4"
+ id="rect4698"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4700"
+ width="4"
+ height="4"
+ x="56"
+ y="24" />
+ <rect
+ y="24"
+ x="60"
+ height="4"
+ width="4"
+ id="rect4702"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ y="28"
+ x="48"
+ height="4"
+ width="4"
+ id="rect4704"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4706"
+ width="4"
+ height="4"
+ x="52"
+ y="28" />
+ <rect
+ y="28"
+ x="56"
+ height="4"
+ width="4"
+ id="rect4708"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4710"
+ width="4"
+ height="4"
+ x="60"
+ y="28" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4448-5"
+ width="4"
+ height="4"
+ x="0"
+ y="32" />
+ <rect
+ y="32"
+ x="4"
+ height="4"
+ width="4"
+ id="rect4450-2"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4452-3"
+ width="4"
+ height="4"
+ x="8"
+ y="32" />
+ <rect
+ y="32"
+ x="12"
+ height="4"
+ width="4"
+ id="rect4454-7"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4456-2"
+ width="4"
+ height="4"
+ x="16"
+ y="32" />
+ <rect
+ y="32"
+ x="20"
+ height="4"
+ width="4"
+ id="rect4458-4"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ y="36"
+ x="0"
+ height="4"
+ width="4"
+ id="rect4460-9"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4462-7"
+ width="4"
+ height="4"
+ x="4"
+ y="36" />
+ <rect
+ y="36"
+ x="8"
+ height="4"
+ width="4"
+ id="rect4464-3"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4466-7"
+ width="4"
+ height="4"
+ x="12"
+ y="36" />
+ <rect
+ y="36"
+ x="16"
+ height="4"
+ width="4"
+ id="rect4468-8"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4470-9"
+ width="4"
+ height="4"
+ x="20"
+ y="36" />
+ <rect
+ y="32"
+ x="24"
+ height="4"
+ width="4"
+ id="rect4472-9"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4474-6"
+ width="4"
+ height="4"
+ x="28"
+ y="32" />
+ <rect
+ y="32"
+ x="32"
+ height="4"
+ width="4"
+ id="rect4476-7"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4478-8"
+ width="4"
+ height="4"
+ x="36"
+ y="32" />
+ <rect
+ y="32"
+ x="40"
+ height="4"
+ width="4"
+ id="rect4480-1"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4482-6"
+ width="4"
+ height="4"
+ x="44"
+ y="32" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4484-7"
+ width="4"
+ height="4"
+ x="24"
+ y="36" />
+ <rect
+ y="36"
+ x="28"
+ height="4"
+ width="4"
+ id="rect4486-1"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4488-9"
+ width="4"
+ height="4"
+ x="32"
+ y="36" />
+ <rect
+ y="36"
+ x="36"
+ height="4"
+ width="4"
+ id="rect4490-9"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4492-3"
+ width="4"
+ height="4"
+ x="40"
+ y="36" />
+ <rect
+ y="36"
+ x="44"
+ height="4"
+ width="4"
+ id="rect4494-9"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4496-4"
+ width="4"
+ height="4"
+ x="48"
+ y="32" />
+ <rect
+ y="32"
+ x="52"
+ height="4"
+ width="4"
+ id="rect4498-2"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4500-1"
+ width="4"
+ height="4"
+ x="56"
+ y="32" />
+ <rect
+ y="32"
+ x="60"
+ height="4"
+ width="4"
+ id="rect4502-7"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ y="36"
+ x="48"
+ height="4"
+ width="4"
+ id="rect4508-4"
+ style="fill:#b9855c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b9855c;fill-opacity:1;stroke:none"
+ id="rect4510-6"
+ width="4"
+ height="4"
+ x="52"
+ y="36" />
+ <rect
+ y="36"
+ x="56"
+ height="4"
+ width="4"
+ id="rect4512-8"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4514-1"
+ width="4"
+ height="4"
+ x="60"
+ y="36" />
+ <rect
+ y="40"
+ x="0"
+ height="4"
+ width="4"
+ id="rect4520-0"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4522-3"
+ width="4"
+ height="4"
+ x="4"
+ y="40" />
+ <rect
+ y="40"
+ x="8"
+ height="4"
+ width="4"
+ id="rect4524-1"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b9855c;fill-opacity:1;stroke:none"
+ id="rect4526-3"
+ width="4"
+ height="4"
+ x="12"
+ y="40" />
+ <rect
+ y="40"
+ x="16"
+ height="4"
+ width="4"
+ id="rect4528-7"
+ style="fill:#b9855c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4530-0"
+ width="4"
+ height="4"
+ x="20"
+ y="40" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4532-2"
+ width="4"
+ height="4"
+ x="0"
+ y="44" />
+ <rect
+ y="44"
+ x="4"
+ height="4"
+ width="4"
+ id="rect4534-0"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4536-9"
+ width="4"
+ height="4"
+ x="8"
+ y="44" />
+ <rect
+ y="44"
+ x="12"
+ height="4"
+ width="4"
+ id="rect4538-0"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4540-2"
+ width="4"
+ height="4"
+ x="16"
+ y="44" />
+ <rect
+ y="44"
+ x="20"
+ height="4"
+ width="4"
+ id="rect4542-9"
+ style="fill:#b9855c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b9855c;fill-opacity:1;stroke:none"
+ id="rect4544-6"
+ width="4"
+ height="4"
+ x="24"
+ y="40" />
+ <rect
+ y="40"
+ x="28"
+ height="4"
+ width="4"
+ id="rect4546-9"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4548-9"
+ width="4"
+ height="4"
+ x="32"
+ y="40" />
+ <rect
+ y="40"
+ x="36"
+ height="4"
+ width="4"
+ id="rect4550-8"
+ style="fill:#b9855c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b9855c;fill-opacity:1;stroke:none"
+ id="rect4552-7"
+ width="4"
+ height="4"
+ x="40"
+ y="40" />
+ <rect
+ y="40"
+ x="44"
+ height="4"
+ width="4"
+ id="rect4554-6"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ y="44"
+ x="24"
+ height="4"
+ width="4"
+ id="rect4556-1"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4558-9"
+ width="4"
+ height="4"
+ x="28"
+ y="44" />
+ <rect
+ y="44"
+ x="32"
+ height="4"
+ width="4"
+ id="rect4560-7"
+ style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4562-5"
+ width="4"
+ height="4"
+ x="36"
+ y="44" />
+ <rect
+ y="44"
+ x="40"
+ height="4"
+ width="4"
+ id="rect4564-8"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4566-2"
+ width="4"
+ height="4"
+ x="44"
+ y="44" />
+ <rect
+ y="40"
+ x="48"
+ height="4"
+ width="4"
+ id="rect4568-9"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4570-1"
+ width="4"
+ height="4"
+ x="52"
+ y="40" />
+ <rect
+ y="40"
+ x="56"
+ height="4"
+ width="4"
+ id="rect4572-9"
+ style="fill:#878787;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4574-5"
+ width="4"
+ height="4"
+ x="60"
+ y="40" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4576-8"
+ width="4"
+ height="4"
+ x="48"
+ y="44" />
+ <rect
+ y="44"
+ x="52"
+ height="4"
+ width="4"
+ id="rect4578-7"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4580-6"
+ width="4"
+ height="4"
+ x="56"
+ y="44" />
+ <rect
+ y="44"
+ x="60"
+ height="4"
+ width="4"
+ id="rect4582-0"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ y="48"
+ x="0"
+ height="4"
+ width="4"
+ id="rect4930"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4932"
+ width="4"
+ height="4"
+ x="4"
+ y="48" />
+ <rect
+ y="48"
+ x="8"
+ height="4"
+ width="4"
+ id="rect4934"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4936"
+ width="4"
+ height="4"
+ x="12"
+ y="48" />
+ <rect
+ y="48"
+ x="16"
+ height="4"
+ width="4"
+ id="rect4938"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4940"
+ width="4"
+ height="4"
+ x="20"
+ y="48" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4942"
+ width="4"
+ height="4"
+ x="0"
+ y="52" />
+ <rect
+ y="52"
+ x="4"
+ height="4"
+ width="4"
+ id="rect4944"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4946"
+ width="4"
+ height="4"
+ x="8"
+ y="52" />
+ <rect
+ y="52"
+ x="12"
+ height="4"
+ width="4"
+ id="rect4948"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4950"
+ width="4"
+ height="4"
+ x="16"
+ y="52" />
+ <rect
+ y="52"
+ x="20"
+ height="4"
+ width="4"
+ id="rect4952"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b9855c;fill-opacity:1;stroke:none"
+ id="rect4954"
+ width="4"
+ height="4"
+ x="24"
+ y="48" />
+ <rect
+ y="48"
+ x="28"
+ height="4"
+ width="4"
+ id="rect4956"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4958"
+ width="4"
+ height="4"
+ x="32"
+ y="48" />
+ <rect
+ y="48"
+ x="36"
+ height="4"
+ width="4"
+ id="rect4960"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4962"
+ width="4"
+ height="4"
+ x="40"
+ y="48" />
+ <rect
+ y="48"
+ x="44"
+ height="4"
+ width="4"
+ id="rect4964"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ y="52"
+ x="24"
+ height="4"
+ width="4"
+ id="rect4966"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4968"
+ width="4"
+ height="4"
+ x="28"
+ y="52" />
+ <rect
+ y="52"
+ x="32"
+ height="4"
+ width="4"
+ id="rect4970"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4972"
+ width="4"
+ height="4"
+ x="36"
+ y="52" />
+ <rect
+ y="52"
+ x="40"
+ height="4"
+ width="4"
+ id="rect4974"
+ style="fill:#b9855c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4976"
+ width="4"
+ height="4"
+ x="44"
+ y="52" />
+ <rect
+ y="48"
+ x="48"
+ height="4"
+ width="4"
+ id="rect4978"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4980"
+ width="4"
+ height="4"
+ x="52"
+ y="48" />
+ <rect
+ y="48"
+ x="56"
+ height="4"
+ width="4"
+ id="rect4982"
+ style="fill:#b9855c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b9855c;fill-opacity:1;stroke:none"
+ id="rect4984"
+ width="4"
+ height="4"
+ x="60"
+ y="48" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect4986"
+ width="4"
+ height="4"
+ x="48"
+ y="52" />
+ <rect
+ y="52"
+ x="52"
+ height="4"
+ width="4"
+ id="rect4988"
+ style="fill:#b9855c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4990"
+ width="4"
+ height="4"
+ x="56"
+ y="52" />
+ <rect
+ y="52"
+ x="60"
+ height="4"
+ width="4"
+ id="rect4992"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect4994"
+ width="4"
+ height="4"
+ x="0"
+ y="56" />
+ <rect
+ y="56"
+ x="4"
+ height="4"
+ width="4"
+ id="rect4996"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect4998"
+ width="4"
+ height="4"
+ x="8"
+ y="56" />
+ <rect
+ y="56"
+ x="12"
+ height="4"
+ width="4"
+ id="rect5000"
+ style="fill:#b9855c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect5002"
+ width="4"
+ height="4"
+ x="16"
+ y="56" />
+ <rect
+ y="56"
+ x="20"
+ height="4"
+ width="4"
+ id="rect5004"
+ style="fill:#593d29;fill-opacity:1;stroke:none" />
+ <rect
+ y="60"
+ x="0"
+ height="4"
+ width="4"
+ id="rect5006"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect5008"
+ width="4"
+ height="4"
+ x="4"
+ y="60" />
+ <rect
+ y="60"
+ x="8"
+ height="4"
+ width="4"
+ id="rect5010"
+ style="fill:#b9855c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect5012"
+ width="4"
+ height="4"
+ x="12"
+ y="60" />
+ <rect
+ y="60"
+ x="16"
+ height="4"
+ width="4"
+ id="rect5014"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect5016"
+ width="4"
+ height="4"
+ x="20"
+ y="60" />
+ <rect
+ y="56"
+ x="24"
+ height="4"
+ width="4"
+ id="rect5018"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect5020"
+ width="4"
+ height="4"
+ x="28"
+ y="56" />
+ <rect
+ y="56"
+ x="32"
+ height="4"
+ width="4"
+ id="rect5022"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect5024"
+ width="4"
+ height="4"
+ x="36"
+ y="56" />
+ <rect
+ y="56"
+ x="40"
+ height="4"
+ width="4"
+ id="rect5026"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect5028"
+ width="4"
+ height="4"
+ x="44"
+ y="56" />
+ <rect
+ style="fill:#878787;fill-opacity:1;stroke:none"
+ id="rect5030"
+ width="4"
+ height="4"
+ x="24"
+ y="60" />
+ <rect
+ y="60"
+ x="28"
+ height="4"
+ width="4"
+ id="rect5032"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect5034"
+ width="4"
+ height="4"
+ x="32"
+ y="60" />
+ <rect
+ y="60"
+ x="36"
+ height="4"
+ width="4"
+ id="rect5036"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect5038"
+ width="4"
+ height="4"
+ x="40"
+ y="60" />
+ <rect
+ y="60"
+ x="44"
+ height="4"
+ width="4"
+ id="rect5040"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#79553a;fill-opacity:1;stroke:none"
+ id="rect5042"
+ width="4"
+ height="4"
+ x="48"
+ y="56" />
+ <rect
+ y="56"
+ x="52"
+ height="4"
+ width="4"
+ id="rect5044"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect5046"
+ width="4"
+ height="4"
+ x="56"
+ y="56" />
+ <rect
+ y="56"
+ x="60"
+ height="4"
+ width="4"
+ id="rect5048"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ y="60"
+ x="48"
+ height="4"
+ width="4"
+ id="rect5050"
+ style="fill:#966c4a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#966c4a;fill-opacity:1;stroke:none"
+ id="rect5052"
+ width="4"
+ height="4"
+ x="52"
+ y="60" />
+ <rect
+ y="60"
+ x="56"
+ height="4"
+ width="4"
+ id="rect5054"
+ style="fill:#79553a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#593d29;fill-opacity:1;stroke:none"
+ id="rect5056"
+ width="4"
+ height="4"
+ x="60"
+ y="60" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3279"
+ style="font-size:76.18933868px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:url(#linearGradient3293);fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ d="m 37.233107,43.070771 c -0.913385,-0.751568 -2.091894,-2.0042 -3.535529,-3.7579 -1.974039,2.505279 -3.83019,4.311158 -5.568458,5.41764 -2.180273,1.33615 -4.9645,2.004221 -8.352688,2.004214 -3.97749,7e-6 -7.277313,-1.054292 -9.8994808,-3.1629 -2.7695088,-2.212974 -4.1542564,-5.146221 -4.1542467,-8.799752 -9.7e-6,-3.507351 1.3847379,-6.451037 4.1542467,-8.831067 2.4748538,-2.10857 5.8041408,-3.162868 9.9878698,-3.162899 2.150754,3.1e-5 4.021637,0.313189 5.612652,0.939475 1.856121,0.688978 3.417645,1.628452 4.684576,2.818425 1.178474,1.064766 2.356983,2.317398 3.535529,3.757901 1.973965,-2.505241 3.830116,-4.311119 5.568458,-5.41764 2.180198,-1.336112 4.964424,-2.004182 8.352687,-2.004214 3.977416,3.2e-5 7.277239,1.05433 9.899482,3.1629 2.769434,2.213012 4.154182,5.146259 4.154247,8.799751 -6.5e-5,3.50739 -1.384813,6.451076 -4.154247,8.831068 -2.47493,2.108607 -5.804215,3.162907 -9.987869,3.162899 -2.15083,8e-6 -4.021712,-0.31315 -5.612653,-0.939475 -1.591032,-0.563676 -3.152556,-1.503151 -4.684576,-2.818426 M 19.290297,42.63235 c 4.861324,1.1e-5 8.750403,-2.505254 11.667246,-7.515802 -3.7418,-5.46981 -7.630877,-8.204724 -11.667246,-8.20475 -2.946295,2.6e-5 -5.17073,0.751606 -6.67331,2.254741 -1.620467,1.607569 -2.430691,3.476079 -2.430677,5.605534 -1.4e-5,2.338267 0.81021,4.227655 2.430677,5.668168 1.649894,1.461418 3.874329,2.19212 6.67331,2.192109 M 48.104859,26.974429 c -4.389996,2.7e-5 -8.279074,2.505292 -11.667245,7.515802 3.712261,5.469847 7.601339,8.204762 11.667245,8.20475 2.946219,1.2e-5 5.170654,-0.751567 6.673311,-2.25474 1.62039,-1.607532 2.430615,-3.476042 2.430677,-5.605536 -6.2e-5,-2.338228 -0.810287,-4.227615 -2.430677,-5.668166 -1.64997,-1.46138 -3.874405,-2.192083 -6.673311,-2.19211" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3272"
+ style="font-size:76.18933868px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:url(#linearGradient3286);fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ d="M 35.535529,40.267381 C 34.622143,39.515813 33.443636,38.26318 32,36.50948 c -1.97404,2.505279 -3.830191,4.311157 -5.568458,5.417641 -2.180273,1.33615 -4.964499,2.004221 -8.352688,2.004213 -3.97749,8e-6 -7.277313,-1.054291 -9.8994809,-3.1629 -2.7695089,-2.212973 -4.1542564,-5.14622 -4.1542466,-8.799751 -9.8e-6,-3.507351 1.3847377,-6.451037 4.1542466,-8.831067 2.4748539,-2.10857 5.8041399,-3.162869 9.9878699,-3.1629 2.150754,3.1e-5 4.021636,0.313189 5.612653,0.939476 1.856121,0.688977 3.417644,1.628452 4.684575,2.818425 1.178474,1.064765 2.356983,2.317397 3.535529,3.757901 1.973964,-2.505241 3.830115,-4.31112 5.568458,-5.417641 2.180198,-1.336111 4.964425,-2.004183 8.352688,-2.004214 3.977415,3.1e-5 7.277238,1.054331 9.899481,3.162901 2.769433,2.213011 4.154181,5.146259 4.154247,8.799751 -6.6e-5,3.50739 -1.384814,6.451076 -4.154247,8.831067 -2.474929,2.108608 -5.804216,3.162907 -9.98787,3.1629 -2.150829,7e-6 -4.021712,-0.313151 -5.612651,-0.939475 -1.591033,-0.563676 -3.152557,-1.503151 -4.684577,-2.818426 m -17.94281,-0.438422 c 4.861324,1.2e-5 8.750402,-2.505253 11.667246,-7.515802 -3.741799,-5.469809 -7.630877,-8.204723 -11.667246,-8.20475 -2.946294,2.7e-5 -5.170729,0.751607 -6.673311,2.25474 -1.6204657,1.607571 -2.4306903,3.47608 -2.4306761,5.605536 -1.42e-5,2.338266 0.8102104,4.227653 2.4306761,5.668168 1.649895,1.461417 3.87433,2.19212 6.673311,2.192108 m 28.814562,-15.65792 c -4.389996,2.7e-5 -8.279075,2.505292 -11.667246,7.515802 3.712261,5.469847 7.60134,8.204761 11.667246,8.20475 2.94622,1.1e-5 5.170655,-0.751569 6.673311,-2.25474 1.620391,-1.607532 2.430616,-3.476042 2.430676,-5.605536 -6e-5,-2.338228 -0.810285,-4.227615 -2.430676,-5.668168 -1.64997,-1.461379 -3.874405,-2.192081 -6.673311,-2.192108" />
+ <path
+ style="font-size:76.18933868px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#ccff00;fill-opacity:1;stroke:none;font-family:Sans"
+ d="m 18.1875,19.84375 c -4.183729,3.1e-5 -7.525146,1.07893 -10,3.1875 -2.7695089,2.38003 -4.1562597,5.305149 -4.15625,8.8125 -9.7e-6,3.65353 1.3867411,6.599527 4.15625,8.8125 -1.5212822,-1.916504 -2.2812572,-4.2297 -2.28125,-6.9375 -9.7e-6,-3.507351 1.3867411,-6.43247 4.15625,-8.8125 2.474854,-2.10857 5.816271,-3.187469 10,-3.1875 2.150754,3.1e-5 4.033984,0.342464 5.625,0.96875 1.856121,0.688978 3.389319,1.622527 4.65625,2.8125 0.06409,0.05791 0.12341,0.128483 0.1875,0.1875 -0.686074,-0.747192 -1.376449,-1.442646 -2.0625,-2.0625 -1.266931,-1.189973 -2.800129,-2.123522 -4.65625,-2.8125 -1.591016,-0.626286 -3.474246,-0.968719 -5.625,-0.96875 z m 27.75,0.09375 c -3.388264,3.1e-5 -6.163553,0.695138 -8.34375,2.03125 -1.704583,1.085031 -3.678235,3.085676 -5.609375,5.515625 0.579636,0.617601 1.170346,1.291505 1.75,2 1.973964,-2.505241 3.996032,-4.534104 5.734375,-5.640625 2.180197,-1.336112 4.955486,-2.031219 8.34375,-2.03125 3.977415,3.1e-5 7.284007,1.07893 9.90625,3.1875 -0.534738,-0.676996 -1.150988,-1.296453 -1.875,-1.875 -2.622243,-2.10857 -5.928835,-3.187469 -9.90625,-3.1875 z m 8.3125,7.59375 c 0.852375,1.223658 1.281206,2.679142 1.28125,4.375 -6.1e-5,2.129494 -0.81711,4.017469 -2.4375,5.625 -1.502657,1.503172 -3.710031,2.250011 -6.65625,2.25 -2.487851,7e-6 -4.988305,-0.967727 -7.34375,-3.015625 2.940596,3.289974 6.065444,4.890634 9.21875,4.890625 2.946219,1.1e-5 5.153593,-0.746828 6.65625,-2.25 1.62039,-1.607531 2.437439,-3.495506 2.4375,-5.625 -6.1e-5,-2.338228 -0.81711,-4.215698 -2.4375,-5.65625 C 54.734909,27.917887 54.506918,27.70901 54.25,27.53125 z M 29.28125,32.1875 c -2.916844,5.010548 -6.794926,7.531261 -11.65625,7.53125 -2.419266,1e-5 -4.259506,-0.33008 -5.820312,-1.421875 0.327066,0.474769 0.553213,0.705259 1.007812,1.109375 1.649895,1.461418 3.888519,2.187511 6.6875,2.1875 4.861324,1.1e-5 8.739406,-2.520702 11.65625,-7.53125 z m 4.625,6.09375 c -0.03847,0.04882 -0.08662,0.07671 -0.125,0.125 0.644368,0.697893 1.225264,1.274763 1.71875,1.6875 -0.496316,-0.544589 -1.011044,-1.10464 -1.59375,-1.8125 z"
+ id="text5100"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccscsccccccccccccccccccccscscccccsccscccccc" />
+ <path
+ inkscape:connector-curvature="0"
+ style="font-size:76.18933868px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.6;fill:#ccff00;fill-opacity:1;stroke:none;font-family:Sans"
+ d="m 18.497319,20.200444 c -4.183729,3.1e-5 -7.525146,1.07893 -9.9999998,3.1875 -2.769509,2.38003 -4.15626,5.305149 -4.15625,8.8125 -10e-6,3.65353 1.386741,6.599526 4.15625,8.8125 0.04016,0.03229 0.08452,0.06195 0.125,0.09375 -2.099258,-2.088931 -3.156258,-4.725391 -3.15625,-7.90625 -10e-6,-3.507351 1.386741,-6.43247 4.15625,-8.8125 2.4748538,-2.10857 5.8162708,-3.187469 9.9999998,-3.1875 2.150754,3.1e-5 4.033984,0.342464 5.625,0.96875 1.753945,0.651051 3.209663,1.526594 4.4375,2.625 -0.294623,-0.289675 -0.611631,-0.546309 -0.90625,-0.8125 -1.266931,-1.189973 -2.800129,-2.123522 -4.65625,-2.8125 -1.591016,-0.626286 -3.474246,-0.968719 -5.625,-0.96875 z m 27.75,0.09375 c -3.388264,3.1e-5 -6.163553,0.695138 -8.34375,2.03125 -1.699949,1.082082 -3.715349,3.033428 -5.640625,5.453125 0.333421,0.377464 0.666573,0.748711 1,1.15625 1.973964,-2.505241 4.027282,-4.502854 5.765625,-5.609375 2.180197,-1.336112 4.955486,-2.031219 8.34375,-2.03125 3.960394,3.1e-5 7.258204,1.065688 9.875,3.15625 -0.3384,-0.344593 -0.699118,-0.653406 -1.09375,-0.96875 -2.622243,-2.10857 -5.928835,-3.187469 -9.90625,-3.1875 z m 7.71875,6.875 c 1.240618,1.358666 1.874946,3.047801 1.875,5.09375 -6.1e-5,2.129494 -0.81711,4.017469 -2.4375,5.625 -1.502657,1.503172 -3.710031,2.250011 -6.65625,2.25 -2.255932,6e-6 -4.477939,-0.847369 -6.625,-2.53125 2.502325,2.328598 5.097121,3.531257 7.75,3.53125 2.946219,1.1e-5 5.153593,-0.746828 6.65625,-2.25 1.62039,-1.607531 2.437439,-3.495506 2.4375,-5.625 -6.1e-5,-2.338228 -0.81711,-4.215698 -2.4375,-5.65625 -0.174038,-0.154146 -0.375679,-0.299613 -0.5625,-0.4375 z m -24.375,5.375 c -2.916844,5.010548 -6.794926,7.531261 -11.65625,7.53125 -2.449108,1e-5 -4.461911,-0.568603 -6.03125,-1.6875 0.15565,0.165457 0.294325,0.344945 0.46875,0.5 1.649895,1.461418 3.888519,2.187511 6.6875,2.1875 4.861324,1.1e-5 8.739406,-2.520702 11.65625,-7.53125 z m 3.875,5.21875 c -0.04366,0.0554 -0.08146,0.10153 -0.125,0.15625 0.97366,1.114659 1.851375,2.034323 2.53125,2.59375 0.05858,0.05029 0.128837,0.07581 0.1875,0.125 -0.742667,-0.732421 -1.599645,-1.667381 -2.59375,-2.875 z"
+ id="text5058-0"
+ sodipodi:nodetypes="ccsccscccccccccccccccccccscscccccsccsccccccc" />
+ </g>
+</svg>
diff --git a/application/resources/multimc/scalable/new.svg b/application/resources/multimc/scalable/new.svg
new file mode 100644
index 00000000..c9cff358
--- /dev/null
+++ b/application/resources/multimc/scalable/new.svg
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) --><svg height="48" id="svg249" inkscape:export-filename="/home/luca/Desktop/flare-16.png" inkscape:export-xdpi="30" inkscape:export-ydpi="30" inkscape:output_extension="org.inkscape.output.svg.inkscape" inkscape:version="0.45+0.46pre0" sodipodi:docbase="/home/dobey/Projects/gnome-icon-theme/scalable/actions" sodipodi:docname="document-new.svg" sodipodi:version="0.32" version="1.0" width="48" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <metadata>
+ <rdf:RDF xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <cc:Work rdf:about="">
+ <dc:title>New Document</dc:title>
+ <dc:description></dc:description>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>regular</rdf:li>
+ <rdf:li>plaintext</rdf:li>
+ <rdf:li>text</rdf:li>
+ <rdf:li>document</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <dc:publisher>
+ <cc:Agent rdf:about="http://www.openclipart.org/">
+ <dc:title>Source: GNOME Icon Theme, Source: GNOME Icon Theme, Source: GNOME Icon Theme, Source: GNOME Icon Theme, Source: GNOME Icon Theme</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:rights>
+ <dc:date></dc:date>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <cc:license rdf:resource="http://creativecommons.org/licenses/GPL/2.0/"/>
+ <dc:language>en</dc:language>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id="defs3">
+ <linearGradient id="linearGradient3656" inkscape:collect="always">
+ <stop id="stop3658" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop3660" offset="1" style="stop-color:#ffffff;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient4253" inkscape:collect="always" x1="-26.753757" x2="-24.75" xlink:href="#linearGradient3656" y1="11.566258" y2="9.687501"/>
+ <linearGradient id="linearGradient3520" inkscape:collect="always">
+ <stop id="stop3522" offset="0" style="stop-color:#000000;stop-opacity:0.41295547"/>
+ <stop id="stop3524" offset="1" style="stop-color:#000000;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient gradientTransform="matrix(0.9223058,0,0,0.9185751,-92.447368,1.3256997)" gradientUnits="userSpaceOnUse" id="linearGradient4273" inkscape:collect="always" x1="-18.588562" x2="-28.789402" xlink:href="#linearGradient3520" y1="11.052948" y2="14.069944"/>
+ <linearGradient id="linearGradient3671">
+ <stop id="stop3673" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop3691" offset="0.47533694" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop3675" offset="1" style="stop-color:#ffffff;stop-opacity:0;"/>
+ </linearGradient>
+ <radialGradient cx="-26.305403" cy="10.108011" fx="-26.305403" fy="10.108011" gradientTransform="matrix(0.4073362,-0.2798276,0.7510293,1.0932492,-115.18484,-8.4378699)" gradientUnits="userSpaceOnUse" id="radialGradient4276" inkscape:collect="always" r="7.0421038" xlink:href="#linearGradient3671"/>
+ <linearGradient id="linearGradient3741" inkscape:collect="always">
+ <stop id="stop3743" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop3745" offset="1" style="stop-color:#ffffff;stop-opacity:0;"/>
+ </linearGradient>
+ <radialGradient cx="4" cy="5.2999997" fx="4" fy="5.2999997" gradientTransform="matrix(1.8860258,0,0,1.1764706,-3.5441033,-4.2352941)" gradientUnits="userSpaceOnUse" id="radialGradient4247" inkscape:collect="always" r="17" xlink:href="#linearGradient3741"/>
+ <linearGradient id="linearGradient3613" inkscape:collect="always">
+ <stop id="stop3615" offset="0" style="stop-color:#888a85;stop-opacity:1"/>
+ <stop id="stop3617" offset="1" style="stop-color:#babdb6;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient gradientTransform="translate(-90,0)" gradientUnits="userSpaceOnUse" id="linearGradient4282" inkscape:collect="always" x1="-47.5" x2="-62.75" xlink:href="#linearGradient3613" y1="49.020683" y2="-22.502075"/>
+ <linearGradient id="linearGradient3683">
+ <stop id="stop3685" offset="0" style="stop-color:#f6f6f5;stop-opacity:1;"/>
+ <stop id="stop3689" offset="1" style="stop-color:#d3d7cf;stop-opacity:1"/>
+ </linearGradient>
+ <radialGradient cx="-30.249996" cy="35.357208" fx="-30.249996" fy="35.357208" gradientTransform="matrix(3.9957492,0,0,1.9350367,0.62141,-31.167422)" gradientUnits="userSpaceOnUse" id="radialGradient4280" inkscape:collect="always" r="18.000002" xlink:href="#linearGradient3683"/>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient4241" inkscape:collect="always" x1="25.058096" x2="25.058096" xlink:href="#linearGradient3702" y1="47.027729" y2="39.999443"/>
+ <radialGradient cx="4.9929786" cy="43.5" fx="4.9929786" fy="43.5" gradientTransform="matrix(2.003784,0,0,1.4,-20.01187,-104.4)" gradientUnits="userSpaceOnUse" id="radialGradient4239" inkscape:collect="always" r="2.5" xlink:href="#linearGradient3688"/>
+ <radialGradient cx="4.9929786" cy="43.5" fx="4.9929786" fy="43.5" gradientTransform="matrix(2.003784,0,0,1.4,27.98813,-17.4)" gradientUnits="userSpaceOnUse" id="radialGradient4237" inkscape:collect="always" r="2.5" xlink:href="#linearGradient3688"/>
+ <linearGradient id="linearGradient3702">
+ <stop id="stop3704" offset="0" style="stop-color:black;stop-opacity:0;"/>
+ <stop id="stop3710" offset="0.5" style="stop-color:black;stop-opacity:1;"/>
+ <stop id="stop3706" offset="1" style="stop-color:black;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient4235" inkscape:collect="always" x1="25.058096" x2="25.058096" xlink:href="#linearGradient3702" y1="47.027729" y2="39.999443"/>
+ <radialGradient cx="4.9929786" cy="43.5" fx="4.9929786" fy="43.5" gradientTransform="matrix(2.003784,0,0,1.4,-20.01187,-104.4)" gradientUnits="userSpaceOnUse" id="radialGradient4233" inkscape:collect="always" r="2.5" xlink:href="#linearGradient3688"/>
+ <linearGradient id="linearGradient3688" inkscape:collect="always">
+ <stop id="stop3690" offset="0" style="stop-color:black;stop-opacity:1;"/>
+ <stop id="stop3692" offset="1" style="stop-color:black;stop-opacity:0;"/>
+ </linearGradient>
+ <radialGradient cx="4.9929786" cy="43.5" fx="4.9929786" fy="43.5" gradientTransform="matrix(2.003784,0,0,1.4,27.98813,-17.4)" gradientUnits="userSpaceOnUse" id="radialGradient4231" inkscape:collect="always" r="2.5" xlink:href="#linearGradient3688"/>
+ <linearGradient id="linearGradient2378">
+ <stop id="stop2380" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop4146" offset="0.25" style="stop-color:#fefede;stop-opacity:0.91836733;"/>
+ <stop id="stop2386" offset="0.5" style="stop-color:#f5f328;stop-opacity:1;"/>
+ <stop id="stop2382" offset="1" style="stop-color:#f5f32d;stop-opacity:0.12234043;"/>
+ </linearGradient>
+ <radialGradient cx="38.658855" cy="9.3411446" fx="38.658855" fy="9.3411446" gradientUnits="userSpaceOnUse" id="radialGradient3271" inkscape:collect="always" r="8.341651" xlink:href="#linearGradient2378"/>
+ </defs>
+ <sodipodi:namedview bordercolor="#666666" borderopacity="0.3254902" id="base" inkscape:current-layer="layer5" inkscape:cx="40.26271" inkscape:cy="28.37649" inkscape:document-units="px" inkscape:grid-bbox="true" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:showpageshadow="false" inkscape:window-height="939" inkscape:window-width="929" inkscape:window-x="751" inkscape:window-y="91" inkscape:zoom="1" pagecolor="#ffffff" showborder="true" showgrid="false"/>
+ <g id="layer6" inkscape:groupmode="layer" inkscape:label="Shadow"/>
+ <g id="layer1" inkscape:groupmode="layer" inkscape:label="Base" style="display:inline"/>
+ <g id="layer5" inkscape:groupmode="layer" inkscape:label="Text" style="display:inline">
+ <g id="g4425" style="display:inline" transform="translate(150,0)">
+ <rect height="48" id="rect2503" style="opacity:0;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;display:inline" width="48" x="-150" y="0"/>
+ <g id="g4408">
+ <g id="g3697" inkscape:label="Shadow" style="opacity:0.65587045;display:inline" transform="matrix(1.0464281,0,0,0.8888889,-151.18571,5.7222396)">
+ <g id="g3699" style="opacity:0.4" transform="matrix(1.052632,0,0,1.285713,-1.263158,-13.42854)">
+ <rect height="7" id="rect3701" style="opacity:1;fill:url(#radialGradient4231);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" width="5" x="38" y="40"/>
+ <rect height="7" id="rect3703" style="opacity:1;fill:url(#radialGradient4233);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="scale(-1,-1)" width="5" x="-10" y="-47"/>
+ <rect height="7.0000005" id="rect3705" style="opacity:1;fill:url(#linearGradient4235);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" width="28" x="10" y="40"/>
+ </g>
+ </g>
+ <g id="g3713" inkscape:label="Shadow" style="display:inline" transform="matrix(0.9548466,0,0,0.5555562,-148.98776,19.888875)">
+ <g id="g3715" style="opacity:0.4" transform="matrix(1.052632,0,0,1.285713,-1.263158,-13.42854)">
+ <rect height="7" id="rect3717" style="opacity:1;fill:url(#radialGradient4237);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" width="5" x="38" y="40"/>
+ <rect height="7" id="rect3719" style="opacity:1;fill:url(#radialGradient4239);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="scale(-1,-1)" width="5" x="-10" y="-47"/>
+ <rect height="7.0000005" id="rect3721" style="opacity:1;fill:url(#linearGradient4241);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" width="28" x="10" y="40"/>
+ </g>
+ </g>
+ <path d="M -141.47614,3.5 C -141.47614,3.5 -124,3.5 -122.5,3.5 C -118.62295,3.5729425 -116,6 -113.5,8.5 C -111,11 -108.89232,13.752625 -108.5,17.5 C -108.5,19 -108.5,42.476142 -108.5,42.476142 C -108.5,43.597359 -109.40264,44.5 -110.52385,44.5 L -141.47614,44.5 C -142.59736,44.5 -143.5,43.597359 -143.5,42.476142 L -143.5,5.523858 C -143.5,4.402641 -142.59736,3.5 -141.47614,3.5 z" id="path3499" sodipodi:nodetypes="ccsccccccc" style="fill:url(#radialGradient4280);fill-opacity:1;stroke:url(#linearGradient4282);stroke-width:1;stroke-miterlimit:4;display:inline"/>
+ <path d="M 8.53125,4 C 7.6730803,4 7,4.6730802 7,5.53125 L 7,42.46875 C 7,43.32692 7.6730802,44 8.53125,44 L 39.46875,44 C 40.326919,44 41,43.326918 41,42.46875 C 41,42.46875 41,19 41,17.5 C 41,16.10803 40.513021,13.200521 38.65625,11.34375 C 36.65625,9.34375 35.65625,8.34375 33.65625,6.34375 C 31.799479,4.4869792 28.89197,4 27.5,4 C 26,4 8.53125,4 8.53125,4 z" id="path3735" inkscape:original="M 8.53125 3.5 C 7.410033 3.5 6.5 4.4100329 6.5 5.53125 L 6.5 42.46875 C 6.5 43.589967 7.4100329 44.5 8.53125 44.5 L 39.46875 44.5 C 40.589967 44.5 41.5 43.589966 41.5 42.46875 C 41.5 42.46875 41.5 19 41.5 17.5 C 41.5 16 41 13 39 11 C 37 9 36 8 34 6 C 32 4 29 3.5 27.5 3.5 C 26 3.5 8.5312499 3.5 8.53125 3.5 z " inkscape:radius="-0.4861359" sodipodi:type="inkscape:offset" style="opacity:0.68016196;fill:url(#radialGradient4247);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;display:inline" transform="translate(-150,0)"/>
+ <path d="M -122.5,4 C -123.88889,4 -122.54207,4.4970883 -121.15625,5.125 C -119.77043,5.7529117 -116.18337,8.3400517 -117,12 C -112.67669,11.569417 -110.32087,15.122378 -110,16.28125 C -109.67913,17.440122 -109,18.888889 -109,17.5 C -108.97167,13.694419 -111.84543,11.068299 -113.84375,8.84375 C -115.84207,6.6192012 -118.84621,4.4767615 -122.5,4 z" id="path3666" sodipodi:nodetypes="ccccczc" style="fill:url(#radialGradient4276);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;display:inline"/>
+ <path d="M -121.39912,5.0143528 C -120.47682,5.0143528 -118.39068,11.210015 -119.31298,15.343603 C -115.01802,14.915844 -110.4596,15.43178 -110,16.28125 C -110.32087,15.122378 -112.67669,11.569417 -117,12 C -116.13534,8.124761 -120.18657,5.3827023 -121.39912,5.0143528 z" id="path3625" sodipodi:nodetypes="ccccc" style="opacity:0.87854249;fill:url(#linearGradient4273);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;display:inline"/>
+ <path d="M -51.46875,4.5 C -52.051916,4.5 -52.5,4.9480842 -52.5,5.53125 L -52.5,42.46875 C -52.5,43.051915 -52.051914,43.5 -51.46875,43.5 L -20.53125,43.5 C -19.948085,43.5 -19.5,43.051914 -19.5,42.46875 C -19.5,42.46875 -19.5,19 -19.5,17.5 C -19.5,16.220971 -19.980469,13.394531 -21.6875,11.6875 C -23.6875,9.6875 -24.6875,8.6875 -26.6875,6.6875 C -28.394531,4.9804687 -31.220971,4.5 -32.5,4.5 C -34,4.5 -51.46875,4.5 -51.46875,4.5 z" id="path3650" inkscape:original="M -51.46875 3.5 C -52.589967 3.5 -53.5 4.4100329 -53.5 5.53125 L -53.5 42.46875 C -53.5 43.589967 -52.589966 44.5 -51.46875 44.5 L -20.53125 44.5 C -19.410033 44.5 -18.5 43.589966 -18.5 42.46875 C -18.5 42.46875 -18.5 19 -18.5 17.5 C -18.5 16 -19 13 -21 11 C -23 9 -24 8 -26 6 C -28 4 -31 3.5 -32.5 3.5 C -34 3.5 -51.468749 3.5 -51.46875 3.5 z " inkscape:radius="-0.99436891" sodipodi:type="inkscape:offset" style="fill:none;fill-opacity:1;stroke:url(#linearGradient4253);stroke-width:1;stroke-miterlimit:4;display:inline" transform="translate(-90,0)"/>
+ </g>
+ </g>
+ <g id="g14103">
+ <path d="M 47.000506 9.3411446 A 8.341651 8.341651 0 1 1 30.317204,9.3411446 A 8.341651 8.341651 0 1 1 47.000506 9.3411446 z" id="path2388" sodipodi:cx="38.658855" sodipodi:cy="9.3411446" sodipodi:rx="8.341651" sodipodi:ry="8.341651" sodipodi:type="arc" style="fill:url(#radialGradient3271);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" transform="matrix(1.14985,0,0,1.14985,-7.595328,0.490895)"/>
+ <path d="M 44.520054,15.50279 C 44.012883,16.381236 39.925351,15.341967 38.998703,15.754538 C 38.072055,16.167108 36.109289,19.900142 35.117113,19.689249 C 34.124936,19.478355 33.850222,15.26973 33.171495,14.515926 C 32.492767,13.762123 28.335913,13.048993 28.229885,12.040207 C 28.123857,11.031421 32.041607,9.4696164 32.548778,8.5911701 C 33.055949,7.7127238 32.449637,3.5389508 33.376285,3.1263806 C 34.302933,2.7138103 36.998949,5.957187 37.991126,6.1680807 C 38.983302,6.3789743 42.765436,4.5125708 43.444163,5.2663741 C 44.122891,6.0201775 41.871371,9.5864995 41.977399,10.595285 C 42.083426,11.604071 45.027225,14.624343 44.520054,15.50279 z " id="path1345" inkscape:flatsided="false" inkscape:randomized="0" inkscape:rounded="0.18352206" sodipodi:arg1="0.52359878" sodipodi:arg2="1.1519173" sodipodi:cx="36.9375" sodipodi:cy="11.125" sodipodi:r1="8.755579" sodipodi:r2="5.0676599" sodipodi:sides="5" sodipodi:type="star" style="opacity:1;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" transform="matrix(0.674116,0.299577,-0.299577,0.674116,15.46413,-7.192469)"/>
+ </g>
+ </g>
+</svg>
diff --git a/application/resources/multimc/scalable/news.svg b/application/resources/multimc/scalable/news.svg
new file mode 100644
index 00000000..67a370df
--- /dev/null
+++ b/application/resources/multimc/scalable/news.svg
@@ -0,0 +1,296 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="128"
+ height="128"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="news.svg">
+ <defs
+ id="defs2987">
+ <linearGradient
+ id="linearGradient4095">
+ <stop
+ style="stop-color:#fff7d8;stop-opacity:1;"
+ offset="0"
+ id="stop4097" />
+ <stop
+ style="stop-color:#ffeca0;stop-opacity:1;"
+ offset="1"
+ id="stop4099" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter3898"
+ x="-0.11333333"
+ width="1.2266667"
+ y="-0.10074074"
+ height="1.2014815">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.5111111"
+ id="feGaussianBlur3900" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter4091">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="3.6378601"
+ id="feGaussianBlur4093" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4095"
+ id="linearGradient4101"
+ x1="88.388351"
+ y1="94.942757"
+ x2="99.525276"
+ y2="103.95837"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.25"
+ inkscape:cx="-700.46253"
+ inkscape:cy="-25.005652"
+ inkscape:current-layer="text3832"
+ showgrid="false"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1607"
+ inkscape:window-height="1030"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ showguides="false"
+ inkscape:guide-bbox="true"
+ inkscape:snap-global="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2993"
+ empspacing="8"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ <inkscape:grid
+ type="xygrid"
+ id="grid2995"
+ empspacing="4"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ color="#00ff0b"
+ opacity="0.08235294"
+ empcolor="#00ff22"
+ empopacity="0.23137255" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="41,100"
+ id="guide4165" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="68,106"
+ id="guide4167" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="73,109"
+ id="guide4169" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="80,106"
+ id="guide4171" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="83,102"
+ id="guide4173" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="104,104"
+ id="guide4175" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata2990">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ transform="translate(0,64)">
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path3778"
+ d="m 16,8 96,0 0,76 c -9.14072,13.804136 -19.955033,25.58254 -32,36 l -64,0 z"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;filter:url(#filter4091)"
+ transform="translate(0,-64)" />
+ <path
+ transform="translate(0,-64)"
+ style="color:#000000;fill:#fff6d3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 16,8 96,0 0,76 c -9.14072,13.804136 -19.955033,25.58254 -32,36 l -64,0 z"
+ id="rect2997"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ <path
+ style="color:#000000;fill:none;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 68,-28 36,0 0,56 -16,20 -20,0 z"
+ id="rect4044"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ <g
+ id="g4129">
+ <path
+ id="rect4103"
+ d="m 24,36 36,0 0,36 -36,0 z"
+ style="color:#000000;fill:#fff6d3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="translate(0,-64)" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="rect4107"
+ d="m 68,36 36,0 0,57 -16,19 -20,0 z"
+ style="color:#000000;fill:#fff6d3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="translate(0,-64)" />
+ <flowRoot
+ id="flowRoot4115"
+ style="font-size:8px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4117"><use
+ height="128"
+ width="128"
+ id="use4119"
+ xlink:href="#rect4103"
+ y="0"
+ x="0" /><use
+ height="128"
+ width="128"
+ id="use4121"
+ xlink:href="#rect4107"
+ y="0"
+ x="0" /></flowRegion><flowPara
+ style="font-size:2px;font-weight:bold;text-align:justify;text-anchor:start;-inkscape-font-specification:Sans Bold"
+ id="flowPara4123">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce convallis mauris ullamcorper mauris viverra molestie. Donec ultricies faucibus laoreet. Donec convallis congue neque consequat vehicula. Morbi condimentum tempor nulla et rhoncus. Etiam auctor, augue eu pharetra congue, elit justo lacinia risus, non lacinia est justo sed erat. Ut risus urna, viverra id interdum in, molestie non sem. Morbi leo orci, gravida auctor tempor vel, varius et enim. Nulla sem enim, ultricies vel laoreet ac, semper vel mauris. Ut adipiscing sapien sed leo pretium id vulputate erat gravida. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras tempor leo sit amet velit molestie commodo eget tincidunt leo. Cras dictum metus non ante pulvinar pellentesque. Morbi id elit ullamcorper mi vulputate lobortis. Cras ac vehicula felis. Phasellus dictum, tellus at molestie pellentesque, purus purus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce convallis mauris ullamcorper mauris viverra molestie. Donec ultricies faucibus laoreet. Donec convallis congue neque consequat vehicula. Morbi condimentum tempor nulla et rhoncus. Etiam auctor, augue eu pharetra congue, elit justo lacinia risus, non lacinia est justo sed erat. Ut risus urna, </flowPara></flowRoot> </g>
+ <path
+ style="opacity:0.41176471;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3898);enable-background:accumulate"
+ d="M 85.522922,28.087287 C 96.299051,25.849792 101.98214,24.118305 110.44998,20.924851 101.30926,34.728987 91.732381,44.562847 79.687414,54.980307 83.49938,42.627824 86.087749,33.764885 85.522922,28.087287 z"
+ id="path3848"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <g
+ transform="scale(1.3146517,0.76065775)"
+ style="font-size:26.48733711px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;font-family:Sans"
+ id="text3832">
+ <path
+ d="m 30.25786,-47.327461 -2.845319,0 -6.874782,-17.090472 0,17.090472 -2.281973,0 0,-21.034427 3.042631,0 6.84592,17.090472 0,-17.090472 2.281973,0 0,21.034427"
+ style="font-variant:normal;font-stretch:normal;fill:#008000;font-family:Oxygen Mono;-inkscape-font-specification:Oxygen Mono"
+ id="path4157"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ <path
+ d="m 37.27223,-56.530023 0,6.573259 7.606577,0 0.818953,2.629303 -10.707504,0 0,-21.034427 10.649209,0 -0.760658,2.629303 -7.606577,0 0.0038,6.512419 7.602816,0 -3.9e-5,2.690143"
+ style="font-variant:normal;font-stretch:normal;fill:#008000;font-family:Oxygen Mono;-inkscape-font-specification:Oxygen Mono"
+ id="path4159"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccc" />
+ <path
+ d="m 60.091962,-50.290057 0.760658,-18.071831 2.281973,0 -1.521316,21.034427 -3.04263,0 -2.281974,-7.88791 -2.277041,7.88791 -3.047563,0 -1.61189,-21.034427 2.368129,0 0.765077,18.405124 3.042631,-9.202562 1.521315,0 3.042631,8.869269"
+ style="font-variant:normal;font-stretch:normal;fill:#008000;font-family:Oxygen Mono;-inkscape-font-specification:Oxygen Mono"
+ id="path4161"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccc" />
+ <path
+ d="m 67.201805,-51.228789 c 1.498704,1.191317 3.283103,1.786974 5.3532,1.786972 1.124022,2e-6 1.990463,-0.331929 2.599324,-0.995793 0.608839,-0.672953 0.913263,-1.586899 0.913275,-2.741842 -1.2e-5,-0.336472 -0.04684,-0.650214 -0.140504,-0.941229 -0.08431,-0.291 -0.192033,-0.545633 -0.323158,-0.763896 -0.13115,-0.218249 -0.318487,-0.431957 -0.562017,-0.641127 -0.234183,-0.209154 -0.449623,-0.377393 -0.646317,-0.504718 -0.196716,-0.1364 -0.45899,-0.281905 -0.786822,-0.436511 -0.318486,-0.15459 -0.585443,-0.272812 -0.800874,-0.354666 -0.206079,-0.08183 -0.487089,-0.190965 -0.843023,-0.327385 -0.346583,-0.1364 -0.604173,-0.240981 -0.772772,-0.313742 -0.580755,-0.236435 -1.067835,-0.445597 -1.461242,-0.627488 -0.384048,-0.190962 -0.810244,-0.450141 -1.278584,-0.777536 -0.468351,-0.327373 -0.843028,-0.668397 -1.124032,-1.023075 -0.28101,-0.354653 -0.519866,-0.795713 -0.716571,-1.323177 -0.187339,-0.536533 -0.281009,-1.127643 -0.281007,-1.773331 -2e-6,-1.700561 0.594798,-3.019191 1.784399,-3.955891 1.189595,-0.945755 2.721087,-1.418643 4.594479,-1.418664 2.360456,2.1e-5 4.201056,0.504737 5.521806,1.514151 l -0.983527,1.964305 c -1.217713,-0.918476 -2.683637,-1.377724 -4.397774,-1.377741 -1.105305,1.7e-5 -1.985796,0.295573 -2.641474,0.886664 -0.646325,0.582034 -0.969483,1.386852 -0.969477,2.414458 -6e-6,0.400151 0.08429,0.773005 0.252905,1.118562 0.168601,0.336492 0.369989,0.618405 0.604168,0.845743 0.234168,0.218269 0.543277,0.436525 0.927327,0.654768 0.393404,0.218268 0.735296,0.386507 1.025679,0.504717 0.290365,0.109139 0.66036,0.250096 1.10998,0.422871 0.449605,0.163703 0.777446,0.291019 0.983528,0.381948 0.562005,0.245549 1.044402,0.472898 1.44719,0.682049 0.402767,0.20008 0.833645,0.472899 1.292638,0.81846 0.468332,0.336489 0.847692,0.691155 1.13808,1.064 0.290362,0.372862 0.529218,0.832109 0.716571,1.377741 0.196691,0.536553 0.295042,1.123115 0.295058,1.75969 -1.6e-5,1.955213 -0.585447,3.446628 -1.756299,4.474248 -1.161511,1.018529 -2.753887,1.527792 -4.777134,1.527793 -2.519709,-10e-7 -4.6179,-0.541094 -6.294577,-1.623281 l 0.997578,-2.278047"
+ style="font-variant:normal;font-stretch:normal;fill:#008000;font-family:Oxygen Mono;-inkscape-font-specification:Oxygen Mono"
+ id="path4163"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path3838"
+ d="M 88.181818,93.090909 C 100.37216,91.737298 104.94638,87.547007 112,84 c -9.14072,13.804136 -19.955033,25.58254 -32,36 4.69585,-10.93827 8.746645,-21.231493 8.181818,-26.909091 z"
+ style="color:#000000;fill:url(#linearGradient4101);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:1"
+ transform="translate(0,-64)" />
+ <rect
+ style="color:#000000;fill:#accc74;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect4138"
+ width="36"
+ height="36"
+ x="24"
+ y="76"
+ transform="translate(0,-64)" />
+ <g
+ id="g4000"
+ transform="matrix(0.60097005,0,0,0.60097012,3.5088114,25.221343)"
+ style="fill:#333333">
+ <g
+ id="g3937"
+ style="fill:#333333">
+ <rect
+ style="color:#000000;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3906"
+ width="16"
+ height="16"
+ x="40"
+ y="-16" />
+ <rect
+ style="color:#000000;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3908"
+ width="16"
+ height="16"
+ x="72"
+ y="-16" />
+ <path
+ style="color:#000000;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 56,64 0,8 -8,0 0,24 8,0 0,-8 16,0 0,8 8,0 0,-24 -8,0 0,-8 -16,0 z"
+ transform="translate(0,-64)"
+ id="rect3910"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 24,32 80,0"
+ id="path3998"
+ inkscape:connector-curvature="0"
+ transform="translate(0,-64)" />
+ <rect
+ style="color:#000000;fill:none;stroke:#666666;stroke-width:0.9014551;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect4007"
+ width="36.058205"
+ height="36.058208"
+ x="23.941793"
+ y="12" />
+ <rect
+ style="color:#000000;fill:none;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect4034"
+ width="36"
+ height="32"
+ x="24"
+ y="-28" />
+ </g>
+</svg>
diff --git a/application/resources/multimc/scalable/proxy.svg b/application/resources/multimc/scalable/proxy.svg
new file mode 100644
index 00000000..55ee6f93
--- /dev/null
+++ b/application/resources/multimc/scalable/proxy.svg
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ width="64"
+ height="64"
+ id="svg2">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient3931">
+ <stop
+ id="stop3933"
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="0" />
+ <stop
+ id="stop3939"
+ style="stop-color:#ffffff;stop-opacity:0.18039216"
+ offset="0.69999999" />
+ <stop
+ id="stop3935"
+ style="stop-color:#ffffff;stop-opacity:0.3611111"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3900">
+ <stop
+ id="stop3902"
+ style="stop-color:#f6f6f6;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3904"
+ style="stop-color:#494949;stop-opacity:1"
+ offset="0.75714284" />
+ <stop
+ id="stop3906"
+ style="stop-color:#2c2c2c;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3808">
+ <stop
+ id="stop3810"
+ style="stop-color:#333333;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3812"
+ style="stop-color:#c8c8c8;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3030">
+ <stop
+ id="stop3032"
+ style="stop-color:#36c536;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3038"
+ style="stop-color:#1f721f;stop-opacity:1"
+ offset="0.75714284" />
+ <stop
+ id="stop3034"
+ style="stop-color:#134513;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ cx="24"
+ cy="16"
+ r="16.375"
+ fx="24"
+ fy="16"
+ id="radialGradient3036"
+ xlink:href="#linearGradient3030"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1497507,1.7246237,-1.4656488,0.97709922,19.856365,-41.024557)" />
+ <linearGradient
+ x1="30"
+ y1="1033.8622"
+ x2="34"
+ y2="1033.8622"
+ id="linearGradient3824"
+ xlink:href="#linearGradient3808"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5,0,0,1,-16,0)" />
+ <linearGradient
+ x1="32"
+ y1="1043.3622"
+ x2="32"
+ y2="1039.3622"
+ id="linearGradient3834"
+ xlink:href="#linearGradient3808"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.82142857,0,0,1.500001,6.7142857,-522.68214)" />
+ <radialGradient
+ cx="30.724609"
+ cy="1039.813"
+ r="3"
+ fx="30.724609"
+ fy="1039.813"
+ id="radialGradient3844"
+ xlink:href="#linearGradient3900"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9033547,2.9862934,-4.666644,3.3333362,4792.8997,-2518.4369)" />
+ <radialGradient
+ cx="30.724609"
+ cy="1039.813"
+ r="3"
+ fx="30.724609"
+ fy="1039.813"
+ id="radialGradient3852"
+ xlink:href="#linearGradient3900"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.5191507,2.9862959,-4.0491019,3.333339,4186.8847,-2518.44)" />
+ <radialGradient
+ cx="30.724609"
+ cy="1039.813"
+ r="3"
+ fx="30.724609"
+ fy="1039.813"
+ id="radialGradient3857"
+ xlink:href="#linearGradient3900"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.5191507,2.9863064,4.0491022,3.3333507,-4122.8849,-2518.4524)" />
+ <radialGradient
+ cx="31.964285"
+ cy="25.25"
+ r="19.25"
+ fx="31.964285"
+ fy="25.25"
+ id="radialGradient3937"
+ xlink:href="#linearGradient3931"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.97517967,0.03814675,-0.04025373,1.0289295,1.809772,-1.9498045)" />
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-988.36218)"
+ id="layer1">
+ <rect
+ width="6"
+ height="13.000005"
+ rx="0.70710504"
+ ry="0.70710492"
+ x="29"
+ y="1027.3622"
+ id="rect3028"
+ style="color:#000000;fill:url(#linearGradient3824);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.75;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ width="46"
+ height="6.0000076"
+ rx="0.70710504"
+ ry="0.70710492"
+ x="10"
+ y="1036.3622"
+ id="rect2991"
+ style="color:#000000;fill:url(#linearGradient3834);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.75;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ width="32"
+ height="32"
+ rx="0.70710504"
+ ry="0.70710492"
+ x="16"
+ y="8"
+ transform="translate(0,988.36218)"
+ id="rect2997"
+ style="color:#000000;fill:url(#radialGradient3036);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.75;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ width="6"
+ height="6"
+ x="23"
+ y="1003.3622"
+ id="rect3001"
+ style="color:#000000;fill:#112b00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.75;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ width="6"
+ height="6"
+ x="35"
+ y="1003.3622"
+ id="rect3003"
+ style="color:#000000;fill:#112b00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.75;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="m 29,1009.3622 0,3 -3,0 0,9 3,0 0,-3 6,0 0,3 3,0 0,-9 -3,0 0,-3 -6,0 z"
+ id="rect3005"
+ style="color:#000000;fill:#112b00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.75;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ width="6"
+ height="2.9999955"
+ x="29"
+ y="1009.3622"
+ id="rect3011"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.75;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ width="3"
+ height="2.9999955"
+ x="26"
+ y="1012.3622"
+ id="rect3013"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.75;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ width="3"
+ height="2.9999955"
+ x="35"
+ y="1012.3622"
+ id="rect3015"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.75;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="m 35,1003.3622 0,6 3,0 0,-3 3,0 0,-3 -3,0 -3,0 z"
+ id="rect3017"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.75;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="m 23,1003.3622 0,3 0,3 3,0 0,-3 3,0 0,-3 -3,0 -3,0 z"
+ id="rect3021"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.75;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ width="14"
+ height="8.0000048"
+ rx="0.70710504"
+ ry="0.70710492"
+ x="25"
+ y="1035.3622"
+ id="rect3836"
+ style="color:#000000;fill:url(#radialGradient3844);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.76376289;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="m 51,1035.3622 5,0 6.073683,4 -6.073683,4 -5,0 c -0.59482,0 -1.073683,-0.4205 -1.073683,-0.9428 l 0,-6.1144 c 0,-0.5223 0.478876,-0.9428 1.073683,-0.9428 z"
+ id="rect3850"
+ style="color:#000000;fill:url(#radialGradient3852);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.71143585;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="m 13,1035.3622 -5,0 -6.0736829,4 6.0736829,4 5,0 c 0.59482,0 1.073683,-0.4205 1.073683,-0.9428 l 0,-6.1144 c 0,-0.5223 -0.478877,-0.9428 -1.073683,-0.9428 z"
+ id="path3855"
+ style="color:#000000;fill:url(#radialGradient3857);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.71143711;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ width="38"
+ height="38"
+ rx="0.70710504"
+ ry="0.70710492"
+ x="13"
+ y="5"
+ transform="translate(0,988.36218)"
+ id="rect3927"
+ style="color:#000000;fill:url(#radialGradient3937);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+</svg>
diff --git a/application/resources/multimc/scalable/screenshot-placeholder.svg b/application/resources/multimc/scalable/screenshot-placeholder.svg
new file mode 100644
index 00000000..a7a2a3d6
--- /dev/null
+++ b/application/resources/multimc/scalable/screenshot-placeholder.svg
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="256"
+ height="256"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="screenshot-placeholder.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.49497475"
+ inkscape:cx="-33.672765"
+ inkscape:cy="136.19802"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-nodes="false"
+ inkscape:window-width="1612"
+ inkscape:window-height="1026"
+ inkscape:window-x="1677"
+ inkscape:window-y="-4"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingx="8px"
+ spacingy="8px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-796.36218)">
+ <g
+ id="g3009"
+ style="fill:#000000">
+ <path
+ id="rect2987"
+ transform="translate(0,796.36218)"
+ d="M 24 8 C 15.136 8 8 15.136 8 24 L 8 232 C 8 240.864 15.136 248 24 248 L 232 248 C 240.864 248 248 240.864 248 232 L 248 24 C 248 15.136 240.864 8 232 8 L 24 8 z M 24 16 L 232 16 C 236.432 16 240 19.568 240 24 L 240 232 C 240 236.432 236.432 240 232 240 L 24 240 C 19.568 240 16 236.432 16 232 L 16 24 C 16 19.568 19.568 16 24 16 z "
+ style="opacity:0.75000000000000000;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.75000000000000000;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="fill:#000000;opacity:0.75000000000000000;stroke:none"
+ inkscape:connector-curvature="0"
+ d="m 85.749999,937.9006 c 0,24.30067 18.915811,43.99997 42.249991,43.99997 23.33419,0 42.25001,-19.6993 42.25001,-43.99997 0,-24.30069 -18.91582,-43.99999 -42.25001,-43.99999 -23.33418,0 -42.249991,19.6993 -42.249991,43.99999 z M 219,863.43909 h -45.5 c -3.25,-13.53846 -6.50001,-27.07691 -19.5,-27.07691 h -52 c -13.000001,0 -16.250001,13.53845 -19.500001,27.07691 H 37 c -7.15,0 -13,6.09231 -13,13.53846 v 121.84603 c 0,7.44632 5.85,13.53862 13,13.53862 h 182 c 7.15,0 13,-6.0923 13,-13.53862 V 876.97755 c 0,-7.44615 -5.85,-13.53846 -13,-13.53846 z m -91.00001,134.53849 c -31.860147,0 -57.687491,-26.89678 -57.687491,-60.07698 0,-33.1798 25.827344,-60.0769 57.687491,-60.0769 31.86057,0 57.68751,26.8971 57.68751,60.0769 0,33.1802 -25.82653,60.07698 -57.68751,60.07698 z M 219,904.05445 h -26 v -13.53846 h 26 v 13.53846 z"
+ id="path2996" />
+ </g>
+ </g>
+</svg>
diff --git a/application/resources/multimc/scalable/screenshots.svg b/application/resources/multimc/scalable/screenshots.svg
new file mode 100644
index 00000000..a3d4d8e2
--- /dev/null
+++ b/application/resources/multimc/scalable/screenshots.svg
@@ -0,0 +1,1231 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1100"
+ height="1100"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="screenshots.svg"
+ inkscape:export-filename="/home/peterix/minecraft/src/MultiMC5/resources/multimc/16x16/screenshots.png"
+ inkscape:export-xdpi="1.3099999"
+ inkscape:export-ydpi="1.3099999">
+ <title
+ id="title3887">Golden Picture Frame</title>
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient3871">
+ <stop
+ id="stop3873"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#604d00;stop-opacity:1;"
+ offset="0.24157524"
+ id="stop3875" />
+ <stop
+ id="stop3877"
+ offset="1"
+ style="stop-color:#745d00;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3831">
+ <stop
+ style="stop-color:#fff2be;stop-opacity:1;"
+ offset="0"
+ id="stop3835" />
+ <stop
+ id="stop3839"
+ offset="0.5"
+ style="stop-color:#6a5500;stop-opacity:1;" />
+ <stop
+ id="stop3837"
+ offset="1"
+ style="stop-color:#745d00;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3817">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3819" />
+ <stop
+ id="stop3825"
+ offset="0.39502749"
+ style="stop-color:#604d00;stop-opacity:1;" />
+ <stop
+ style="stop-color:#745d00;stop-opacity:1;"
+ offset="1"
+ id="stop3821" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3831"
+ id="linearGradient3821"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.3556705,0,0,2.3556705,-1198.3938,-507.60896)"
+ x1="568.4173"
+ y1="501.39673"
+ x2="588.28278"
+ y2="502.30829" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3817"
+ id="linearGradient3823"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.3556705,0,0,2.3556705,-1198.3938,-507.60896)"
+ x1="731.26221"
+ y1="376.98492"
+ x2="731.15552"
+ y2="364.66559" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3871"
+ id="linearGradient3825"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.3556705,0,0,2.3556705,-1198.3938,-507.60896)"
+ x1="883.03296"
+ y1="502.69846"
+ x2="897.77411"
+ y2="502.96545" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3831"
+ id="linearGradient3827"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.3556705,0,0,2.3556705,-1198.3938,-507.60896)"
+ x1="723.38055"
+ y1="621.29663"
+ x2="721.71783"
+ y2="661.40479" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.16698148"
+ inkscape:cx="-510.5746"
+ inkscape:cy="-1131.4434"
+ inkscape:document-units="px"
+ inkscape:current-layer="g3807"
+ showgrid="false"
+ inkscape:window-width="1612"
+ inkscape:window-height="1026"
+ inkscape:window-x="1677"
+ inkscape:window-y="-4"
+ inkscape:window-maximized="1"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true" />
+ <g
+ inkscape:label="Capa 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(31.270747,-9.54776)">
+ <g
+ id="g3017"
+ transform="matrix(-1.3082428,0,0,1.1906703,1197.3531,-130.52295)">
+ <g
+ id="g3807"
+ transform="translate(0,-102.53568)">
+ <rect
+ y="365.48618"
+ x="555.12488"
+ height="287.45703"
+ width="344.34955"
+ id="rect3017"
+ style="fill:#000000;fill-opacity:0.78921569"
+ transform="matrix(2.3556705,0,0,2.3556705,-1198.3938,-507.60896)" />
+ <rect
+ y="352.5882"
+ x="141.80692"
+ height="641.88568"
+ width="768.85199"
+ id="rect3019"
+ style="fill:#000000;fill-opacity:1" />
+ <rect
+ style="fill:#fff6d5;fill-opacity:1;stroke:#502d16;stroke-width:2.35567045"
+ id="rect3013"
+ width="723.00299"
+ height="599.56348"
+ x="164.73138"
+ y="374.21686" />
+ <rect
+ style="fill:none;stroke:#808000;stroke-width:2.35567045"
+ id="rect3009"
+ width="603.09033"
+ height="469.07022"
+ x="224.68771"
+ y="438.99588" />
+ <rect
+ style="fill:#999999;stroke:none"
+ id="rect3015"
+ width="553.71448"
+ height="419.69443"
+ x="249.37567"
+ y="463.68384" />
+ <path
+ id="path3802"
+ d="m 120.66044,334.92569 0,677.18161 811.16043,0 0,-677.18161 -811.16043,0 z m 21.12742,17.66753 768.90559,0 0,641.8466 -768.90559,0 0,-641.8466 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#502d16;stroke-width:2.35567045"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#554400;fill-opacity:1"
+ d="m 559.94852,357.66235 0,287.46875 344.34375,0 -0.43711,-287.04864 z m 8.96875,7.5 326.40625,0 0,272.46875 -326.40625,0 z"
+ id="rect3797"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc"
+ transform="matrix(2.3556705,0,0,2.3556705,-1198.3938,-507.60896)" />
+ <path
+ style="fill:url(#linearGradient3821);fill-opacity:1;stroke:none"
+ d="m 164.75566,973.3124 0,-599.59176 -22.9678,-21.12742 0,641.8466 z"
+ id="path3815"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient3823);fill-opacity:1;stroke:none"
+ d="m 164.75566,373.72064 722.96999,0 22.9678,-21.12742 -768.90559,0 z"
+ id="path3813"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient3825);fill-opacity:1;stroke:none"
+ d="m 887.72565,373.72064 0,599.59176 22.9678,21.12742 0,-641.8466 z"
+ id="path3811"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient3827);fill-opacity:1;stroke:none"
+ d="m 887.72565,973.3124 -722.96999,0 -22.9678,21.12742 768.90559,0 z"
+ id="rect3804"
+ inkscape:connector-curvature="0" />
+ <image
+ y="463.68384"
+ x="-803.09015"
+ id="image3837"
+ xlink:href="data:image/png;base64,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
++1s8lHyeawAAAABJRU5ErkJggg==
+"
+ height="419.69443"
+ width="553.71448"
+ transform="scale(-1,1)" />
+ </g>
+ </g>
+ </g>
+ <metadata
+ id="metadata40">
+ <rdf:RDF>
+ <cc:Work>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:publisher>
+ <cc:Agent
+ rdf:about="http://openclipart.org/">
+ <dc:title>Open Clip Art Library</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:title>Golden Picture Frame</dc:title>
+ <dc:date>2012-05-24T10:08:07</dc:date>
+ <dc:description>Golden picture frame, Landscape</dc:description>
+ <dc:source>http://openclipart.org/detail/170182/golden-picture-frame-by-tasper</dc:source>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>tasper</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>clip art</rdf:li>
+ <rdf:li>clipart</rdf:li>
+ <rdf:li>frame</rdf:li>
+ <rdf:li>golden</rdf:li>
+ <rdf:li>landscape</rdf:li>
+ <rdf:li>photo</rdf:li>
+ <rdf:li>picture</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>edited by Paul Sherman</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+</svg>
diff --git a/application/resources/multimc/scalable/status-bad.svg b/application/resources/multimc/scalable/status-bad.svg
new file mode 100644
index 00000000..9f47307e
--- /dev/null
+++ b/application/resources/multimc/scalable/status-bad.svg
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg3891"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="status-bad.svg"
+ inkscape:export-filename="/home/peterix/minecraft/src/MultiMC5/resources/multimc/64x64/status-bad.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180">
+ <defs
+ id="defs3893">
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter3850">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.5"
+ id="feGaussianBlur3852" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3827"
+ id="radialGradient3823"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4496779,1.5407764,-0.90127514,0.84794135,4.9906134,-4.9255796)"
+ cx="3.9371533"
+ cy="7.5016646"
+ fx="3.9371533"
+ fy="7.5016646"
+ r="2.5" />
+ <linearGradient
+ id="linearGradient3827">
+ <stop
+ id="stop3829"
+ offset="0"
+ style="stop-color:#b80000;stop-opacity:1;" />
+ <stop
+ id="stop3831"
+ offset="1"
+ style="stop-color:#600000;stop-opacity:1;" />
+ </linearGradient>
+ <radialGradient
+ r="2.5"
+ fy="7.5016646"
+ fx="3.9371533"
+ cy="7.5016646"
+ cx="3.9371533"
+ gradientTransform="matrix(1.4496779,1.5407764,-0.90127514,0.84794135,4.9906134,-4.9255796)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3889"
+ xlink:href="#linearGradient3827"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.959798"
+ inkscape:cx="5.985117"
+ inkscape:cy="16.047085"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="532"
+ inkscape:window-height="454"
+ inkscape:window-x="2159"
+ inkscape:window-y="166"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata3896">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-381.14286,-467.79075)">
+ <path
+ transform="matrix(6.4,0,0,6.4,361.94286,422.99075)"
+ d="M 8,9.5 C 8,10.880712 6.8807119,12 5.5,12 4.1192881,12 3,10.880712 3,9.5 3,8.1192881 4.1192881,7 5.5,7 6.8807119,7 8,8.1192881 8,9.5 z"
+ sodipodi:ry="2.5"
+ sodipodi:rx="2.5"
+ sodipodi:cy="9.5"
+ sodipodi:cx="5.5"
+ id="path3811"
+ style="color:#000000;fill:url(#radialGradient3889);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.93333333,0,0,0.93333444,382.20952,468.85732)"
+ d="M 31,16 C 31,24.284271 24.284271,31 16,31 7.7157288,31 1,24.284271 1,16 1,7.7157288 7.7157288,1 16,1 24.284271,1 31,7.7157288 31,16 z"
+ sodipodi:ry="15"
+ sodipodi:rx="15"
+ sodipodi:cy="16"
+ sodipodi:cx="16"
+ id="path3813"
+ style="color:#000000;fill:#df0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3840"
+ d="m 392.64286,476.29082 -3,3 4.5,4.5 -4.5,4.5 3,3 4.5,-4.5 4.5,4.5 3,-3 -4.5,-4.5 4.5,-4.5 -3,-3 -4.5,4.5 -4.5,-4.5 z"
+ style="fill:none;stroke:#000000;filter:url(#filter3850)" />
+ <path
+ style="fill:#ffffff;stroke:#000000"
+ d="m 392.64286,476.29082 -3,3 4.5,4.5 -4.5,4.5 3,3 4.5,-4.5 4.5,4.5 3,-3 -4.5,-4.5 4.5,-4.5 -3,-3 -4.5,4.5 -4.5,-4.5 z"
+ id="path3819"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3854"
+ d="m 392.64286,476.29082 -3,3 4.5,4.5 -4.5,4.5 3,3 4.5,-4.5 4.5,4.5 3,-3 -4.5,-4.5 4.5,-4.5 -3,-3 -4.5,4.5 -4.5,-4.5 z"
+ style="opacity:0.51879697;fill:#ffffff;stroke:none" />
+ </g>
+</svg>
diff --git a/application/resources/multimc/scalable/status-good.svg b/application/resources/multimc/scalable/status-good.svg
new file mode 100644
index 00000000..0a35c80f
--- /dev/null
+++ b/application/resources/multimc/scalable/status-good.svg
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="status-good.svg"
+ inkscape:export-filename="/home/peterix/minecraft/src/MultiMC5/resources/multimc/64x64/status-good.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient3827">
+ <stop
+ id="stop3829"
+ offset="0"
+ style="stop-color:#b80000;stop-opacity:1;" />
+ <stop
+ id="stop3831"
+ offset="1"
+ style="stop-color:#600000;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3801">
+ <stop
+ style="stop-color:#00b81a;stop-opacity:1;"
+ offset="0"
+ id="stop3803" />
+ <stop
+ style="stop-color:#00600d;stop-opacity:1;"
+ offset="1"
+ id="stop3805" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3005">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3007" />
+ <stop
+ id="stop3781"
+ offset="0.8142857"
+ style="stop-color:#ffffff;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3009" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter3797">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.52592593"
+ id="feGaussianBlur3799" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3801"
+ id="radialGradient3807"
+ cx="3.9371533"
+ cy="7.5016646"
+ fx="3.9371533"
+ fy="7.5016646"
+ r="2.5"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4496779,1.5407764,-0.90127514,0.84794135,4.9906134,-4.9255796)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3827"
+ id="radialGradient3823"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4496779,1.5407764,-0.90127514,0.84794135,4.9906134,-4.9255796)"
+ cx="3.9371533"
+ cy="7.5016646"
+ fx="3.9371533"
+ fy="7.5016646"
+ r="2.5" />
+ <filter
+ inkscape:collect="always"
+ id="filter3850">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.5"
+ id="feGaussianBlur3852" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.8"
+ inkscape:cx="8.6376236"
+ inkscape:cy="10.641334"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ showguides="false"
+ inkscape:snap-bbox="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="532"
+ inkscape:window-height="454"
+ inkscape:window-x="2290"
+ inkscape:window-y="202"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2993"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="15,16"
+ id="guide3783" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="16,14"
+ id="guide3785" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="94,38"
+ id="guide3833" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="84,34"
+ id="guide3835" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1020.3622)">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;color:#000000;fill:url(#radialGradient3807);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.50000000000000000;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-miterlimit:4;stroke-dasharray:none"
+ id="path2997"
+ sodipodi:cx="5.5"
+ sodipodi:cy="9.5"
+ sodipodi:rx="2.5"
+ sodipodi:ry="2.5"
+ d="m 8,9.5 a 2.5,2.5 0 1 1 -5,0 2.5,2.5 0 1 1 5,0 z"
+ transform="matrix(6.4,0,0,6.4,-19.2,975.5622)" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#00c900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.50000000000000000;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path2999"
+ sodipodi:cx="16"
+ sodipodi:cy="16"
+ sodipodi:rx="15"
+ sodipodi:ry="15"
+ d="M 31,16 A 15,15 0 1 1 1,16 15,15 0 1 1 31,16 z"
+ transform="matrix(0.93333333,0,0,0.93333444,1.0666666,1021.4288)" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="path3787"
+ d="m 6.5,1037.3622 3,-3 4.5,4.5 9.5,-9.5 3,3 -12.5,12.5 z"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3797)" />
+ <path
+ style="fill:#ffffff;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 6.5,1037.3622 3,-3 4.5,4.5 9.5,-9.5 3,3 -12.5,12.5 z"
+ id="path3001"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="path3809"
+ d="m 6.5,1037.3622 3,-3 4.5,4.5 9.5,-9.5 3,3 -12.5,12.5 z"
+ style="fill:#ffffff;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;opacity:0.54887218" />
+ </g>
+</svg>
diff --git a/application/resources/multimc/scalable/status-yellow.svg b/application/resources/multimc/scalable/status-yellow.svg
new file mode 100644
index 00000000..140e6082
--- /dev/null
+++ b/application/resources/multimc/scalable/status-yellow.svg
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ width="32"
+ height="32"
+ id="svg2">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient3827">
+ <stop
+ id="stop3829"
+ style="stop-color:#b80000;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3831"
+ style="stop-color:#600000;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3801">
+ <stop
+ id="stop3803"
+ style="stop-color:#f1ab00;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3805"
+ style="stop-color:#c39a00;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3005">
+ <stop
+ id="stop3007"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3781"
+ style="stop-color:#ffffff;stop-opacity:0.49803922"
+ offset="0.8142857" />
+ <stop
+ id="stop3009"
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <filter
+ color-interpolation-filters="sRGB"
+ id="filter3797">
+ <feGaussianBlur
+ id="feGaussianBlur3799"
+ stdDeviation="0.52592593" />
+ </filter>
+ <radialGradient
+ cx="3.9371533"
+ cy="7.5016646"
+ r="2.5"
+ fx="3.9371533"
+ fy="7.5016646"
+ id="radialGradient3807"
+ xlink:href="#linearGradient3801"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4496779,1.5407764,-0.90127514,0.84794135,4.9906134,-4.9255796)" />
+ <radialGradient
+ cx="3.9371533"
+ cy="7.5016646"
+ r="2.5"
+ fx="3.9371533"
+ fy="7.5016646"
+ id="radialGradient3823"
+ xlink:href="#linearGradient3827"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4496779,1.5407764,-0.90127514,0.84794135,4.9906134,-4.9255796)" />
+ <radialGradient
+ cx="3.9371533"
+ cy="7.5016646"
+ r="2.5"
+ fx="3.9371533"
+ fy="7.5016646"
+ id="radialGradient3786"
+ xlink:href="#linearGradient3801"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4496779,1.5407764,-0.90127514,0.84794135,4.9906134,-4.9255796)" />
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1020.3622)"
+ id="layer1">
+ <path
+ d="m 8,9.5 a 2.5,2.5 0 1 1 -5,0 2.5,2.5 0 1 1 5,0 z"
+ transform="matrix(6.4,0,0,6.4,-19.2,975.5622)"
+ id="path2997"
+ style="color:#000000;fill:url(#radialGradient3807);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="M 31,16 A 15,15 0 1 1 1,16 15,15 0 1 1 31,16 z"
+ transform="matrix(0.93333333,0,0,0.93333444,1.0666666,1021.4288)"
+ id="path2999"
+ style="color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <g
+ id="g3010">
+ <path
+ d="m 7.5,1034.3622 17,0 0,4 -17,0 z"
+ id="path3787"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3797)" />
+ <path
+ d="m 7.5,1034.3622 17,0 0,4 -17,0 z"
+ id="path3001"
+ style="fill:#ffffff;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ d="m 7.5,1038.3622 0,-4 17,0 0,4 z"
+ id="path3809"
+ style="opacity:0.54887217;fill:#ffffff;stroke:none" />
+ </g>
+ <path
+ d="m 8,9.5 a 2.5,2.5 0 1 1 -5,0 2.5,2.5 0 1 1 5,0 z"
+ transform="matrix(6.4,0,0,6.4,-170.62857,989.56227)"
+ id="path3776"
+ style="color:#000000;fill:url(#radialGradient3786);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="M 31,16 A 15,15 0 1 1 1,16 15,15 0 1 1 31,16 z"
+ transform="matrix(0.93333333,0,0,0.93333444,-150.3619,1035.4289)"
+ id="path3778"
+ style="color:#000000;fill:#ffcc00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="m -144.92857,1051.3623 3,-3 4.5,4.5 9.5,-9.5 3,3 -12.5,12.5 z"
+ id="path3780"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3797)" />
+ <path
+ d="m -144.92857,1051.3623 3,-3 4.5,4.5 9.5,-9.5 3,3 -12.5,12.5 z"
+ id="path3782"
+ style="fill:#ffffff;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ d="m -144.92857,1051.3623 3,-3 4.5,4.5 9.5,-9.5 3,3 -12.5,12.5 z"
+ id="path3784"
+ style="opacity:0.54887217;fill:#ffffff;stroke:none" />
+ </g>
+</svg>
diff --git a/application/resources/multimc/scalable/viewfolder.svg b/application/resources/multimc/scalable/viewfolder.svg
new file mode 100644
index 00000000..4ba0ed0a
--- /dev/null
+++ b/application/resources/multimc/scalable/viewfolder.svg
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) --><svg height="128" id="svg2811" inkscape:export-filename="/home/david/document-open.png" inkscape:export-xdpi="22.5" inkscape:export-ydpi="22.5" inkscape:output_extension="org.inkscape.output.svgz.inkscape" inkscape:version="0.45.1" sodipodi:docbase="/home/jakob/dev/kde/src/kdebase/runtime/pics/oxygen/scalable/actions" sodipodi:docname="document-open-folder.svgz" sodipodi:version="0.32" version="1.0" width="128" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <metadata>
+ <rdf:RDF xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <cc:Work rdf:about="">
+ <dc:title></dc:title>
+ <dc:description></dc:description>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>unsorted</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <dc:publisher>
+ <cc:Agent rdf:about="http://www.openclipart.org/">
+ <dc:title>Open Clip Art Library, Source: Oxygen Icons, Source: Oxygen Icons, Source: Oxygen Icons, Source: Oxygen Icons</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title></dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title></dc:title>
+ </cc:Agent>
+ </dc:rights>
+ <dc:date></dc:date>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <cc:license rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/ or http://creativecommons.org/licenses/LGPL/2.1/"/>
+ <dc:language>en</dc:language>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview bordercolor="#666666" borderopacity="1.0" gridempspacing="2" gridspacingx="4px" gridspacingy="4px" gridtolerance="10000" guidetolerance="10.0" id="base" inkscape:current-layer="svg2811" inkscape:cx="64" inkscape:cy="64" inkscape:grid-bbox="true" inkscape:grid-points="true" inkscape:guide-bbox="true" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-height="736" inkscape:window-width="825" inkscape:window-x="0" inkscape:window-y="0" inkscape:zoom="1" objecttolerance="10.0" pagecolor="#ffffff" showborder="false" showgrid="false" showguides="true"/>
+ <defs id="defs2813">
+ <linearGradient gradientTransform="matrix(1.0033808,0,0,1,-8.2378002,8)" gradientUnits="userSpaceOnUse" id="linearGradient2937" x1="122.74438" x2="122.39215" y1="96.721588" y2="20.043535">
+ <stop id="stop2939" offset="0" style="stop-color:#72b4f4;stop-opacity:1"/>
+ <stop id="stop2941" offset="0.13053299" style="stop-color:#b3d9ff;stop-opacity:1"/>
+ <stop id="stop2943" offset="0.34621301" style="stop-color:#b3d9ff;stop-opacity:1"/>
+ <stop id="stop2945" offset="0.72006166" style="stop-color:#71a8f5;stop-opacity:1"/>
+ <stop id="stop2947" offset="1" style="stop-color:#508ed9;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient gradientTransform="translate(242.00093,332.5)" gradientUnits="userSpaceOnUse" id="linearGradient2927" x1="-178" x2="-178" y1="-228.3945" y2="-304.61469">
+ <stop id="stop2929" offset="0" style="stop-color:#cfe7ff;stop-opacity:1"/>
+ <stop id="stop2931" offset="0.1" style="stop-color:#71a8f5;stop-opacity:1"/>
+ <stop id="stop2933" offset="1" style="stop-color:#2c72c7;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient2822">
+ <stop id="stop2824" offset="0" style="stop-color:#ffffff;stop-opacity:1"/>
+ <stop id="stop2826" offset="1" style="stop-color:#ffffff;stop-opacity:0"/>
+ </linearGradient>
+ <linearGradient gradientTransform="matrix(1.0033404,0,0,1,-8.2374684,8)" gradientUnits="userSpaceOnUse" id="XMLID_9_" x1="71.999496" x2="71.999496" y1="14.2578" y2="19.9583">
+ <stop id="stop46" offset="0.25" style="stop-color:#71a8f5;stop-opacity:0"/>
+ <stop id="stop48" offset="1" style="stop-color:#0057ae;stop-opacity:1"/>
+ </linearGradient>
+ <filter height="1.768" id="filter2807" width="1.0512" x="-0.025599999" y="-0.384">
+ <feGaussianBlur id="feGaussianBlur2809" inkscape:collect="always" stdDeviation="1.28"/>
+ </filter>
+ <linearGradient gradientTransform="translate(-6.999995,8)" gradientUnits="userSpaceOnUse" id="XMLID_6_" x1="72.000504" x2="72.000504" y1="96" y2="0.00048828119">
+ <stop id="stop7" offset="0" style="stop-color:#00479e;stop-opacity:1"/>
+ <stop id="stop9" offset="0.0769" style="stop-color:#2c72c7;stop-opacity:1"/>
+ <stop id="stop11" offset="0.58579999" style="stop-color:#6ea1df;stop-opacity:1"/>
+ <stop id="stop13" offset="0.96450001" style="stop-color:#adcbee;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient gradientTransform="matrix(1.0033808,0,0,1,-8.2378,8)" gradientUnits="userSpaceOnUse" id="linearGradient3109" x1="122.74438" x2="122.74438" xlink:href="#linearGradient2937" y1="96" y2="20"/>
+ <linearGradient gradientTransform="translate(242.00093,332.5)" gradientUnits="userSpaceOnUse" id="linearGradient2923" x1="-168.99216" x2="-168.99216" xlink:href="#linearGradient2822" y1="-300.5" y2="-296.48441"/>
+ <linearGradient gradientTransform="translate(242.00093,332.5)" gradientUnits="userSpaceOnUse" id="linearGradient2925" x1="-178" x2="-178" xlink:href="#linearGradient2927" y1="-228.5" y2="-304.61469"/>
+ <linearGradient gradientTransform="translate(242.00093,364.5)" gradientUnits="userSpaceOnUse" id="linearGradient2197" inkscape:collect="always" x1="-168.99216" x2="-168.99216" xlink:href="#linearGradient2822" y1="-300.5" y2="-296.48441"/>
+ <linearGradient gradientTransform="matrix(1,0,0,0.7368421,242.00093,284.36842)" gradientUnits="userSpaceOnUse" id="linearGradient2201" inkscape:collect="always" x1="-178" x2="-178" xlink:href="#linearGradient2927" y1="-228.5" y2="-304.61469"/>
+ <linearGradient gradientTransform="matrix(1.0033404,0,0,1,-7.2374684,40)" gradientUnits="userSpaceOnUse" id="linearGradient2204" inkscape:collect="always" x1="71.999496" x2="71.999496" xlink:href="#XMLID_9_" y1="14.2578" y2="19.9583"/>
+ <linearGradient gradientTransform="matrix(1.0033808,0,0,0.7368421,-8.2378,45.263158)" gradientUnits="userSpaceOnUse" id="linearGradient2207" inkscape:collect="always" x1="122.74438" x2="122.74438" xlink:href="#linearGradient2937" y1="96" y2="20"/>
+ <linearGradient gradientTransform="translate(-6.999995,20)" gradientUnits="userSpaceOnUse" id="linearGradient2212" inkscape:collect="always" x1="72.000504" x2="72.000504" xlink:href="#XMLID_6_" y1="96" y2="0.00048828119"/>
+ <filter id="filter2770" inkscape:collect="always">
+ <feGaussianBlur id="feGaussianBlur2772" inkscape:collect="always" stdDeviation="2.0786429"/>
+ </filter>
+ <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient10213" inkscape:collect="always" x1="98.617439" x2="91.228737" xlink:href="#linearGradient10207" y1="106.41443" y2="99.254974"/>
+ <radialGradient cx="102" cy="112.3047" fx="102" fy="112.3047" gradientTransform="matrix(1.295034,1.3831431e-7,-1.3627884e-7,1.2946006,-30.093452,-33.119615)" gradientUnits="userSpaceOnUse" id="radialGradient9437" inkscape:collect="always" r="139.55859" xlink:href="#XMLID_8_"/>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath7084">
+ <path d="M 72,88 L 40,120 L 32,120 L 32,80 L 72,80 L 72,88 z" id="path7086" style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"/>
+ </clipPath>
+ <filter height="1.3839999" id="filter6697" inkscape:collect="always" width="1.3839999" x="-0.19200002" y="-0.19199999">
+ <feGaussianBlur id="feGaussianBlur6699" inkscape:collect="always" stdDeviation="1.9447689"/>
+ </filter>
+ <radialGradient cx="102" cy="112.3047" gradientUnits="userSpaceOnUse" id="XMLID_8_" r="139.55859">
+ <stop id="stop41" offset="0" style="stop-color:#b7b8b9;stop-opacity:1;"/>
+ <stop id="stop47" offset="0.18851049" style="stop-color:#ECECEC"/>
+ <stop id="stop49" offset="0.25718147" style="stop-color:#FAFAFA"/>
+ <stop id="stop51" offset="0.30111277" style="stop-color:#FFFFFF"/>
+ <stop id="stop53" offset="0.5313" style="stop-color:#FAFAFA"/>
+ <stop id="stop55" offset="0.8449" style="stop-color:#EBECEC"/>
+ <stop id="stop57" offset="1" style="stop-color:#E1E2E3"/>
+ </radialGradient>
+ <linearGradient gradientUnits="userSpaceOnUse" id="XMLID_12_" x1="96" x2="88.000198" y1="104" y2="96.000198">
+ <stop id="stop83" offset="0" style="stop-color:#888A85"/>
+ <stop id="stop85" offset="0.0072" style="stop-color:#8C8E89"/>
+ <stop id="stop87" offset="0.0673" style="stop-color:#ABACA9"/>
+ <stop id="stop89" offset="0.1347" style="stop-color:#C5C6C4"/>
+ <stop id="stop91" offset="0.2652576" style="stop-color:#DBDBDA"/>
+ <stop id="stop93" offset="0.37646064" style="stop-color:#EBEBEB"/>
+ <stop id="stop95" offset="0.48740286" style="stop-color:#F7F7F6"/>
+ <stop id="stop97" offset="0.6324091" style="stop-color:#FDFDFD"/>
+ <stop id="stop99" offset="1" style="stop-color:#FFFFFF"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10207">
+ <stop id="stop10209" offset="0" style="stop-color:#a2a2a2;stop-opacity:1;"/>
+ <stop id="stop10211" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient gradientTransform="matrix(1.0172054,0,0,1.5,246.03226,514.75)" gradientUnits="userSpaceOnUse" id="linearGradient3385" inkscape:collect="always" x1="-168.99216" x2="-168.99216" xlink:href="#linearGradient2822" y1="-300.5" y2="-296.48441"/>
+ <linearGradient gradientTransform="matrix(1,0,0,0.7368421,242.00093,284.36842)" gradientUnits="userSpaceOnUse" id="linearGradient3387" inkscape:collect="always" x1="-178" x2="-178" xlink:href="#linearGradient2927" y1="-232.84966" y2="-304.61469"/>
+ </defs>
+ <path d="M 118.983,31 C 118.992,29.35 117.64999,28 115.99999,28 L 40.961007,28 C 40.961007,28 32.061006,20 30.961,20 L 14.999998,20 C 12.799996,20 10.999999,21.8 10.999999,24 L 10.999999,31 C 10.999999,31 11.999999,116 8,116 L 122,116 C 117.99999,116 118.983,31 118.983,31 z " id="path15" style="fill:url(#linearGradient2212)"/>
+ <g id="g17" style="opacity:0.6;filter:url(#filter2807)" transform="matrix(1.0033404,0,0,1,-8.2374684,20)">
+ <path d="M 132,96 C 132,98.2 128.4,100 124,100 L 20,100 C 15.6,100 12,98.2 12,96 C 12,93.8 15.6,92 20,92 L 124,92 C 128.4,92 132,93.8 132,96 z " id="path19"/>
+ </g>
+ <path d="M 10.884862,54 C 10.893892,55.75 10.902922,57.755 10.910952,60 L 119.09511,60 C 119.10414,57.755 119.11317,55.75 119.1212,54 L 10.884862,54 z " id="path50" style="opacity:0.5;fill:url(#linearGradient2204)"/>
+ <path d="M 119.99722,31 C 120.00622,29.35 118.66422,28 117.01422,28 L 42.975222,28 L 36.389222,21.414 C 35.611222,20.636 34.075222,20 32.975222,20 L 12.014222,20 C 9.8142222,20 8.0142222,21.8 8.0142222,24 C 8.0142222,24 7.9822222,54.499299 8.0142222,60.031299 L 12.014222,60.031299 C 12.014222,53.222299 12.014222,24 12.014222,24 L 32.901222,23.997 C 33.083222,24.019 33.470222,24.179 33.560222,24.243 L 41.318222,32 C 41.318222,32 114.02722,32 115.99922,32 C 115.99922,32.435 116.00022,56.400299 116.00222,60.031299 L 120.01422,60.031299 C 120.04522,54.499299 119.99722,31 119.99722,31 z " id="path2896" sodipodi:nodetypes="ccccccccccccccccc" style="fill:#5e95e3;fill-opacity:1"/>
+ <path d="M 124.36598,113.79242 C 124.27969,115.00674 122.85389,116 121.19831,116 L 6.812906,116 C 5.157329,116 3.731522,115.00674 3.644228,113.79242 L 0.007982,62.204632 C -0.112423,60.992526 1.143808,60 2.799384,60 L 125.21183,60 C 126.86741,60 128.11762,60.991789 127.9912,62.203895 L 124.36598,113.79242 z " id="path30" style="opacity:0.9;fill:url(#linearGradient2207);fill-opacity:1"/>
+ <path d="M 125.21293,60 L 2.7999261,60 C 1.1449261,60 -0.11207393,60.992526 0.0079260701,62.204632 L 3.6439261,113.79242 C 3.7309261,115.00674 5.1569261,116 6.8129261,116 L 121.19793,116 C 122.85393,116 124.27993,115.00674 124.36593,113.79242 L 127.99093,62.203895 C 128.11893,60.991789 126.86793,60 125.21293,60 z M 120.41393,113.05263 C 118.87493,113.05263 9.1349261,113.05263 7.5979261,113.05263 C 7.2299261,107.83726 4.5229261,70.627562 4.0659261,64.149246 C 6.5189261,64.149246 121.45793,64.149246 123.93493,64.149246 C 123.81393,65.85872 120.49293,111.92821 120.41393,113.05263 z " id="path2894" sodipodi:nodetypes="cccccccccccccc" style="fill:url(#linearGradient3387)"/>
+ <path d="M 4,64 C 4.0273488,64.775875 4.1802721,68.801119 4.2225137,70 C 7.123925,70 122.78934,70 125.71499,70 C 125.74343,69.191222 125.93026,64.204735 125.9375,64 C 123.41788,64 6.4952049,64 4,64 z " id="path2908" style="fill:url(#linearGradient3385);fill-opacity:1;opacity:0.835"/>
+</svg>
diff --git a/application/resources/pe_blue/index.theme b/application/resources/pe_blue/index.theme
new file mode 100644
index 00000000..c9e0d93a
--- /dev/null
+++ b/application/resources/pe_blue/index.theme
@@ -0,0 +1,11 @@
+[Icon Theme]
+Name=pe_blue
+Comment=Icons by pexner (blue)
+Inherits=multimc
+Directories=scalable
+
+[scalable]
+Size=48
+Type=Scalable
+MinSize=16
+MaxSize=256
diff --git a/application/resources/pe_blue/pe_blue.qrc b/application/resources/pe_blue/pe_blue.qrc
new file mode 100644
index 00000000..a4525d2e
--- /dev/null
+++ b/application/resources/pe_blue/pe_blue.qrc
@@ -0,0 +1,35 @@
+<!DOCTYPE RCC>
+<RCC version="1.0">
+ <qresource prefix="/icons/pe_blue">
+ <file>index.theme</file>
+ <file>scalable/about.svg</file>
+ <file>scalable/accounts.svg</file>
+ <file>scalable/bug.svg</file>
+ <file>scalable/centralmods.svg</file>
+ <file>scalable/checkupdate.svg</file>
+ <file>scalable/copy.svg</file>
+ <file>scalable/coremods.svg</file>
+ <file>scalable/externaltools.svg</file>
+ <file>scalable/instance-settings.svg</file>
+ <file>scalable/jarmods.svg</file>
+ <file>scalable/java.svg</file>
+ <file>scalable/loadermods.svg</file>
+ <file>scalable/log.svg</file>
+ <file>scalable/minecraft.svg</file>
+ <file>scalable/multimc.svg</file>
+ <file>scalable/new.svg</file>
+ <file>scalable/news.svg</file>
+ <file>scalable/notes.svg</file>
+ <file>scalable/patreon.svg</file>
+ <file>scalable/proxy.svg</file>
+ <file>scalable/quickmods.svg</file>
+ <file>scalable/refresh.svg</file>
+ <file>scalable/resourcepacks.svg</file>
+ <file>scalable/screenshots.svg</file>
+ <file>scalable/settings.svg</file>
+ <file>scalable/status-bad.svg</file>
+ <file>scalable/status-good.svg</file>
+ <file>scalable/status-yellow.svg</file>
+ <file>scalable/viewfolder.svg</file>
+ </qresource>
+</RCC>
diff --git a/application/resources/pe_blue/scalable/about.svg b/application/resources/pe_blue/scalable/about.svg
new file mode 100644
index 00000000..56e7fc9b
--- /dev/null
+++ b/application/resources/pe_blue/scalable/about.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <circle fill="#DAEEFF" cx="16" cy="16" r="12"/>
+ <g>
+ <polygon fill="#666666" points="17.8,21 17.8,11.9 11.9,11.9 11.9,14.2 14.2,14.2 14.2,21 11.9,21 11.9,23.3 20.1,23.3 20.1,21
+ "/>
+ <circle fill="#666666" cx="16" cy="8.3" r="1.8"/>
+ </g>
+ <path fill="#3366CC" d="M16,32C7.2,32,0,24.8,0,16C0,7.2,7.2,0,16,0c8.8,0,16,7.2,16,16C32,24.8,24.8,32,16,32L16,32z M16,4
+ C9.4,4,4,9.4,4,16s5.4,12,12,12s12-5.4,12-12S22.6,4,16,4z"/>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/accounts.svg b/application/resources/pe_blue/scalable/accounts.svg
new file mode 100644
index 00000000..77e3f45a
--- /dev/null
+++ b/application/resources/pe_blue/scalable/accounts.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#999999" d="M25.8,17.5c1.4-1.4,2.2-3.4,2.2-5.5V8c0-4.4-3.6-8-8-8
+ c-0.6,0-1.2,0.1-1.8,0.2c1.3,1.1,2.4,2.4,3,4C22.8,4.7,24,6.2,24,8v4c0,1.8-1.2,3.3-2.8,3.8c-0.2,0.4-0.4,0.8-0.6,1.2
+ c1.5,1.2,2.8,2.6,3.7,4.2c1.8,1.1,3.1,2.7,3.6,4.7c0,1.1-0.9,2-2,2h-0.3c-0.4,1.6-1.3,3-2.5,4H26c3.3,0,6-2.7,6-6
+ C31.4,22.3,28.9,19.2,25.8,17.5z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M18,32H6c-3.3,0-6-2.7-6-6l0,0c0.6-3.7,3.1-6.8,6.2-8.5
+ C4.9,16.1,4,14.1,4,12V8c0-4.4,3.6-8,8-8s8,3.6,8,8v4c0,2.1-0.9,4.1-2.2,5.5c3.1,1.7,5.6,4.8,6.2,8.5l0,0C24,29.3,21.3,32,18,32z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#DAEEFF" d="M16,12V8c0-2.2-1.8-4-4-4S8,5.8,8,8v4c0,2.2,1.8,4,4,4
+ S16,14.2,16,12z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#DAEEFF" d="M20,26c-0.9-3.4-4.3-6-8-6l0,0l0,0c-3.7,0-7.1,2.6-8,6l0,0
+ c0,1.1,0.9,2,2,2h12C19.1,28,20,27.1,20,26L20,26z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/bug.svg b/application/resources/pe_blue/scalable/bug.svg
new file mode 100644
index 00000000..75a19e29
--- /dev/null
+++ b/application/resources/pe_blue/scalable/bug.svg
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect x="0" fill="none" width="32" height="32"/>
+<g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M22.7,5.3c-0.3-1.2-0.9-2.3-1.8-3.2c-2.7-2.8-7.2-2.8-9.9,0
+ c-0.9,0.9-1.5,2-1.8,3.2C13.5,3.3,18.5,3.3,22.7,5.3z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#6699CC" d="M30,17.9h-4.1c0-0.7,0.1-1.3,0.1-2c0-0.7,0-1.4-0.1-2
+ c0,0,0,0,0.1,0v0h2c1.1,0,2-0.9,2-2c0-1.1-0.9-2-2-2h-2v0c-0.3,0-0.6,0.1-0.8,0.1c-1.2-3.1-3.9-4.1-9.2-4.1s-7.9,1-9.2,4.1
+ C6.6,9.9,6.3,9.8,6,9.8v0H4c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2h2v0c0,0,0,0,0.1,0c0,0.6-0.1,1.3-0.1,2c0,0.7,0,1.3,0.1,2H2
+ c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2h4.5c0.3,1.4,0.7,2.8,1.2,4H6c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2h2v0c0.7,0,1.4-0.1,2.1-0.3
+ c1.5,1.4,3.4,2.3,5.9,2.3s4.4-0.9,5.9-2.3c0.7,0.2,1.4,0.3,2.1,0.3v0h2c1.1,0,2-0.9,2-2c0-1.1-0.9-2-2-2h-1.7
+ c0.5-1.2,0.9-2.6,1.2-4H30c1.1,0,2-0.9,2-2C32,18.8,31.1,17.9,30,17.9z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/centralmods.svg b/application/resources/pe_blue/scalable/centralmods.svg
new file mode 100644
index 00000000..cda39b1f
--- /dev/null
+++ b/application/resources/pe_blue/scalable/centralmods.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#DAEEFF" d="M28,10c0-1.1-0.9-2-2-2H16V6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V10z"
+ />
+<rect fill="none" width="32" height="32"/>
+<path fill="#3366CC" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h8c2.6,0,4.8,1.7,5.6,4H26c3.3,0,6,2.7,6,6v16
+ C32,29.3,29.3,32,26,32z M28,10c0-1.1-0.9-2-2-2H16V6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V10z
+ "/>
+<path fill="#C1272D" d="M16,10.2l2.2,4.5l5,0.7L19.6,19l0.8,4.9L16,21.6l-4.4,2.3l0.8-4.9l-3.6-3.5l5-0.7L16,10.2z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/checkupdate.svg b/application/resources/pe_blue/scalable/checkupdate.svg
new file mode 100644
index 00000000..a7d9ee81
--- /dev/null
+++ b/application/resources/pe_blue/scalable/checkupdate.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#6699CC" d="M26,24h-0.4c0-0.1-0.1-0.2-0.1-0.3c-0.7-1.6-1.5-2.8-3.5-3.4V18c0-3.3-2.7-6-6-6c-3.3,0-6,2.7-6,6v2.3
+ c-2,0.6-2.9,1.8-3.5,3.4c0,0,0,0.1,0,0.1C2.8,23.1,0,19.9,0,16v-2c0-4.4,3.6-8,8-8c0.8,0,1.5,0.1,2.2,0.3C10.9,2.7,14.2,0,18,0
+ c4.4,0,8,3.6,8,8c0,0.7-0.1,1.4-0.3,2c0.1,0,0.2,0,0.3,0c3.3,0,6,2.7,6,6v2C32,21.3,29.3,24,26,24z"/>
+<path fill="#39B54A" d="M12,24h2v-6c0-1.1,0.9-2,2-2c1.1,0,2,0.9,2,2v6h2c0.8,0,1.5,0.5,1.8,1.2c0.1,0.2,0.1,0.4,0.1,0.6
+ c0.1,0.6-0.1,1.2-0.6,1.6l-4,4C17,31.8,16.5,32,16,32c-0.5,0-1-0.2-1.4-0.6l-4-4c-0.4-0.4-0.6-1-0.6-1.6c0-0.2,0.1-0.4,0.1-0.6
+ C10.5,24.5,11.2,24,12,24z"/>
+<rect fill="none" width="32" height="32"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/copy.svg b/application/resources/pe_blue/scalable/copy.svg
new file mode 100644
index 00000000..7ce014ed
--- /dev/null
+++ b/application/resources/pe_blue/scalable/copy.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#DAEEFF" d="M4,26c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V14H4V26z"/>
+<path fill="#6699CC" d="M28,25.6V10c0-3.3-2.7-6-6-6H6.4c0.8-2.3,3-4,5.6-4h14c3.3,0,6,2.7,6,6v14C32,22.6,30.3,24.8,28,25.6z"/>
+<path fill="#3366CC" d="M26,12v14c0,3.3-2.7,6-6,6H6c-3.3,0-6-2.7-6-6V12c0-3.3,2.7-6,6-6h14C23.3,6,26,8.7,26,12z M4,26
+ c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V14H4V26z M6,8c-1.1,0-2,0.9-2,2s0.9,2,2,2s2-0.9,2-2S7.1,8,6,8z"/>
+<rect fill="none" width="32" height="32"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/coremods.svg b/application/resources/pe_blue/scalable/coremods.svg
new file mode 100644
index 00000000..4cc030d0
--- /dev/null
+++ b/application/resources/pe_blue/scalable/coremods.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<circle fill-rule="evenodd" clip-rule="evenodd" fill="#DAEEFF" cx="16" cy="16" r="12"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M16,32C7.2,32,0,24.8,0,16C0,7.2,7.2,0,16,0c8.8,0,16,7.2,16,16
+ C32,24.8,24.8,32,16,32z M16,4C9.4,4,4,9.4,4,16c0,6.6,5.4,12,12,12s12-5.4,12-12C28,9.4,22.6,4,16,4z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#C1272D" d="M16,6l2.9,6l6.6,1l-4.8,4.6l1.1,6.5L16,21l-5.9,3.1l1.1-6.5
+ l-4.8-4.6l6.6-1L16,6z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/externaltools.svg b/application/resources/pe_blue/scalable/externaltools.svg
new file mode 100644
index 00000000..45b73496
--- /dev/null
+++ b/application/resources/pe_blue/scalable/externaltools.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M6,32h20c3.3,0,6-2.7,6-6V6c0-3.3-2.7-6-6-6h-9.1
+ C17.6,1.2,18,2.6,18,4h8c1.1,0,2,0.9,2,2v20c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2v-4.5l-4-3V26C0,29.3,2.7,32,6,32z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#39B54A" d="M8.8,17.6C9.2,17.9,9.6,18,10,18c0.3,0,0.6-0.1,0.9-0.2
+ c0.7-0.3,1.1-1,1.1-1.8v-1.9V14c6.3,0,11.7,4.2,13.4,10c0.4-1.3,0.6-2.6,0.6-4c0-7.7-6.3-14-14-14V4c0-0.8-0.4-1.5-1.1-1.8
+ C10.6,2.1,10.3,2,10,2C9.6,2,9.2,2.1,8.8,2.4l-8,6C0.3,8.8,0,9.4,0,10c0,0.6,0.3,1.2,0.8,1.6L8.8,17.6z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/instance-settings.svg b/application/resources/pe_blue/scalable/instance-settings.svg
new file mode 100644
index 00000000..43f0b2f2
--- /dev/null
+++ b/application/resources/pe_blue/scalable/instance-settings.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6
+ v20C32,29.3,29.3,32,26,32z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#DAEEFF" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<rect x="16" y="10" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="8" height="2"/>
+<rect x="8" y="18" fill-rule="evenodd" clip-rule="evenodd" width="6" height="6"/>
+<rect x="10" y="20" fill-rule="evenodd" clip-rule="evenodd" fill="#DAEEFF" width="2" height="2"/>
+<rect x="8" y="8" fill-rule="evenodd" clip-rule="evenodd" width="6" height="6"/>
+<rect x="10" y="10" fill-rule="evenodd" clip-rule="evenodd" fill="#DAEEFF" width="2" height="2"/>
+<rect x="16" y="20" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="8" height="2"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/jarmods.svg b/application/resources/pe_blue/scalable/jarmods.svg
new file mode 100644
index 00000000..bb75f4b1
--- /dev/null
+++ b/application/resources/pe_blue/scalable/jarmods.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6
+ v20C32,29.3,29.3,32,26,32z"/>
+<path fill="#6699CC" stroke="#6699CC" stroke-width="0.3" stroke-miterlimit="10" d="M12.2,21.2c0,0-1.3,0.7,0.9,1
+ c2.7,0.3,4,0.3,7-0.3c0,0,0.8,0.5,1.9,0.9C15.3,25.7,7,22.7,12.2,21.2"/>
+<path fill="#6699CC" stroke="#6699CC" stroke-width="0.3" stroke-miterlimit="10" d="M11.4,17.5c0,0-1.4,1.1,0.8,1.3
+ c2.9,0.3,5.1,0.3,9-0.4c0,0,0.5,0.5,1.4,0.8C14.5,21.6,5.7,19.4,11.4,17.5"/>
+<path fill="#6699CC" stroke="#6699CC" stroke-width="0.3" stroke-miterlimit="10" d="M26.9,23.9c0,0,1,0.8-1,1.4
+ c-3.8,1.2-15.8,1.5-19.2,0c-1.2-0.5,1.1-1.2,1.8-1.4c0.7-0.2,1.2-0.1,1.2-0.1c-1.3-0.9-8.6,1.8-3.7,2.6
+ C19.3,28.7,30.4,25.5,26.9,23.9"/>
+<path fill="#6699CC" stroke="#6699CC" stroke-width="0.3" stroke-miterlimit="10" d="M12.8,13.7c0,0-6.1,1.5-2.2,2
+ c1.7,0.2,5,0.2,8.1-0.1c2.5-0.2,5.1-0.7,5.1-0.7s-0.9,0.4-1.5,0.8C16,17.4,4,16.6,7.5,15C10.4,13.6,12.8,13.7,12.8,13.7"/>
+<path fill="#6699CC" stroke="#6699CC" stroke-width="0.3" stroke-miterlimit="10" d="M23.8,19.9c6.3-3.3,3.4-6.4,1.4-6
+ c-0.5,0.1-0.7,0.2-0.7,0.2s0.2-0.3,0.5-0.4c4-1.4,7.1,4.2-1.3,6.4C23.7,20,23.7,19.9,23.8,19.9"/>
+<path fill="#6699CC" stroke="#6699CC" stroke-width="0.3" stroke-miterlimit="10" d="M13.4,28.7c6.1,0.4,15.4-0.2,15.6-3.1
+ c0,0-0.4,1.1-5,2c-5.2,1-11.6,0.9-15.3,0.2C8.7,27.9,9.4,28.5,13.4,28.7"/>
+<path fill="#F15A24" d="M16.5,0.6l2.2,4.5l5,0.7l-3.6,3.5l0.8,4.9l-4.4-2.3l-4.4,2.3l0.8-4.9L9.4,5.8l5-0.7L16.5,0.6z"/>
+</svg>
diff --git a/application/resources/pe_blue/scalable/java.svg b/application/resources/pe_blue/scalable/java.svg
new file mode 100644
index 00000000..5e369203
--- /dev/null
+++ b/application/resources/pe_blue/scalable/java.svg
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <path id="XMLID_5_" fill="#F2F2F2" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20C32,29.3,29.3,32,26,32z"
+ />
+</g>
+<path fill="none" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20C32,29.3,29.3,32,26,32z"/>
+<g>
+ <path fill="#F15A24" d="M16.7,15.6l1-0.8c0.1-0.1,1.9-1.6,0.4-3.4c-1.3-1.6-1.8-3.1-1.4-4.5c1.1-3.4,7.2-4.9,7.4-5l1-0.2l-0.9,0.5
+ C20.7,4.3,19,5.8,18.8,7c-0.2,0.9,0.4,1.7,1.1,2.7l0.2,0.3c0.5,0.7,0.6,1.4,0.5,2.1C20.2,13.8,18,15,17.9,15L16.7,15.6z"/>
+</g>
+<g>
+ <path fill="#6699CC" d="M15.9,24.2c-2.9,0-5.3-0.8-5.5-1.8c-0.1-0.4,0.2-0.9,1.7-1.4l1.3-0.4l-1.2,0.7c-0.1,0.1-0.3,0.2-0.3,0.3
+ c0,0,0.1,0.3,1.2,0.4c1.2,0.1,2.1,0.2,2.8,0.2c1.2,0,2.3-0.1,4.1-0.5l0.1,0l0,0c0,0,0.8,0.5,1.9,0.9l0.4,0.1l-0.3,0.1
+ C19.7,24,17.4,24.2,15.9,24.2z"/>
+</g>
+<g>
+ <path fill="#6699CC" d="M15.3,20.4c-3.3,0-5.7-0.6-5.8-1.5c-0.1-0.5,0.6-1,1.9-1.5l0.8-0.3l-0.7,0.5c-0.1,0.1-0.4,0.4-0.4,0.6
+ c0,0.1,0.2,0.3,1.1,0.4c1.3,0.1,2.3,0.2,3.2,0.2c1.7,0,3.4-0.2,5.7-0.6l0.1,0l0.1,0.1c0,0,0.5,0.5,1.3,0.8l0.5,0.2l-0.5,0.1
+ C20.3,20,17.7,20.4,15.3,20.4z"/>
+</g>
+<g>
+ <path fill="#6699CC" d="M15.3,27.4C15.3,27.4,15.3,27.4,15.3,27.4c-3.1,0-6.3-0.3-9.4-0.8c-1.2-0.2-1.8-0.5-1.8-1
+ c0.1-1,3.1-2,4.7-2c0.4,0,0.7,0.1,0.9,0.2l0.6,0.4l-0.7-0.1c0,0-0.4-0.1-1.1,0.1c-1.6,0.5-2,0.8-2,0.9c0,0,0,0.1,0.2,0.2
+ c1.4,0.6,4.6,1,8.7,1c4.3,0,8.4-0.4,10.3-1c0.9-0.3,1.1-0.6,1.1-0.7c0-0.2-0.2-0.4-0.2-0.4l-0.9-0.8l1.1,0.5
+ c0.7,0.3,0.8,0.7,0.7,0.9C27.4,26,22.4,27.4,15.3,27.4z"/>
+</g>
+<g>
+ <path fill="#6699CC" d="M13.6,16.7c-3,0-6.7-0.3-6.9-1.2c-0.1-0.4,0.5-0.7,0.7-0.8c2.5-1.1,4.6-1.2,5.2-1.2c0.1,0,0.1,0,0.1,0l1,0
+ l-1,0.3c-1.8,0.4-3.4,1.1-3.4,1.4c0,0,0,0.2,1.2,0.4c0.8,0.1,1.9,0.1,3.1,0.1c1.6,0,3.4-0.1,5-0.2c2.5-0.2,5.1-0.7,5.1-0.7l1.3-0.2
+ L23.9,15c0,0-0.9,0.4-1.5,0.8l0,0C20.1,16.4,16.9,16.7,13.6,16.7z"/>
+</g>
+<g>
+ <path fill="#6699CC" d="M23.5,20.3v-0.2c0-0.1,0-0.3,0.2-0.3c3.8-2,3.8-3.7,3.7-4.3c-0.2-0.9-1.1-1.4-1.9-1.4c-0.1,0-0.2,0-0.3,0
+ c-0.5,0.1-0.7,0.2-0.7,0.2l-0.5,0.2l0.3-0.5c0,0,0.2-0.3,0.6-0.5c0.4-0.2,0.9-0.2,1.3-0.2c1.5,0,2.7,0.9,2.9,2.2
+ c0.2,1.5-1.1,3.5-5.4,4.7L23.5,20.3z"/>
+</g>
+<g>
+ <path fill="#6699CC" d="M16.9,29c-1.2,0-2.4,0-3.5-0.1c-3.8-0.2-4.8-0.8-4.8-1v-0.2l0.2,0c1.8,0.3,4.2,0.5,6.8,0.5
+ c3,0,5.9-0.3,8.4-0.7c4.4-0.9,4.9-1.9,4.9-1.9l0.3-0.8l-0.1,0.9c-0.1,1.2-1.5,2.1-4.1,2.6C22.9,28.7,20.1,29,16.9,29z"/>
+</g>
+<path fill="#F15A24" d="M16.8,4.2c1.8-1.4,3-2.8,3.7-4.2h-1.7c-0.8,1-1.9,1.8-2.9,2.7c-1.2,1-2.5,2-3.3,3.2c-1.6,2.6,1,5.2,4,8
+ l0.5,0.5l-0.3-0.6c-0.3-0.7-0.7-1.3-1.2-1.9C14.2,9.6,12.7,7.4,16.8,4.2z"/>
+</svg>
diff --git a/application/resources/pe_blue/scalable/loadermods.svg b/application/resources/pe_blue/scalable/loadermods.svg
new file mode 100644
index 00000000..a54dc211
--- /dev/null
+++ b/application/resources/pe_blue/scalable/loadermods.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#DAEEFF" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#C1272D" d="M16,6.4l2.9,6l6.6,1l-4.8,4.6l1.1,6.5L16,21.4l-5.9,3.1l1.1-6.5
+ l-4.8-4.6l6.6-1L16,6.4z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6
+ v20C32,29.3,29.3,32,26,32z M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V6z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/log.svg b/application/resources/pe_blue/scalable/log.svg
new file mode 100644
index 00000000..89d373f4
--- /dev/null
+++ b/application/resources/pe_blue/scalable/log.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M30,28c-3.1,0.1-8.9,0.7-12.1,2.3C17.8,31.3,17,32,16,32
+ c-1,0-1.8-0.7-1.9-1.7c-3.2-1.6-9-2.2-12.1-2.3c-1.1,0-2-0.9-2-2V2c0-1.1,0.9-2,2-2c0.1,0,0.1,0,0.2,0C16,0.4,16,4,16,4
+ s0-3.6,13.8-4c0.1,0,0.1,0,0.2,0c1.1,0,2,0.9,2,2v24C32,27.1,31.1,28,30,28z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#DAEEFF" d="M14,6.3C11.4,5,7.2,4.4,4,4.2v19.9c5.4,0.3,8.4,1.1,10,1.9V6.3z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#DAEEFF" d="M28,4.2C24.8,4.4,20.6,5,18,6.3V26c1.6-0.8,4.6-1.6,10-1.9V4.2z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/minecraft.svg b/application/resources/pe_blue/scalable/minecraft.svg
new file mode 100644
index 00000000..2fe6a028
--- /dev/null
+++ b/application/resources/pe_blue/scalable/minecraft.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill-rule="evenodd" clip-rule="evenodd" fill="none" width="32" height="32"/>
+<g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#754C24" points="16,14.2 30,7.1 30,24.9 16,32 "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#8C6239" points="16,14.2 2,7.1 2,24.9 16,32 "/>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#39B54A" points="2,7.1 16,14.2 30,7.1 16,0 "/>
+ </g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/multimc.svg b/application/resources/pe_blue/scalable/multimc.svg
new file mode 100644
index 00000000..820c0b53
--- /dev/null
+++ b/application/resources/pe_blue/scalable/multimc.svg
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="#754C24" width="32" height="32"/>
+<polygon fill="#39B54A" points="0,5 1,5 1,4 4,4 4,5 8,5 8,8 9,8 9,2 12,2 12,5 13,5 13,4 16,4 16,8 17,8 17,6 18,6 18,5 20,5 20,8
+ 21,8 21,6 22,6 22,5 24,5 24,4 26,4 26,5 29,5 29,4 32,4 32,0 0,0 "/>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-963.8778" y1="47.5718" x2="-963.0319" y2="49.6501" gradientTransform="matrix(20.79 0 0 14.7315 20048.0879 -696.8257)">
+ <stop offset="0" style="stop-color:#000000;stop-opacity:0.8"/>
+ <stop offset="1" style="stop-color:#000000;stop-opacity:0.35"/>
+</linearGradient>
+<path fill="url(#SVGID_1_)" d="M18.5,21.5c-0.5-0.4-1-1-1.8-1.9c-1,1.2-1.9,2.1-2.8,2.7c-1.1,0.7-2.5,1-4.1,1c-2,0-3.6-0.5-4.9-1.6
+ c-1.4-1.1-2.1-2.6-2.1-4.4c0-1.7,0.7-3.2,2.1-4.4c1.2-1,2.9-1.6,5-1.6c1.1,0,2,0.2,2.8,0.5c0.9,0.3,1.7,0.8,2.3,1.4
+ c0.6,0.5,1.2,1.2,1.8,1.9c1-1.2,1.9-2.1,2.8-2.7c1.1-0.7,2.5-1,4.1-1c2,0,3.6,0.5,4.9,1.6c1.4,1.1,2.1,2.6,2.1,4.4
+ c0,1.7-0.7,3.2-2.1,4.4c-1.2,1-2.9,1.6-5,1.6c-1.1,0-2-0.2-2.8-0.5S19.2,22.1,18.5,21.5 M9.6,21.3c2.4,0,4.3-1.2,5.8-3.7
+ c-1.9-2.7-3.8-4.1-5.8-4.1c-1.5,0-2.6,0.4-3.3,1.1c-0.8,0.8-1.2,1.7-1.2,2.8c0,1.2,0.4,2.1,1.2,2.8C7.1,20.9,8.2,21.3,9.6,21.3
+ M23.9,13.5c-2.2,0-4.1,1.2-5.8,3.7c1.8,2.7,3.8,4.1,5.8,4.1c1.5,0,2.6-0.4,3.3-1.1c0.8-0.8,1.2-1.7,1.2-2.8c0-1.2-0.4-2.1-1.2-2.8
+ C26.3,13.8,25.2,13.5,23.9,13.5"/>
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-964.0289" y1="48.0195" x2="-962.7877" y2="48.9627" gradientTransform="matrix(20.79 0 0 14.7315 20047.7695 -696.964)">
+ <stop offset="0" style="stop-color:#75B54B"/>
+ <stop offset="1" style="stop-color:#75B54B;stop-opacity:0.6"/>
+</linearGradient>
+<path fill="url(#SVGID_2_)" d="M17.6,20.1c-0.5-0.4-1-1-1.8-1.9c-1,1.2-1.9,2.1-2.8,2.7c-1.1,0.7-2.5,1-4.1,1c-2,0-3.6-0.5-4.9-1.6
+ c-1.4-1.1-2.1-2.6-2.1-4.4c0-1.7,0.7-3.2,2.1-4.4c1.2-1,2.9-1.6,5-1.6c1.1,0,2,0.2,2.8,0.5c0.9,0.3,1.7,0.8,2.3,1.4
+ c0.6,0.5,1.2,1.2,1.8,1.9c1-1.2,1.9-2.1,2.8-2.7c1.1-0.7,2.5-1,4.1-1c2,0,3.6,0.5,4.9,1.6c1.4,1.1,2.1,2.6,2.1,4.4
+ c0,1.7-0.7,3.2-2.1,4.4c-1.2,1-2.9,1.6-5,1.6c-1.1,0-2-0.2-2.8-0.5C19.2,21.2,18.4,20.8,17.6,20.1 M8.7,19.9c2.4,0,4.3-1.2,5.8-3.7
+ c-1.9-2.7-3.8-4.1-5.8-4.1c-1.5,0-2.6,0.4-3.3,1.1C4.6,14,4.2,14.9,4.2,16c0,1.2,0.4,2.1,1.2,2.8C6.2,19.5,7.3,19.9,8.7,19.9
+ M23,12.1c-2.2,0-4.1,1.2-5.8,3.7c1.8,2.7,3.8,4.1,5.8,4.1c1.5,0,2.6-0.4,3.3-1.1c0.8-0.8,1.2-1.7,1.2-2.8c0-1.2-0.4-2.1-1.2-2.8
+ C25.5,12.5,24.4,12.1,23,12.1"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/new.svg b/application/resources/pe_blue/scalable/new.svg
new file mode 100644
index 00000000..dcc8579e
--- /dev/null
+++ b/application/resources/pe_blue/scalable/new.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="none" width="32" height="32"/>
+<g>
+ <path fill="#3366CC" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20C32,29.3,29.3,32,26,32z M6,2
+ C4.9,2,4,2.9,4,4s0.9,2,2,2s2-0.9,2-2S7.1,2,6,2z"/>
+ <path fill="#DAEEFF" d="M28,8H4v18c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V8z"/>
+ <path fill="#666666" d="M20,20h-2v2c0,1.1-0.9,2-2,2s-2-0.9-2-2v-2h-2c-1.1,0-2-0.9-2-2s0.9-2,2-2h2v-2c0-1.1,0.9-2,2-2s2,0.9,2,2
+ v2h2c1.1,0,2,0.9,2,2S21.1,20,20,20z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/news.svg b/application/resources/pe_blue/scalable/news.svg
new file mode 100644
index 00000000..3ca3be37
--- /dev/null
+++ b/application/resources/pe_blue/scalable/news.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="none" width="32" height="32"/>
+<g>
+ <g>
+ <path fill="#3366CC" d="M26,0H6C2.6,0,0,2.6,0,6v14c0,3.4,2.6,6,6,6l4,6l4-6h12c3.4,0,6-2.6,6-6V6C32,2.6,29.4,0,26,0z M16,20H6
+ v-2h10V20z M26,16H6v-2h20V16z M26,12H6v-2h20V12z M26,8H6V6h20V8z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/notes.svg b/application/resources/pe_blue/scalable/notes.svg
new file mode 100644
index 00000000..d0991259
--- /dev/null
+++ b/application/resources/pe_blue/scalable/notes.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6
+ v20C32,29.3,29.3,32,26,32z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#DAEEFF" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<g>
+ <rect x="8" y="16" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="16" height="2"/>
+ <rect x="8" y="12" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="16" height="2"/>
+ <rect x="8" y="8" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="16" height="2"/>
+ <rect x="8" y="20" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="8" height="2"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/patreon.svg b/application/resources/pe_blue/scalable/patreon.svg
new file mode 100644
index 00000000..644b9b41
--- /dev/null
+++ b/application/resources/pe_blue/scalable/patreon.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="none" width="32" height="32"/>
+<path fill="#F15A24" d="M16,0C7.2,0,0,7.2,0,16v16h15.3c0.2,0,0.4,0,0.7,0c8.8,0,16-7.2,16-16S24.8,0,16,0L16,0z"/>
+<path fill="#FFFFFF" d="M16,3.7C9.2,3.7,3.7,9.2,3.7,16v7.3v5V32h4.9V16c0-4.1,3.3-7.3,7.3-7.3s7.3,3.3,7.3,7.3
+ c0,4.1-3.3,7.3-7.3,7.3c-1.5,0-2.9-0.4-4-1.2v5.3c0.8,0.5,2.5,0.8,4.6,0.8C23.1,28,28.3,22.6,28.3,16C28.3,9.2,22.8,3.7,16,3.7
+ L16,3.7z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/proxy.svg b/application/resources/pe_blue/scalable/proxy.svg
new file mode 100644
index 00000000..8266f9b8
--- /dev/null
+++ b/application/resources/pe_blue/scalable/proxy.svg
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M21.9,4H11.6c-0.8-2.3-3-4-5.6-4C2.7,0,0,2.7,0,6s2.7,6,6,6
+ c2.6,0,4.8-1.7,5.6-4h10.3c1.1,0,2,0.9,2,2v1.4h4V10C27.9,6.7,25.2,4,21.9,4z M6,8C4.9,8,4,7.1,4,6s0.9-2,2-2c1.1,0,2,0.9,2,2
+ S7.1,8,6,8z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M23.9,20.6V22c0,1.1-0.9,2-2,2H11.6c-0.8-2.3-3-4-5.6-4
+ c-3.3,0-6,2.7-6,6s2.7,6,6,6c2.6,0,4.8-1.7,5.6-4h10.3c3.3,0,6-2.7,6-6v-1.4H23.9z M6,28c-1.1,0-2-0.9-2-2s0.9-2,2-2
+ c1.1,0,2,0.9,2,2S7.1,28,6,28z"/>
+<g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#C1272D" d="M32,22H20V10h12V22z M28,14h-4v4h4V14z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/quickmods.svg b/application/resources/pe_blue/scalable/quickmods.svg
new file mode 100644
index 00000000..8b577376
--- /dev/null
+++ b/application/resources/pe_blue/scalable/quickmods.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#DAEEFF" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6
+ v20C32,29.3,29.3,32,26,32z M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V6z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#C1272D" d="M10.6,24.2c-0.3,0-0.6-0.1-0.8-0.2C9.3,23.7,9,23.2,9,22.6V9.8
+ c0-0.6,0.3-1.1,0.8-1.4c0.3-0.2,0.5-0.2,0.8-0.2c0.2,0,0.5,0.1,0.7,0.2l12.8,6.4c0.5,0.3,0.9,0.8,0.9,1.4c0,0.6-0.3,1.2-0.9,1.4
+ L11.3,24C11.1,24.1,10.8,24.2,10.6,24.2z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/refresh.svg b/application/resources/pe_blue/scalable/refresh.svg
new file mode 100644
index 00000000..a3d2281d
--- /dev/null
+++ b/application/resources/pe_blue/scalable/refresh.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="none" width="32" height="32"/>
+<path fill="#39B54A" d="M31.8,17.4c-0.4-0.9-1.2-1.4-2.1-1.4h-2.3c0-7.6-6.1-13.7-13.7-13.7C6.1,2.3,0,8.4,0,16
+ c0,7.6,6.1,13.7,13.7,13.7c2.5,0,4.8-0.7,6.8-1.8l-3.4-3.4c-1,0.4-2.2,0.7-3.4,0.7c-5,0-9.1-4.1-9.1-9.1s4.1-9.1,9.1-9.1
+ c5.1,0,9.1,4.1,9.1,9.1h-2.3c-0.9,0-1.8,0.6-2.1,1.4c-0.4,0.9-0.2,1.8,0.5,2.5l4.6,4.6c0.4,0.4,1,0.7,1.6,0.7c0.6,0,1.2-0.2,1.6-0.7
+ l4.6-4.6C32,19.2,32.2,18.3,31.8,17.4z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/resourcepacks.svg b/application/resources/pe_blue/scalable/resourcepacks.svg
new file mode 100644
index 00000000..a17e7e82
--- /dev/null
+++ b/application/resources/pe_blue/scalable/resourcepacks.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#DAEEFF" d="M28,10c0-1.1-0.9-2-2-2H6c-1.1,0-2,0.9-2,2v16c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V10z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M26,4h-4V2c0-1.1-0.9-2-2-2h-8c-1.1,0-2,0.9-2,2v2H6
+ c-3.3,0-6,2.7-6,6v16c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V10C32,6.7,29.3,4,26,4z M12,3c0-0.6,0.4-1,1-1h6c0.6,0,1,0.4,1,1v1h-8V3z
+ M6,8h20c1.1,0,2,0.9,2,2v4H4v-4C4,8.9,4.9,8,6,8z M18,17c0,1.1-0.9,2-2,2s-2-0.9-2-2c0-0.4,0.1-0.7,0.3-1h3.4
+ C17.9,16.3,18,16.6,18,17z M26,28H6c-1.1,0-2-0.9-2-2V16h8.1c-0.1,0.3-0.1,0.7-0.1,1c0,2.2,1.8,4,4,4s4-1.8,4-4c0-0.3-0.1-0.7-0.1-1
+ H28v10C28,27.1,27.1,28,26,28z"/>
+</svg>
diff --git a/application/resources/pe_blue/scalable/screenshots.svg b/application/resources/pe_blue/scalable/screenshots.svg
new file mode 100644
index 00000000..1aa4e559
--- /dev/null
+++ b/application/resources/pe_blue/scalable/screenshots.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6
+ v20C32,29.3,29.3,32,26,32z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#DAEEFF" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#666666" d="M24,26H8c-1.1,0-2-0.9-2-2v-0.7c0.8-1.7,1.5-3.8,2-4.8
+ c1.1-2.4,3.5,3.5,4.9,3.5c2.8,0,6.2-10.7,9.1-7.4c1.4,1.6,2.9,5.8,4,8.4V24C26,25.1,25.1,26,24,26z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F15A24" d="M9,6c1.7,0,3,1.3,3,3c0,1.7-1.3,3-3,3c-1.7,0-3-1.3-3-3
+ C6,7.3,7.3,6,9,6z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/settings.svg b/application/resources/pe_blue/scalable/settings.svg
new file mode 100644
index 00000000..43f0b2f2
--- /dev/null
+++ b/application/resources/pe_blue/scalable/settings.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#3366CC" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6
+ v20C32,29.3,29.3,32,26,32z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#DAEEFF" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<rect x="16" y="10" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="8" height="2"/>
+<rect x="8" y="18" fill-rule="evenodd" clip-rule="evenodd" width="6" height="6"/>
+<rect x="10" y="20" fill-rule="evenodd" clip-rule="evenodd" fill="#DAEEFF" width="2" height="2"/>
+<rect x="8" y="8" fill-rule="evenodd" clip-rule="evenodd" width="6" height="6"/>
+<rect x="10" y="10" fill-rule="evenodd" clip-rule="evenodd" fill="#DAEEFF" width="2" height="2"/>
+<rect x="16" y="20" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="8" height="2"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/status-bad.svg b/application/resources/pe_blue/scalable/status-bad.svg
new file mode 100644
index 00000000..4a48b5d8
--- /dev/null
+++ b/application/resources/pe_blue/scalable/status-bad.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#C1272D" d="M26,32H6c-3.4,0-6-2.6-6-6V6c0-3.4,2.6-6,6-6h20c3.4,0,6,2.6,6,6v20C32,29.4,29.4,32,26,32z"/>
+<path fill="#FFFFFF" d="M21.6,21.6c-0.8,0.8-2,0.8-2.8,0L16,18.8l-2.8,2.8c-0.8,0.8-2,0.8-2.8,0c-0.8-0.8-0.8-2,0-2.8l2.8-2.8
+ l-2.8-2.8c-0.8-0.8-0.8-2,0-2.8c0.8-0.8,2-0.8,2.8,0l2.8,2.8l2.8-2.8c0.8-0.8,2-0.8,2.8,0s0.8,2,0,2.8L18.8,16l2.8,2.8
+ C22.4,19.6,22.4,20.8,21.6,21.6z"/>
+</svg>
diff --git a/application/resources/pe_blue/scalable/status-good.svg b/application/resources/pe_blue/scalable/status-good.svg
new file mode 100644
index 00000000..4cfa56f0
--- /dev/null
+++ b/application/resources/pe_blue/scalable/status-good.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <path fill="none" d="M26,0H6C2.6,0,0,2.6,0,6v20c0,3.4,2.6,6,6,6h20c3.4,0,6-2.6,6-6V6C32,2.6,29.4,0,26,0z M28,26c0,1.2-0.8,2-2,2
+ H6c-1.2,0-2-0.8-2-2V6c0-1.2,0.8-2,2-2h20c1.2,0,2,0.8,2,2V26z M21,10.4l-7,7l-2.8-2.8c-0.8-0.8-2-0.8-2.8,0s-0.8,2,0,2.8l4.2,4.2
+ c0.8,0.8,2,0.8,2.8,0l8.4-8.4c0.8-0.8,0.8-2,0-2.8S21.8,9.6,21,10.4z"/>
+</g>
+<path fill="#39B54A" d="M26,0H6C2.6,0,0,2.6,0,6v20c0,3.4,2.6,6,6,6h20c3.4,0,6-2.6,6-6V6C32,2.6,29.4,0,26,0z"/>
+<path fill="#39B54A" d="M28,26c0,1.2-0.8,2-2,2H6c-1.2,0-2-0.8-2-2V6c0-1.2,0.8-2,2-2h20c1.2,0,2,0.8,2,2V26z"/>
+<path fill="#FFFFFF" d="M21,10.4l-7,7l-2.8-2.8c-0.8-0.8-2-0.8-2.8,0s-0.8,2,0,2.8l4.2,4.2c0.8,0.8,2,0.8,2.8,0l8.4-8.4
+ c0.8-0.8,0.8-2,0-2.8S21.8,9.6,21,10.4z"/>
+</svg>
diff --git a/application/resources/pe_blue/scalable/status-yellow.svg b/application/resources/pe_blue/scalable/status-yellow.svg
new file mode 100644
index 00000000..0551fed2
--- /dev/null
+++ b/application/resources/pe_blue/scalable/status-yellow.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <path fill="#E3A333" d="M26,0H6C2.7,0,0,2.7,0,6v20c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V6C32,2.7,29.3,0,26,0z M28,26
+ c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h20c1.1,0,2,0.9,2,2V26z"/>
+</g>
+<path fill="#E3A333" d="M26,0H6C2.7,0,0,2.7,0,6v20c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V6C32,2.7,29.3,0,26,0z"/>
+<path fill="#E3A333" d="M28,26c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h20c1.1,0,2,0.9,2,2V26z"/>
+<g>
+ <path fill="#FFFFFF" d="M6,20c0-5.8,2.4-7.9,5.8-7.9c2,0,3.4,0.7,5.3,1.9c1.6,1,2.5,1.5,3.3,1.5c0.7,0,1.2-0.7,1.3-3.1H26
+ c0.2,6.1-2.3,8-5.5,8c-2,0-3.5-0.8-5.3-1.9c-1.7-1-2.6-1.6-3.3-1.6c-0.8,0-1.4,0.5-1.6,3.2H6z"/>
+</g>
+</svg>
diff --git a/application/resources/pe_blue/scalable/viewfolder.svg b/application/resources/pe_blue/scalable/viewfolder.svg
new file mode 100644
index 00000000..2634f8ff
--- /dev/null
+++ b/application/resources/pe_blue/scalable/viewfolder.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#DAEEFF" d="M28,10c0-1.1-0.9-2-2-2H16V6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V10z"
+ />
+<rect fill="none" width="32" height="32"/>
+<path fill="#3366CC" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h8c2.6,0,4.8,1.7,5.6,4H26c3.3,0,6,2.7,6,6v16
+ C32,29.3,29.3,32,26,32z M28,10c0-1.1-0.9-2-2-2H16V6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V10z
+ "/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_colored/index.theme b/application/resources/pe_colored/index.theme
new file mode 100644
index 00000000..b757bbd7
--- /dev/null
+++ b/application/resources/pe_colored/index.theme
@@ -0,0 +1,11 @@
+[Icon Theme]
+Name=pe_colored
+Comment=Icons by pexner (colored)
+Inherits=multimc
+Directories=scalable
+
+[scalable]
+Size=48
+Type=Scalable
+MinSize=16
+MaxSize=256
diff --git a/application/resources/pe_colored/pe_colored.qrc b/application/resources/pe_colored/pe_colored.qrc
new file mode 100644
index 00000000..7de8d5ab
--- /dev/null
+++ b/application/resources/pe_colored/pe_colored.qrc
@@ -0,0 +1,35 @@
+<!DOCTYPE RCC>
+<RCC version="1.0">
+ <qresource prefix="/icons/pe_colored">
+ <file>index.theme</file>
+ <file>scalable/about.svg</file>
+ <file>scalable/accounts.svg</file>
+ <file>scalable/bug.svg</file>
+ <file>scalable/centralmods.svg</file>
+ <file>scalable/checkupdate.svg</file>
+ <file>scalable/copy.svg</file>
+ <file>scalable/coremods.svg</file>
+ <file>scalable/externaltools.svg</file>
+ <file>scalable/instance-settings.svg</file>
+ <file>scalable/jarmods.svg</file>
+ <file>scalable/java.svg</file>
+ <file>scalable/loadermods.svg</file>
+ <file>scalable/log.svg</file>
+ <file>scalable/minecraft.svg</file>
+ <file>scalable/multimc.svg</file>
+ <file>scalable/new.svg</file>
+ <file>scalable/news.svg</file>
+ <file>scalable/notes.svg</file>
+ <file>scalable/patreon.svg</file>
+ <file>scalable/proxy.svg</file>
+ <file>scalable/quickmods.svg</file>
+ <file>scalable/refresh.svg</file>
+ <file>scalable/resourcepacks.svg</file>
+ <file>scalable/screenshots.svg</file>
+ <file>scalable/settings.svg</file>
+ <file>scalable/status-bad.svg</file>
+ <file>scalable/status-good.svg</file>
+ <file>scalable/status-yellow.svg</file>
+ <file>scalable/viewfolder.svg</file>
+ </qresource>
+</RCC>
diff --git a/application/resources/pe_colored/scalable/about.svg b/application/resources/pe_colored/scalable/about.svg
new file mode 100644
index 00000000..95e99689
--- /dev/null
+++ b/application/resources/pe_colored/scalable/about.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<circle fill="#F2F2F2" cx="16" cy="16" r="12"/>
+<g>
+ <polygon fill="#666666" points="17.8,21 17.8,11.9 11.9,11.9 11.9,14.2 14.2,14.2 14.2,21 11.9,21 11.9,23.3 20.1,23.3 20.1,21
+ "/>
+ <circle fill="#666666" cx="16" cy="8.3" r="1.8"/>
+</g>
+<g>
+ <path fill="none" d="M16,4c-4,0-7.6,2-9.7,5C4.8,11,4,13.4,4,16c0,6.6,5.4,12,12,12c6.6,0,12-5.4,12-12c0-2.6-0.8-5-2.3-7
+ C23.6,6,20,4,16,4z"/>
+ <path fill="#39B54A" d="M16,4c4,0,7.6,2,9.7,5h4.6c-2.6-5.3-8-9-14.4-9S4.2,3.7,1.6,9h4.6C8.4,6,12,4,16,4z"/>
+ <path fill="#8C6239" d="M32,16L32,16c0-2.6-0.6-4.9-1.6-7h-4.6c1.4,2,2.3,4.4,2.3,7c0,6.6-5.4,12-12,12C9.4,28,4,22.6,4,16
+ c0-2.6,0.8-5,2.3-7H1.6c-1,2.1-1.6,4.5-1.6,7c0,8.8,7.2,16,16,16h0C24.8,32,32,24.9,32,16z"/>
+</g>
+</svg>
diff --git a/application/resources/pe_colored/scalable/accounts.svg b/application/resources/pe_colored/scalable/accounts.svg
new file mode 100644
index 00000000..301eb368
--- /dev/null
+++ b/application/resources/pe_colored/scalable/accounts.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#999999" d="M25.8,17.5c1.4-1.4,2.2-3.4,2.2-5.5V8c0-4.4-3.6-8-8-8
+ c-0.6,0-1.2,0.1-1.8,0.2c1.3,1.1,2.4,2.4,3,4C22.8,4.7,24,6.2,24,8v4c0,1.8-1.2,3.3-2.8,3.8c-0.2,0.4-0.4,0.8-0.6,1.2
+ c1.5,1.2,2.8,2.6,3.7,4.2c1.8,1.1,3.1,2.7,3.6,4.7c0,1.1-0.9,2-2,2h-0.3c-0.4,1.6-1.3,3-2.5,4H26c3.3,0,6-2.7,6-6
+ C31.4,22.3,28.9,19.3,25.8,17.5z"/>
+<g>
+ <polygon fill="none" points="12,0 12,0 12,0 "/>
+ <path fill="#39B54A" d="M20,8c0-4.4-3.6-8-8-8h0C7.6,0,4,3.6,4,8v1h16V8z"/>
+ <path fill="#8C6239" d="M6,32h12c3.3,0,6-2.7,6-6c-0.6-3.7-3.1-6.8-6.2-8.5c1.4-1.4,2.2-3.4,2.2-5.5V9H4v3c0,2.1,0.9,4.1,2.2,5.5
+ C3.1,19.2,0.6,22.3,0,26C0,29.3,2.7,32,6,32z"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M16,12V8c0-2.2-1.8-4-4-4S8,5.8,8,8v4c0,2.2,1.8,4,4,4
+ S16,14.2,16,12z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M20,26c-0.9-3.4-4.3-6-8-6l0,0l0,0c-3.7,0-7.1,2.6-8,6l0,0
+ c0,1.1,0.9,2,2,2h12C19.1,28,20,27.1,20,26L20,26z"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/bug.svg b/application/resources/pe_colored/scalable/bug.svg
new file mode 100644
index 00000000..8c92df0a
--- /dev/null
+++ b/application/resources/pe_colored/scalable/bug.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect x="0" fill="none" width="32" height="32"/>
+<g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#39B54A" d="M22.7,5.3c-0.3-1.2-0.9-2.3-1.8-3.2c-2.7-2.8-7.2-2.8-9.9,0
+ c-0.9,0.9-1.5,2-1.8,3.2C13.5,3.3,18.5,3.3,22.7,5.3z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#8C6239" d="M30,17.9h-4.1c0-0.7,0.1-1.3,0.1-2c0-0.7,0-1.4-0.1-2
+ c0,0,0,0,0.1,0v0h2c1.1,0,2-0.9,2-2c0-1.1-0.9-2-2-2h-2v0c-0.3,0-0.6,0.1-0.8,0.1c-1.2-3.1-3.9-4.1-9.2-4.1s-7.9,1-9.2,4.1
+ C6.6,9.9,6.3,9.8,6,9.8v0H4c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2h2v0c0,0,0,0,0.1,0c0,0.6-0.1,1.3-0.1,2c0,0.7,0,1.3,0.1,2H2
+ c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2h4.5c0.3,1.4,0.7,2.8,1.2,4H6c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2h2v0c0.7,0,1.4-0.1,2.1-0.3
+ c1.5,1.4,3.4,2.3,5.9,2.3s4.4-0.9,5.9-2.3c0.7,0.2,1.4,0.3,2.1,0.3v0h2c1.1,0,2-0.9,2-2c0-1.1-0.9-2-2-2h-1.7
+ c0.5-1.2,0.9-2.6,1.2-4H30c1.1,0,2-0.9,2-2C32,18.8,31.1,17.9,30,17.9z"/>
+</g>
+</svg>
diff --git a/application/resources/pe_colored/scalable/centralmods.svg b/application/resources/pe_colored/scalable/centralmods.svg
new file mode 100644
index 00000000..57a97259
--- /dev/null
+++ b/application/resources/pe_colored/scalable/centralmods.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#F2F2F2" d="M28,10c0-1.1-0.9-2-2-2H16V6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V10z"
+ />
+<rect x="0" fill="none" width="32" height="32"/>
+<g>
+ <path fill="none" d="M26,8H16V6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v3v17c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V10
+ c0-0.4-0.1-0.7-0.3-1C27.4,8.4,26.7,8,26,8z"/>
+ <path fill="#39B54A" d="M4,6c0-1.1,0.9-2,2-2h8c1.1,0,2,0.9,2,2v2h10c0.7,0,1.4,0.4,1.7,1h4.2C31.4,6.2,29,4,26,4h-6.4
+ c-0.8-2.3-3-4-5.6-4H6C2.7,0,0,2.7,0,6v3h4V6z"/>
+ <path fill="#8C6239" d="M27.7,9c0.2,0.3,0.3,0.6,0.3,1v16c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V9H0v17c0,3.3,2.7,6,6,6h20
+ c3.3,0,6-2.7,6-6V10c0-0.3,0-0.7-0.1-1H27.7z"/>
+</g>
+<path fill="#C1272D" d="M16,10.2l2.2,4.5l5,0.7L19.6,19l0.8,4.9L16,21.6l-4.4,2.3l0.8-4.9l-3.6-3.5l5-0.7L16,10.2z"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/checkupdate.svg b/application/resources/pe_colored/scalable/checkupdate.svg
new file mode 100644
index 00000000..0adc8eeb
--- /dev/null
+++ b/application/resources/pe_colored/scalable/checkupdate.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#6699CC" d="M26,24h-0.4c0-0.1-0.1-0.2-0.1-0.3c-0.7-1.6-1.5-2.8-3.5-3.4V18c0-3.3-2.7-6-6-6c-3.3,0-6,2.7-6,6v2.3
+ c-2,0.6-2.9,1.8-3.5,3.4c0,0,0,0.1,0,0.1C2.8,23.1,0,19.9,0,16v-2c0-4.4,3.6-8,8-8c0.8,0,1.5,0.1,2.2,0.3C10.9,2.7,14.2,0,18,0
+ c4.4,0,8,3.6,8,8c0,0.7-0.1,1.4-0.3,2c0.1,0,0.2,0,0.3,0c3.3,0,6,2.7,6,6v2C32,21.3,29.3,24,26,24z"/>
+<path fill="#39B54A" d="M12,24h2v-6c0-1.1,0.9-2,2-2c1.1,0,2,0.9,2,2v6h2c0.8,0,1.5,0.5,1.8,1.2c0.1,0.2,0.1,0.4,0.1,0.6
+ c0.1,0.6-0.1,1.2-0.6,1.6l-4,4C17,31.8,16.5,32,16,32c-0.5,0-1-0.2-1.4-0.6l-4-4c-0.4-0.4-0.6-1-0.6-1.6c0-0.2,0.1-0.4,0.1-0.6
+ C10.5,24.5,11.2,24,12,24z"/>
+<rect fill="none" width="32" height="32"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/copy.svg b/application/resources/pe_colored/scalable/copy.svg
new file mode 100644
index 00000000..b9b0f1b1
--- /dev/null
+++ b/application/resources/pe_colored/scalable/copy.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#F2F2F2" d="M4,26c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V14H4V26z"/>
+<path fill="#39B54A" d="M28,25.6V10c0-3.3-2.7-6-6-6H6.4c0.8-2.3,3-4,5.6-4h14c3.3,0,6,2.7,6,6v14C32,22.6,30.3,24.8,28,25.6z"/>
+<g>
+ <circle fill="none" cx="6" cy="10" r="2"/>
+ <path fill="none" d="M6,28h14c1.1,0,2-0.9,2-2V15v-1H4v1v11C4,27.1,4.9,28,6,28z"/>
+ <path fill="#39B54A" d="M0,12v3h4v-1h18v1h4v-3c0-3.3-2.7-6-6-6H6C2.7,6,0,8.7,0,12z M8,10c0,1.1-0.9,2-2,2c-1.1,0-2-0.9-2-2
+ c0-1.1,0.9-2,2-2C7.1,8,8,8.9,8,10z"/>
+ <path fill="#8C6239" d="M22,26c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V15H0v11c0,3.3,2.7,6,6,6h14c3.3,0,6-2.7,6-6V15h-4V26z"/>
+</g>
+<rect fill="none" width="32" height="32"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/coremods.svg b/application/resources/pe_colored/scalable/coremods.svg
new file mode 100644
index 00000000..ca7a22f0
--- /dev/null
+++ b/application/resources/pe_colored/scalable/coremods.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<circle fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" cx="16" cy="16" r="12"/>
+<g>
+ <path fill="none" d="M16,4c-4,0-7.6,2-9.7,5C4.8,11,4,13.4,4,16c0,6.6,5.4,12,12,12s12-5.4,12-12c0-2.6-0.8-5-2.3-7
+ C23.6,6,20,4,16,4z"/>
+ <path fill="#39B54A" d="M16,4c4,0,7.6,2,9.7,5h4.6c-2.6-5.3-8-9-14.4-9C9.7,0,4.2,3.7,1.6,9h4.6C8.4,6,12,4,16,4z"/>
+ <path fill="#8C6239" d="M25.7,9c1.4,2,2.3,4.4,2.3,7c0,6.6-5.4,12-12,12S4,22.6,4,16c0-2.6,0.8-5,2.3-7H1.6c-1,2.1-1.6,4.5-1.6,7
+ c0,8.8,7.2,16,16,16c8.8,0,16-7.2,16-16c0-2.5-0.6-4.9-1.6-7H25.7z"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#C1272D" d="M16,6l2.9,6l6.6,1l-4.8,4.6l1.1,6.5L16,21l-5.9,3.1l1.1-6.5
+ l-4.8-4.6l6.6-1L16,6z"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/externaltools.svg b/application/resources/pe_colored/scalable/externaltools.svg
new file mode 100644
index 00000000..1469674f
--- /dev/null
+++ b/application/resources/pe_colored/scalable/externaltools.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <path fill="#39B54A" d="M26,0h-9.1C17.6,1.2,18,2.6,18,4h8c1.1,0,2,0.9,2,2v3h4V6C32,2.7,29.3,0,26,0z"/>
+ <path fill="#8C6239" d="M28,26c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2v-4.5l-4-3V26c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V9h-4V26z"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#009245" d="M8.8,17.6C9.2,17.9,9.6,18,10,18c0.3,0,0.6-0.1,0.9-0.2
+ c0.7-0.3,1.1-1,1.1-1.8v-1.9V14c6.3,0,11.7,4.2,13.4,10c0.4-1.3,0.6-2.6,0.6-4c0-7.7-6.3-14-14-14V4c0-0.8-0.4-1.5-1.1-1.8
+ C10.6,2.1,10.3,2,10,2C9.6,2,9.2,2.1,8.8,2.4l-8,6C0.3,8.8,0,9.4,0,10c0,0.6,0.3,1.2,0.8,1.6L8.8,17.6z"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/instance-settings.svg b/application/resources/pe_colored/scalable/instance-settings.svg
new file mode 100644
index 00000000..72032f8a
--- /dev/null
+++ b/application/resources/pe_colored/scalable/instance-settings.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect x="0" y="0" fill="none" width="32" height="32"/>
+<polygon fill="none" points="26,0 6,0 6,0 26,0 "/>
+<path fill="#39B54A" d="M26,0H6C2.7,0,0,2.7,0,6v3h32V6C32,2.7,29.3,0,26,0z"/>
+<path fill="#8C6239" d="M0,26c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V9H0V26z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<rect x="16" y="10" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="8" height="2"/>
+<rect x="8" y="18" fill-rule="evenodd" clip-rule="evenodd" width="6" height="6"/>
+<rect x="10" y="20" fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" width="2" height="2"/>
+<rect x="8" y="8" fill-rule="evenodd" clip-rule="evenodd" width="6" height="6"/>
+<rect x="10" y="10" fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" width="2" height="2"/>
+<rect x="16" y="20" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="8" height="2"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/jarmods.svg b/application/resources/pe_colored/scalable/jarmods.svg
new file mode 100644
index 00000000..bb75f4b1
--- /dev/null
+++ b/application/resources/pe_colored/scalable/jarmods.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6
+ v20C32,29.3,29.3,32,26,32z"/>
+<path fill="#6699CC" stroke="#6699CC" stroke-width="0.3" stroke-miterlimit="10" d="M12.2,21.2c0,0-1.3,0.7,0.9,1
+ c2.7,0.3,4,0.3,7-0.3c0,0,0.8,0.5,1.9,0.9C15.3,25.7,7,22.7,12.2,21.2"/>
+<path fill="#6699CC" stroke="#6699CC" stroke-width="0.3" stroke-miterlimit="10" d="M11.4,17.5c0,0-1.4,1.1,0.8,1.3
+ c2.9,0.3,5.1,0.3,9-0.4c0,0,0.5,0.5,1.4,0.8C14.5,21.6,5.7,19.4,11.4,17.5"/>
+<path fill="#6699CC" stroke="#6699CC" stroke-width="0.3" stroke-miterlimit="10" d="M26.9,23.9c0,0,1,0.8-1,1.4
+ c-3.8,1.2-15.8,1.5-19.2,0c-1.2-0.5,1.1-1.2,1.8-1.4c0.7-0.2,1.2-0.1,1.2-0.1c-1.3-0.9-8.6,1.8-3.7,2.6
+ C19.3,28.7,30.4,25.5,26.9,23.9"/>
+<path fill="#6699CC" stroke="#6699CC" stroke-width="0.3" stroke-miterlimit="10" d="M12.8,13.7c0,0-6.1,1.5-2.2,2
+ c1.7,0.2,5,0.2,8.1-0.1c2.5-0.2,5.1-0.7,5.1-0.7s-0.9,0.4-1.5,0.8C16,17.4,4,16.6,7.5,15C10.4,13.6,12.8,13.7,12.8,13.7"/>
+<path fill="#6699CC" stroke="#6699CC" stroke-width="0.3" stroke-miterlimit="10" d="M23.8,19.9c6.3-3.3,3.4-6.4,1.4-6
+ c-0.5,0.1-0.7,0.2-0.7,0.2s0.2-0.3,0.5-0.4c4-1.4,7.1,4.2-1.3,6.4C23.7,20,23.7,19.9,23.8,19.9"/>
+<path fill="#6699CC" stroke="#6699CC" stroke-width="0.3" stroke-miterlimit="10" d="M13.4,28.7c6.1,0.4,15.4-0.2,15.6-3.1
+ c0,0-0.4,1.1-5,2c-5.2,1-11.6,0.9-15.3,0.2C8.7,27.9,9.4,28.5,13.4,28.7"/>
+<path fill="#F15A24" d="M16.5,0.6l2.2,4.5l5,0.7l-3.6,3.5l0.8,4.9l-4.4-2.3l-4.4,2.3l0.8-4.9L9.4,5.8l5-0.7L16.5,0.6z"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/java.svg b/application/resources/pe_colored/scalable/java.svg
new file mode 100644
index 00000000..32c0225b
--- /dev/null
+++ b/application/resources/pe_colored/scalable/java.svg
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <path id="XMLID_1_" fill="#F2F2F2" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20C32,29.3,29.3,32,26,32z"
+ />
+</g>
+<path fill="none" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20C32,29.3,29.3,32,26,32z"/>
+<g>
+ <path fill="#F15A24" d="M16.7,15.6l1-0.8c0.1-0.1,1.9-1.6,0.4-3.4c-1.3-1.6-1.8-3.1-1.4-4.5c1.1-3.4,7.2-4.9,7.4-5l1-0.2l-0.9,0.5
+ C20.7,4.3,19,5.8,18.8,7c-0.2,0.9,0.4,1.7,1.1,2.7l0.2,0.3c0.5,0.7,0.6,1.4,0.5,2.1C20.2,13.8,18,15,17.9,15L16.7,15.6z"/>
+</g>
+<g>
+ <g>
+ <path fill="#6699CC" d="M15.9,24.2c-2.9,0-5.3-0.8-5.5-1.8c-0.1-0.4,0.2-0.9,1.7-1.4l1.3-0.4l-1.2,0.7c-0.1,0.1-0.3,0.2-0.3,0.3
+ c0,0,0.1,0.3,1.2,0.4c1.2,0.1,2.1,0.2,2.8,0.2c1.2,0,2.3-0.1,4.1-0.5l0.1,0l0,0c0,0,0.8,0.5,1.9,0.9l0.4,0.1l-0.3,0.1
+ C19.7,24,17.4,24.2,15.9,24.2z"/>
+ </g>
+ <g>
+ <path fill="#6699CC" d="M15.3,20.4c-3.3,0-5.7-0.6-5.8-1.5c-0.1-0.5,0.6-1,1.9-1.5l0.8-0.3l-0.7,0.5c-0.1,0.1-0.4,0.4-0.4,0.6
+ c0,0.1,0.2,0.3,1.1,0.4c1.3,0.1,2.3,0.2,3.2,0.2c1.7,0,3.4-0.2,5.7-0.6l0.1,0l0.1,0.1c0,0,0.5,0.5,1.3,0.8l0.5,0.2l-0.5,0.1
+ C20.3,20,17.7,20.4,15.3,20.4z"/>
+ </g>
+ <g>
+ <path fill="#6699CC" d="M15.3,27.4C15.3,27.4,15.3,27.4,15.3,27.4c-3.1,0-6.3-0.3-9.4-0.8c-1.2-0.2-1.8-0.5-1.8-1
+ c0.1-1,3.1-2,4.7-2c0.4,0,0.7,0.1,0.9,0.2l0.6,0.4l-0.7-0.1c0,0-0.4-0.1-1.1,0.1c-1.6,0.5-2,0.8-2,0.9c0,0,0,0.1,0.2,0.2
+ c1.4,0.6,4.6,1,8.7,1c4.3,0,8.4-0.4,10.3-1c0.9-0.3,1.1-0.6,1.1-0.7c0-0.2-0.2-0.4-0.2-0.4l-0.9-0.8l1.1,0.5
+ c0.7,0.3,0.8,0.7,0.7,0.9C27.4,26,22.4,27.4,15.3,27.4z"/>
+ </g>
+ <g>
+ <path fill="#6699CC" d="M13.6,16.7c-3,0-6.7-0.3-6.9-1.2c-0.1-0.4,0.5-0.7,0.7-0.8c2.5-1.1,4.6-1.2,5.2-1.2c0.1,0,0.1,0,0.1,0l1,0
+ l-1,0.3c-1.8,0.4-3.4,1.1-3.4,1.4c0,0,0,0.2,1.2,0.4c0.8,0.1,1.9,0.1,3.1,0.1c1.6,0,3.4-0.1,5-0.2c2.5-0.2,5.1-0.7,5.1-0.7
+ l1.3-0.2L23.9,15c0,0-0.9,0.4-1.5,0.8l0,0C20.1,16.4,16.9,16.7,13.6,16.7z"/>
+ </g>
+ <g>
+ <path fill="#6699CC" d="M23.5,20.3v-0.2c0-0.1,0-0.3,0.2-0.3c3.8-2,3.8-3.7,3.7-4.3c-0.2-0.9-1.1-1.4-1.9-1.4c-0.1,0-0.2,0-0.3,0
+ c-0.5,0.1-0.7,0.2-0.7,0.2l-0.5,0.2l0.3-0.5c0,0,0.2-0.3,0.6-0.5c0.4-0.2,0.9-0.2,1.3-0.2c1.5,0,2.7,0.9,2.9,2.2
+ c0.2,1.5-1.1,3.5-5.4,4.7L23.5,20.3z"/>
+ </g>
+ <g>
+ <path fill="#6699CC" d="M16.9,29c-1.2,0-2.4,0-3.5-0.1c-3.8-0.2-4.8-0.8-4.8-1v-0.2l0.2,0c1.8,0.3,4.2,0.5,6.8,0.5
+ c3,0,5.9-0.3,8.4-0.7c4.4-0.9,4.9-1.9,4.9-1.9l0.3-0.8l-0.1,0.9c-0.1,1.2-1.5,2.1-4.1,2.6C22.9,28.7,20.1,29,16.9,29z"/>
+ </g>
+</g>
+<path fill="#F15A24" d="M16.8,4.2c1.8-1.4,3-2.8,3.7-4.2h-1.7c-0.8,1-1.9,1.8-2.9,2.7c-1.2,1-2.5,2-3.3,3.2c-1.6,2.6,1,5.2,4,8
+ l0.5,0.5l-0.3-0.6c-0.3-0.7-0.7-1.3-1.2-1.9C14.2,9.6,12.7,7.4,16.8,4.2z"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/loadermods.svg b/application/resources/pe_colored/scalable/loadermods.svg
new file mode 100644
index 00000000..2d80c7f3
--- /dev/null
+++ b/application/resources/pe_colored/scalable/loadermods.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#C1272D" d="M16,6.4l2.9,6l6.6,1l-4.8,4.6l1.1,6.5L16,21.4l-5.9,3.1l1.1-6.5
+ l-4.8-4.6l6.6-1L16,6.4z"/>
+<g>
+ <path fill="none" d="M6,28h20c1.1,0,2-0.9,2-2V9V6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v3v17C4,27.1,4.9,28,6,28z"/>
+ <path fill="#39B54A" d="M26,0H6C2.7,0,0,2.7,0,6v3h4V6c0-1.1,0.9-2,2-2h20c1.1,0,2,0.9,2,2v3h4V6C32,2.7,29.3,0,26,0z"/>
+ <path fill="#8C6239" d="M28,26c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V9H0v17c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V9h-4V26z"/>
+</g>
+</svg>
diff --git a/application/resources/pe_colored/scalable/log.svg b/application/resources/pe_colored/scalable/log.svg
new file mode 100644
index 00000000..42659b53
--- /dev/null
+++ b/application/resources/pe_colored/scalable/log.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <polygon fill="none" points="30,0 30,0 30,0 "/>
+ <polygon fill="none" points="2,0 2,0 2,0 "/>
+ <path fill="#39B54A" d="M30,0L30,0c-0.1,0-0.1,0-0.2,0C16,0.4,16,4,16,4s0-3.6-13.8-4C2.1,0,2.1,0,2,0h0C0.9,0,0,0.9,0,2v7h32V2
+ C32,0.9,31.1,0,30,0z"/>
+ <path fill="#8C6239" d="M0,26c0,1.1,0.9,2,2,2c3.1,0.1,8.9,0.7,12.1,2.3c0.2,1,0.9,1.7,1.9,1.7c1,0,1.8-0.7,1.9-1.7
+ c3.2-1.6,9-2.2,12.1-2.3c1.1,0,2-0.9,2-2V9H0V26z"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M14,6.3C11.4,5,7.2,4.4,4,4.2v19.9c5.4,0.3,8.4,1.1,10,1.9V6.3z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M28,4.2C24.8,4.4,20.6,5,18,6.3V26c1.6-0.8,4.6-1.6,10-1.9V4.2z"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/minecraft.svg b/application/resources/pe_colored/scalable/minecraft.svg
new file mode 100644
index 00000000..52815487
--- /dev/null
+++ b/application/resources/pe_colored/scalable/minecraft.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="-463 265 32 32" enable-background="new -463 265 32 32" xml:space="preserve">
+<rect x="-463" y="265" fill-rule="evenodd" clip-rule="evenodd" fill="none" width="32" height="32"/>
+<g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#754C24" points="-447,279.2 -433,272.1 -433,289.9 -447,297 "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#8C6239" points="-447,279.2 -461,272.1 -461,289.9 -447,297 "/>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#39B54A" points="-461,272.1 -447,279.2 -433,272.1 -447,265 "/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/pe_colored/scalable/multimc.svg b/application/resources/pe_colored/scalable/multimc.svg
new file mode 100644
index 00000000..a146c52e
--- /dev/null
+++ b/application/resources/pe_colored/scalable/multimc.svg
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="-463 265 32 32" enable-background="new -463 265 32 32" xml:space="preserve">
+<rect x="-463" y="265" fill="#754C24" width="32" height="32"/>
+<polygon fill="#39B54A" points="-463,270 -462,270 -462,269 -459,269 -459,270 -455,270 -455,273 -454,273 -454,267 -451,267
+ -451,270 -450,270 -450,269 -447,269 -447,273 -446,273 -446,271 -445,271 -445,270 -443,270 -443,273 -442,273 -442,271 -441,271
+ -441,270 -439,270 -439,269 -437,269 -437,270 -434,270 -434,269 -431,269 -431,265 -463,265 "/>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-1426.8778" y1="312.5718" x2="-1426.032" y2="314.6501" gradientTransform="matrix(20.79 0 0 14.7315 29210.8574 -4335.6729)">
+ <stop offset="0" style="stop-color:#000000;stop-opacity:0.8"/>
+ <stop offset="1" style="stop-color:#000000;stop-opacity:0.35"/>
+</linearGradient>
+<path fill="url(#SVGID_1_)" d="M-444.5,286.5c-0.5-0.4-1-1-1.8-1.9c-1,1.2-1.9,2.1-2.8,2.7c-1.1,0.7-2.5,1-4.1,1
+ c-2,0-3.6-0.5-4.9-1.6c-1.4-1.1-2.1-2.6-2.1-4.4c0-1.7,0.7-3.2,2.1-4.4c1.2-1,2.9-1.6,5-1.6c1.1,0,2,0.2,2.8,0.5
+ c0.9,0.3,1.7,0.8,2.3,1.4c0.6,0.5,1.2,1.2,1.8,1.9c1-1.2,1.9-2.1,2.8-2.7c1.1-0.7,2.5-1,4.1-1c2,0,3.6,0.5,4.9,1.6
+ c1.4,1.1,2.1,2.6,2.1,4.4c0,1.7-0.7,3.2-2.1,4.4c-1.2,1-2.9,1.6-5,1.6c-1.1,0-2-0.2-2.8-0.5S-443.8,287.1-444.5,286.5 M-453.4,286.3
+ c2.4,0,4.3-1.2,5.8-3.7c-1.9-2.7-3.8-4.1-5.8-4.1c-1.5,0-2.6,0.4-3.3,1.1c-0.8,0.8-1.2,1.7-1.2,2.8c0,1.2,0.4,2.1,1.2,2.8
+ C-455.9,285.9-454.8,286.3-453.4,286.3 M-439.1,278.5c-2.2,0-4.1,1.2-5.8,3.7c1.8,2.7,3.8,4.1,5.8,4.1c1.5,0,2.6-0.4,3.3-1.1
+ c0.8-0.8,1.2-1.7,1.2-2.8c0-1.2-0.4-2.1-1.2-2.8C-436.7,278.8-437.8,278.5-439.1,278.5"/>
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-1427.0289" y1="313.0195" x2="-1425.7877" y2="313.9627" gradientTransform="matrix(20.79 0 0 14.7315 29210.5391 -4335.8115)">
+ <stop offset="0" style="stop-color:#75B54B"/>
+ <stop offset="1" style="stop-color:#75B54B;stop-opacity:0.6"/>
+</linearGradient>
+<path fill="url(#SVGID_2_)" d="M-445.4,285.1c-0.5-0.4-1-1-1.8-1.9c-1,1.2-1.9,2.1-2.8,2.7c-1.1,0.7-2.5,1-4.1,1
+ c-2,0-3.6-0.5-4.9-1.6c-1.4-1.1-2.1-2.6-2.1-4.4c0-1.7,0.7-3.2,2.1-4.4c1.2-1,2.9-1.6,5-1.6c1.1,0,2,0.2,2.8,0.5
+ c0.9,0.3,1.7,0.8,2.3,1.4c0.6,0.5,1.2,1.2,1.8,1.9c1-1.2,1.9-2.1,2.8-2.7c1.1-0.7,2.5-1,4.1-1c2,0,3.6,0.5,4.9,1.6
+ c1.4,1.1,2.1,2.6,2.1,4.4c0,1.7-0.7,3.2-2.1,4.4c-1.2,1-2.9,1.6-5,1.6c-1.1,0-2-0.2-2.8-0.5C-443.8,286.2-444.6,285.8-445.4,285.1
+ M-454.3,284.9c2.4,0,4.3-1.2,5.8-3.7c-1.9-2.7-3.8-4.1-5.8-4.1c-1.5,0-2.6,0.4-3.3,1.1c-0.8,0.8-1.2,1.7-1.2,2.8
+ c0,1.2,0.4,2.1,1.2,2.8C-456.8,284.5-455.7,284.9-454.3,284.9 M-440,277.1c-2.2,0-4.1,1.2-5.8,3.7c1.8,2.7,3.8,4.1,5.8,4.1
+ c1.5,0,2.6-0.4,3.3-1.1c0.8-0.8,1.2-1.7,1.2-2.8c0-1.2-0.4-2.1-1.2-2.8C-437.5,277.5-438.6,277.1-440,277.1"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/new.svg b/application/resources/pe_colored/scalable/new.svg
new file mode 100644
index 00000000..f18ed28a
--- /dev/null
+++ b/application/resources/pe_colored/scalable/new.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="none" width="32" height="32"/>
+<g>
+ <circle fill="none" cx="6" cy="4" r="2"/>
+ <path fill="#39B54A" d="M26,0H6C2.7,0,0,2.7,0,6v3h32V6C32,2.7,29.3,0,26,0z M6,6C4.9,6,4,5.1,4,4c0-1.1,0.9-2,2-2c1.1,0,2,0.9,2,2
+ C8,5.1,7.1,6,6,6z"/>
+ <path fill="#8C6239" d="M0,26c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V9H0V26z"/>
+</g>
+<path fill="#F2F2F2" d="M28,8H4v18c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V8z"/>
+<path fill="#009245" d="M20,20h-2v2c0,1.1-0.9,2-2,2s-2-0.9-2-2v-2h-2c-1.1,0-2-0.9-2-2s0.9-2,2-2h2v-2c0-1.1,0.9-2,2-2s2,0.9,2,2v2
+ h2c1.1,0,2,0.9,2,2S21.1,20,20,20z"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/news.svg b/application/resources/pe_colored/scalable/news.svg
new file mode 100644
index 00000000..4f924cd8
--- /dev/null
+++ b/application/resources/pe_colored/scalable/news.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
+<rect fill="none" width="16" height="16"/>
+<g>
+ <g>
+ <path fill="#39B54A" d="M13,0H3C1.3,0,0,1.3,0,3v7c0,1.7,1.3,3,3,3l2,3l2-3h6c1.7,0,3-1.3,3-3V3C16,1.3,14.7,0,13,0z M8,10H3V9h5
+ V10z M13,8H3V7h10V8z M13,6H3V5h10V6z M13,4H3V3h10V4z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/pe_colored/scalable/notes.svg b/application/resources/pe_colored/scalable/notes.svg
new file mode 100644
index 00000000..55ece163
--- /dev/null
+++ b/application/resources/pe_colored/scalable/notes.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <rect x="6" y="0" fill="none" width="20" height="0"/>
+ <polygon fill="none" points="0,6 0,6 0,26 0,26 0,9 "/>
+ <polygon fill="none" points="32,6 32,9 32,26 32,26 32,6 "/>
+ <path fill="#39B54A" d="M32,9V6c0-3.3-2.7-6-6-6H6C2.7,0,0,2.7,0,6v3H32z"/>
+ <path fill="#8C6239" d="M0,9v17c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V9H0z"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<g>
+ <rect x="8" y="16" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="16" height="2"/>
+ <rect x="8" y="12" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="16" height="2"/>
+ <rect x="8" y="8" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="16" height="2"/>
+ <rect x="8" y="20" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="8" height="2"/>
+</g>
+</svg>
diff --git a/application/resources/pe_colored/scalable/patreon.svg b/application/resources/pe_colored/scalable/patreon.svg
new file mode 100644
index 00000000..d3c6d2d5
--- /dev/null
+++ b/application/resources/pe_colored/scalable/patreon.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="-463 265 32 32" enable-background="new -463 265 32 32" xml:space="preserve">
+<rect x="-463" y="265" fill="none" width="32" height="32"/>
+<path fill="#F15A24" d="M-447,265c-8.8,0-16,7.2-16,16v16h15.3c0.2,0,0.4,0,0.7,0c8.8,0,16-7.2,16-16S-438.2,265-447,265L-447,265z"
+ />
+<path fill="#FFFFFF" d="M-447,268.7c-6.8,0-12.3,5.5-12.3,12.3v7.3v5v3.7h4.9v-16c0-4.1,3.3-7.3,7.3-7.3s7.3,3.3,7.3,7.3
+ c0,4.1-3.3,7.3-7.3,7.3c-1.5,0-2.9-0.4-4-1.2v5.3c0.8,0.5,2.5,0.8,4.6,0.8c6.5-0.3,11.7-5.7,11.7-12.3
+ C-434.7,274.2-440.2,268.7-447,268.7L-447,268.7z"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/proxy.svg b/application/resources/pe_colored/scalable/proxy.svg
new file mode 100644
index 00000000..0aee69b7
--- /dev/null
+++ b/application/resources/pe_colored/scalable/proxy.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="-463 265 32 32" enable-background="new -463 265 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#8C6239" d="M-441.1,269h-10.3c-0.8-2.3-3-4-5.6-4c-3.3,0-6,2.7-6,6s2.7,6,6,6
+ c2.6,0,4.8-1.7,5.6-4h10.3c1.1,0,2,0.9,2,2v1.4h4V275C-435.1,271.7-437.8,269-441.1,269z M-457,273c-1.1,0-2-0.9-2-2s0.9-2,2-2
+ c1.1,0,2,0.9,2,2S-455.9,273-457,273z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#754C24" d="M-439.1,285.6v1.4c0,1.1-0.9,2-2,2h-10.3c-0.8-2.3-3-4-5.6-4
+ c-3.3,0-6,2.7-6,6s2.7,6,6,6c2.6,0,4.8-1.7,5.6-4h10.3c3.3,0,6-2.7,6-6v-1.4H-439.1z M-457,293c-1.1,0-2-0.9-2-2s0.9-2,2-2
+ c1.1,0,2,0.9,2,2S-455.9,293-457,293z"/>
+<g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#C1272D" d="M-431,287h-12v-12h12V287z M-435,279h-4v4h4V279z"/>
+</g>
+</svg>
diff --git a/application/resources/pe_colored/scalable/quickmods.svg b/application/resources/pe_colored/scalable/quickmods.svg
new file mode 100644
index 00000000..199b2dae
--- /dev/null
+++ b/application/resources/pe_colored/scalable/quickmods.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<path fill="none" d="M6,28h20c1.1,0,2-0.9,2-2V9V6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v3v17C4,27.1,4.9,28,6,28z"/>
+<path fill="#39B54A" d="M26,0H6C2.7,0,0,2.7,0,6v3h4V6c0-1.1,0.9-2,2-2h20c1.1,0,2,0.9,2,2v3h4V6C32,2.7,29.3,0,26,0z"/>
+<path fill="#8C6239" d="M28,26c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V9H0v17c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V9h-4V26z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#C1272D" d="M10.6,24.2c-0.3,0-0.6-0.1-0.8-0.2C9.3,23.7,9,23.2,9,22.6V9.8
+ c0-0.6,0.3-1.1,0.8-1.4c0.3-0.2,0.5-0.2,0.8-0.2c0.2,0,0.5,0.1,0.7,0.2l12.8,6.4c0.5,0.3,0.9,0.8,0.9,1.4c0,0.6-0.3,1.2-0.9,1.4
+ L11.3,24C11.1,24.1,10.8,24.2,10.6,24.2z"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/refresh.svg b/application/resources/pe_colored/scalable/refresh.svg
new file mode 100644
index 00000000..c2e7e91f
--- /dev/null
+++ b/application/resources/pe_colored/scalable/refresh.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="none" width="32" height="32"/>
+<path fill="#39B54A" d="M31.8,17.4c-0.4-0.9-1.2-1.4-2.1-1.4h-2.3c0-7.6-6.1-13.7-13.7-13.7C6.1,2.3,0,8.4,0,16
+ c0,7.6,6.1,13.7,13.7,13.7c2.5,0,4.8-0.7,6.8-1.8l-3.4-3.4c-1,0.4-2.2,0.7-3.4,0.7c-5,0-9.1-4.1-9.1-9.1s4.1-9.1,9.1-9.1
+ c5.1,0,9.1,4.1,9.1,9.1h-2.3c-0.9,0-1.8,0.6-2.1,1.4c-0.4,0.9-0.2,1.8,0.5,2.5l4.6,4.6c0.4,0.4,1,0.7,1.6,0.7c0.6,0,1.2-0.2,1.6-0.7
+ l4.6-4.6C32,19.2,32.2,18.3,31.8,17.4z"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/resourcepacks.svg b/application/resources/pe_colored/scalable/resourcepacks.svg
new file mode 100644
index 00000000..0318354c
--- /dev/null
+++ b/application/resources/pe_colored/scalable/resourcepacks.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M28,10c0-1.1-0.9-2-2-2H6c-1.1,0-2,0.9-2,2v16c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V10z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#39B54A" d="M26,4h-4V2c0-1.1-0.9-2-2-2h-8c-1.1,0-2,0.9-2,2v2H6
+ C3,4,0.6,6.2,0.1,9h4.2c0.3-0.6,1-1,1.7-1h20c0.7,0,1.4,0.4,1.7,1h4.2C31.4,6.2,29,4,26,4z M20,4h-8V3c0-0.6,0.4-1,1-1h6
+ c0.6,0,1,0.4,1,1V4z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#8C6239" d="M31.9,9h-4.2c0.2,0.3,0.3,0.6,0.3,1v4H4v-4c0-0.4,0.1-0.7,0.3-1
+ H0.1C0,9.3,0,9.7,0,10v16c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V10C32,9.7,32,9.3,31.9,9z M14.3,16h3.4c0.2,0.3,0.3,0.6,0.3,1
+ c0,1.1-0.9,2-2,2s-2-0.9-2-2C14,16.6,14.1,16.3,14.3,16z M26,28H6c-1.1,0-2-0.9-2-2V16h8.1c-0.1,0.3-0.1,0.7-0.1,1c0,2.2,1.8,4,4,4
+ s4-1.8,4-4c0-0.3-0.1-0.7-0.1-1H28v10C28,27.1,27.1,28,26,28z"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/screenshots.svg b/application/resources/pe_colored/scalable/screenshots.svg
new file mode 100644
index 00000000..844fcbaa
--- /dev/null
+++ b/application/resources/pe_colored/scalable/screenshots.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <path fill="#39B54A" d="M26,0H6C2.7,0,0,2.7,0,6v3h32V6C32,2.7,29.3,0,26,0z"/>
+ <path fill="#8C6239" d="M0,26c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V9H0V26z"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#666666" d="M24,26H8c-1.1,0-2-0.9-2-2v-0.7c0.8-1.7,1.5-3.8,2-4.8
+ c1.1-2.4,3.5,3.5,4.9,3.5c2.8,0,6.2-10.7,9.1-7.4c1.4,1.6,2.9,5.8,4,8.4V24C26,25.1,25.1,26,24,26z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F15A24" d="M9,6c1.7,0,3,1.3,3,3c0,1.7-1.3,3-3,3c-1.7,0-3-1.3-3-3
+ C6,7.3,7.3,6,9,6z"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/settings.svg b/application/resources/pe_colored/scalable/settings.svg
new file mode 100644
index 00000000..72032f8a
--- /dev/null
+++ b/application/resources/pe_colored/scalable/settings.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect x="0" y="0" fill="none" width="32" height="32"/>
+<polygon fill="none" points="26,0 6,0 6,0 26,0 "/>
+<path fill="#39B54A" d="M26,0H6C2.7,0,0,2.7,0,6v3h32V6C32,2.7,29.3,0,26,0z"/>
+<path fill="#8C6239" d="M0,26c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V9H0V26z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<rect x="16" y="10" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="8" height="2"/>
+<rect x="8" y="18" fill-rule="evenodd" clip-rule="evenodd" width="6" height="6"/>
+<rect x="10" y="20" fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" width="2" height="2"/>
+<rect x="8" y="8" fill-rule="evenodd" clip-rule="evenodd" width="6" height="6"/>
+<rect x="10" y="10" fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" width="2" height="2"/>
+<rect x="16" y="20" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="8" height="2"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/status-bad.svg b/application/resources/pe_colored/scalable/status-bad.svg
new file mode 100644
index 00000000..bc42c248
--- /dev/null
+++ b/application/resources/pe_colored/scalable/status-bad.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#C1272D" d="M26,32H6c-3.4,0-6-2.6-6-6V6c0-3.4,2.6-6,6-6h20c3.4,0,6,2.6,6,6v20C32,29.2,29.4,32,26,32z"/>
+<path fill="#FFFFFF" d="M21.6,21.6c-0.8,0.8-2,0.8-2.8,0L16,18.8l-2.8,2.8c-0.8,0.8-2,0.8-2.8,0c-0.8-0.8-0.8-2,0-2.8l2.8-2.8
+ l-2.8-2.8c-0.8-0.8-0.8-2,0-2.8c0.8-0.8,2-0.8,2.8,0l2.8,2.8l2.8-2.8c0.8-0.8,2-0.8,2.8,0s0.8,2,0,2.8L18.8,16l2.8,2.8
+ C22.4,19.6,22.4,20.8,21.6,21.6z"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/status-good.svg b/application/resources/pe_colored/scalable/status-good.svg
new file mode 100644
index 00000000..4cfa56f0
--- /dev/null
+++ b/application/resources/pe_colored/scalable/status-good.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <path fill="none" d="M26,0H6C2.6,0,0,2.6,0,6v20c0,3.4,2.6,6,6,6h20c3.4,0,6-2.6,6-6V6C32,2.6,29.4,0,26,0z M28,26c0,1.2-0.8,2-2,2
+ H6c-1.2,0-2-0.8-2-2V6c0-1.2,0.8-2,2-2h20c1.2,0,2,0.8,2,2V26z M21,10.4l-7,7l-2.8-2.8c-0.8-0.8-2-0.8-2.8,0s-0.8,2,0,2.8l4.2,4.2
+ c0.8,0.8,2,0.8,2.8,0l8.4-8.4c0.8-0.8,0.8-2,0-2.8S21.8,9.6,21,10.4z"/>
+</g>
+<path fill="#39B54A" d="M26,0H6C2.6,0,0,2.6,0,6v20c0,3.4,2.6,6,6,6h20c3.4,0,6-2.6,6-6V6C32,2.6,29.4,0,26,0z"/>
+<path fill="#39B54A" d="M28,26c0,1.2-0.8,2-2,2H6c-1.2,0-2-0.8-2-2V6c0-1.2,0.8-2,2-2h20c1.2,0,2,0.8,2,2V26z"/>
+<path fill="#FFFFFF" d="M21,10.4l-7,7l-2.8-2.8c-0.8-0.8-2-0.8-2.8,0s-0.8,2,0,2.8l4.2,4.2c0.8,0.8,2,0.8,2.8,0l8.4-8.4
+ c0.8-0.8,0.8-2,0-2.8S21.8,9.6,21,10.4z"/>
+</svg>
diff --git a/application/resources/pe_colored/scalable/status-yellow.svg b/application/resources/pe_colored/scalable/status-yellow.svg
new file mode 100644
index 00000000..0551fed2
--- /dev/null
+++ b/application/resources/pe_colored/scalable/status-yellow.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <path fill="#E3A333" d="M26,0H6C2.7,0,0,2.7,0,6v20c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V6C32,2.7,29.3,0,26,0z M28,26
+ c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h20c1.1,0,2,0.9,2,2V26z"/>
+</g>
+<path fill="#E3A333" d="M26,0H6C2.7,0,0,2.7,0,6v20c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V6C32,2.7,29.3,0,26,0z"/>
+<path fill="#E3A333" d="M28,26c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h20c1.1,0,2,0.9,2,2V26z"/>
+<g>
+ <path fill="#FFFFFF" d="M6,20c0-5.8,2.4-7.9,5.8-7.9c2,0,3.4,0.7,5.3,1.9c1.6,1,2.5,1.5,3.3,1.5c0.7,0,1.2-0.7,1.3-3.1H26
+ c0.2,6.1-2.3,8-5.5,8c-2,0-3.5-0.8-5.3-1.9c-1.7-1-2.6-1.6-3.3-1.6c-0.8,0-1.4,0.5-1.6,3.2H6z"/>
+</g>
+</svg>
diff --git a/application/resources/pe_colored/scalable/viewfolder.svg b/application/resources/pe_colored/scalable/viewfolder.svg
new file mode 100644
index 00000000..91832577
--- /dev/null
+++ b/application/resources/pe_colored/scalable/viewfolder.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#F2F2F2" d="M28,10c0-1.1-0.9-2-2-2H16V6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V10z"
+ />
+<rect x="0" fill="none" width="32" height="32"/>
+<g>
+ <path fill="none" d="M26,8H16V6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v3v17c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V10
+ c0-0.4-0.1-0.7-0.3-1C27.4,8.4,26.7,8,26,8z"/>
+ <path fill="#39B54A" d="M4,6c0-1.1,0.9-2,2-2h8c1.1,0,2,0.9,2,2v2h10c0.7,0,1.4,0.4,1.7,1h4.2C31.4,6.2,29,4,26,4h-6.4
+ c-0.8-2.3-3-4-5.6-4H6C2.7,0,0,2.7,0,6v3h4V6z"/>
+ <path fill="#8C6239" d="M27.7,9c0.2,0.3,0.3,0.6,0.3,1v16c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V9H0v17c0,3.3,2.7,6,6,6h20
+ c3.3,0,6-2.7,6-6V10c0-0.3,0-0.7-0.1-1H27.7z"/>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/index.theme b/application/resources/pe_dark/index.theme
new file mode 100644
index 00000000..b7d1ad01
--- /dev/null
+++ b/application/resources/pe_dark/index.theme
@@ -0,0 +1,11 @@
+[Icon Theme]
+Name=pe_dark
+Comment=Icons by pexner (dark)
+Inherits=multimc
+Directories=scalable
+
+[scalable]
+Size=48
+Type=Scalable
+MinSize=16
+MaxSize=256
diff --git a/application/resources/pe_dark/pe_dark.qrc b/application/resources/pe_dark/pe_dark.qrc
new file mode 100644
index 00000000..cafc2559
--- /dev/null
+++ b/application/resources/pe_dark/pe_dark.qrc
@@ -0,0 +1,35 @@
+<!DOCTYPE RCC>
+<RCC version="1.0">
+ <qresource prefix="/icons/pe_dark">
+ <file>index.theme</file>
+ <file>scalable/about.svg</file>
+ <file>scalable/accounts.svg</file>
+ <file>scalable/bug.svg</file>
+ <file>scalable/centralmods.svg</file>
+ <file>scalable/checkupdate.svg</file>
+ <file>scalable/copy.svg</file>
+ <file>scalable/coremods.svg</file>
+ <file>scalable/externaltools.svg</file>
+ <file>scalable/instance-settings.svg</file>
+ <file>scalable/jarmods.svg</file>
+ <file>scalable/java.svg</file>
+ <file>scalable/loadermods.svg</file>
+ <file>scalable/log.svg</file>
+ <file>scalable/minecraft.svg</file>
+ <file>scalable/multimc.svg</file>
+ <file>scalable/new.svg</file>
+ <file>scalable/news.svg</file>
+ <file>scalable/notes.svg</file>
+ <file>scalable/patreon.svg</file>
+ <file>scalable/proxy.svg</file>
+ <file>scalable/quickmods.svg</file>
+ <file>scalable/refresh.svg</file>
+ <file>scalable/resourcepacks.svg</file>
+ <file>scalable/screenshots.svg</file>
+ <file>scalable/settings.svg</file>
+ <file>scalable/status-bad.svg</file>
+ <file>scalable/status-good.svg</file>
+ <file>scalable/status-yellow.svg</file>
+ <file>scalable/viewfolder.svg</file>
+ </qresource>
+</RCC>
diff --git a/application/resources/pe_dark/scalable/about.svg b/application/resources/pe_dark/scalable/about.svg
new file mode 100644
index 00000000..e75ea6ca
--- /dev/null
+++ b/application/resources/pe_dark/scalable/about.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <g>
+ <polygon fill="#666666" points="17.8,21 17.8,11.9 11.9,11.9 11.9,14.2 14.2,14.2 14.2,21 11.9,21 11.9,23.3 20.1,23.3 20.1,21
+ "/>
+ <circle fill="#666666" cx="16" cy="8.3" r="1.8"/>
+ </g>
+ <path d="M16,32C7.2,32,0,24.8,0,16C0,7.2,7.2,0,16,0c8.8,0,16,7.2,16,16C32,24.8,24.8,32,16,32L16,32z M16,4C9.4,4,4,9.4,4,16
+ s5.4,12,12,12s12-5.4,12-12S22.6,4,16,4z"/>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/accounts.svg b/application/resources/pe_dark/scalable/accounts.svg
new file mode 100644
index 00000000..6d46b2df
--- /dev/null
+++ b/application/resources/pe_dark/scalable/accounts.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#999999" d="M25.8,17.5c1.4-1.4,2.2-3.4,2.2-5.5V8c0-4.4-3.6-8-8-8
+ c-0.6,0-1.2,0.1-1.8,0.2c1.3,1.1,2.4,2.4,3,4C22.8,4.7,24,6.2,24,8v4c0,1.8-1.2,3.3-2.8,3.8c-0.2,0.4-0.4,0.8-0.6,1.2
+ c1.5,1.2,2.8,2.6,3.7,4.2c1.8,1.1,3.1,2.7,3.6,4.7c0,1.1-0.9,2-2,2h-0.3c-0.4,1.6-1.3,3-2.5,4H26c3.3,0,6-2.7,6-6
+ C31.4,22.3,28.9,19.2,25.8,17.5z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M18,32H6c-3.3,0-6-2.7-6-6l0,0c0.6-3.7,3.1-6.8,6.2-8.5C4.9,16.1,4,14.1,4,12V8
+ c0-4.4,3.6-8,8-8s8,3.6,8,8v4c0,2.1-0.9,4.1-2.2,5.5c3.1,1.7,5.6,4.8,6.2,8.5l0,0C24,29.3,21.3,32,18,32z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M16,12V8c0-2.2-1.8-4-4-4S8,5.8,8,8v4c0,2.2,1.8,4,4,4
+ S16,14.2,16,12z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M20,26c-0.9-3.4-4.3-6-8-6l0,0l0,0c-3.7,0-7.1,2.6-8,6l0,0
+ c0,1.1,0.9,2,2,2h12C19.1,28,20,27.1,20,26L20,26z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/bug.svg b/application/resources/pe_dark/scalable/bug.svg
new file mode 100644
index 00000000..9da71adb
--- /dev/null
+++ b/application/resources/pe_dark/scalable/bug.svg
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect x="0" y="0" fill="none" width="32" height="32"/>
+<g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#666666" d="M22.7,5.3c-0.3-1.2-0.9-2.3-1.8-3.2c-2.7-2.8-7.2-2.8-9.9,0
+ c-0.9,0.9-1.5,2-1.8,3.2C13.5,3.3,18.5,3.3,22.7,5.3z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M30,17.9h-4.1c0-0.7,0.1-1.3,0.1-2c0-0.7,0-1.4-0.1-2c0,0,0,0,0.1,0v0h2
+ c1.1,0,2-0.9,2-2c0-1.1-0.9-2-2-2h-2v0c-0.3,0-0.6,0.1-0.8,0.1c-1.2-3.1-3.9-4.1-9.2-4.1s-7.9,1-9.2,4.1C6.6,9.9,6.3,9.8,6,9.8v0H4
+ c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2h2v0c0,0,0,0,0.1,0c0,0.6-0.1,1.3-0.1,2c0,0.7,0,1.3,0.1,2H2c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2
+ h4.5c0.3,1.4,0.7,2.8,1.2,4H6c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2h2v0c0.7,0,1.4-0.1,2.1-0.3c1.5,1.4,3.4,2.3,5.9,2.3
+ s4.4-0.9,5.9-2.3c0.7,0.2,1.4,0.3,2.1,0.3v0h2c1.1,0,2-0.9,2-2c0-1.1-0.9-2-2-2h-1.7c0.5-1.2,0.9-2.6,1.2-4H30c1.1,0,2-0.9,2-2
+ C32,18.8,31.1,17.9,30,17.9z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/centralmods.svg b/application/resources/pe_dark/scalable/centralmods.svg
new file mode 100644
index 00000000..f3b0c0e4
--- /dev/null
+++ b/application/resources/pe_dark/scalable/centralmods.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="none" width="32" height="32"/>
+<path d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h8c2.6,0,4.8,1.7,5.6,4H26c3.3,0,6,2.7,6,6v16C32,29.3,29.3,32,26,32z M28,10
+ c0-1.1-0.9-2-2-2H16V6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V10z"/>
+<path fill="#666666" d="M16,10.2l2.2,4.5l5,0.7L19.6,19l0.8,4.9L16,21.6l-4.4,2.3l0.8-4.9l-3.6-3.5l5-0.7L16,10.2z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/checkupdate.svg b/application/resources/pe_dark/scalable/checkupdate.svg
new file mode 100644
index 00000000..97585447
--- /dev/null
+++ b/application/resources/pe_dark/scalable/checkupdate.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#666666" d="M26,24h-0.4c0-0.1-0.1-0.2-0.1-0.3c-0.7-1.6-1.5-2.8-3.5-3.4V18c0-3.3-2.7-6-6-6c-3.3,0-6,2.7-6,6v2.3
+ c-2,0.6-2.9,1.8-3.5,3.4c0,0,0,0.1,0,0.1C2.8,23.1,0,19.9,0,16v-2c0-4.4,3.6-8,8-8c0.8,0,1.5,0.1,2.2,0.3C10.9,2.7,14.2,0,18,0
+ c4.4,0,8,3.6,8,8c0,0.7-0.1,1.4-0.3,2c0.1,0,0.2,0,0.3,0c3.3,0,6,2.7,6,6v2C32,21.3,29.3,24,26,24z"/>
+<path d="M12,24h2v-6c0-1.1,0.9-2,2-2c1.1,0,2,0.9,2,2v6h2c0.8,0,1.5,0.5,1.8,1.2c0.1,0.2,0.1,0.4,0.1,0.6c0.1,0.6-0.1,1.2-0.6,1.6
+ l-4,4C17,31.8,16.5,32,16,32c-0.5,0-1-0.2-1.4-0.6l-4-4c-0.4-0.4-0.6-1-0.6-1.6c0-0.2,0.1-0.4,0.1-0.6C10.5,24.5,11.2,24,12,24z"/>
+<rect fill="none" width="32" height="32"/>
+</svg>
diff --git a/application/resources/pe_dark/scalable/copy.svg b/application/resources/pe_dark/scalable/copy.svg
new file mode 100644
index 00000000..8c30ac0b
--- /dev/null
+++ b/application/resources/pe_dark/scalable/copy.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#666666" d="M28,25.6V10c0-3.3-2.7-6-6-6H6.4c0.8-2.3,3-4,5.6-4h14c3.3,0,6,2.7,6,6v14C32,22.6,30.3,24.8,28,25.6z"/>
+<path d="M26,12v14c0,3.3-2.7,6-6,6H6c-3.3,0-6-2.7-6-6V12c0-3.3,2.7-6,6-6h14C23.3,6,26,8.7,26,12z M4,26c0,1.1,0.9,2,2,2h14
+ c1.1,0,2-0.9,2-2V14H4V26z M6,8c-1.1,0-2,0.9-2,2s0.9,2,2,2s2-0.9,2-2S7.1,8,6,8z"/>
+<rect fill="none" width="32" height="32"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/coremods.svg b/application/resources/pe_dark/scalable/coremods.svg
new file mode 100644
index 00000000..1e2eb227
--- /dev/null
+++ b/application/resources/pe_dark/scalable/coremods.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<circle fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" cx="16" cy="16" r="12"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M16,32C7.2,32,0,24.8,0,16C0,7.2,7.2,0,16,0c8.8,0,16,7.2,16,16
+ C32,24.8,24.8,32,16,32z M16,4C9.4,4,4,9.4,4,16c0,6.6,5.4,12,12,12s12-5.4,12-12C28,9.4,22.6,4,16,4z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#666666" d="M16,6l2.9,6l6.6,1l-4.8,4.6l1.1,6.5L16,21l-5.9,3.1l1.1-6.5
+ l-4.8-4.6l6.6-1L16,6z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/externaltools.svg b/application/resources/pe_dark/scalable/externaltools.svg
new file mode 100644
index 00000000..29b45f26
--- /dev/null
+++ b/application/resources/pe_dark/scalable/externaltools.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M6,32h20c3.3,0,6-2.7,6-6V6c0-3.3-2.7-6-6-6h-9.1C17.6,1.2,18,2.6,18,4h8
+ c1.1,0,2,0.9,2,2v20c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2v-4.5l-4-3V26C0,29.3,2.7,32,6,32z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#666666" d="M8.8,17.6C9.2,17.9,9.6,18,10,18c0.3,0,0.6-0.1,0.9-0.2
+ c0.7-0.3,1.1-1,1.1-1.8v-1.9V14c6.3,0,11.7,4.2,13.4,10c0.4-1.3,0.6-2.6,0.6-4c0-7.7-6.3-14-14-14V4c0-0.8-0.4-1.5-1.1-1.8
+ C10.6,2.1,10.3,2,10,2C9.6,2,9.2,2.1,8.8,2.4l-8,6C0.3,8.8,0,9.4,0,10c0,0.6,0.3,1.2,0.8,1.6L8.8,17.6z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/instance-settings.svg b/application/resources/pe_dark/scalable/instance-settings.svg
new file mode 100644
index 00000000..c9f701e7
--- /dev/null
+++ b/application/resources/pe_dark/scalable/instance-settings.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect y="0" fill="none" width="32" height="32"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20
+ C32,29.3,29.3,32,26,32z M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V6z"/>
+<rect x="16" y="10" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="8" height="2"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8,18h6v6H8V18z M10,22h2v-2h-2V22z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8,8h6v6H8V8z M10,12h2v-2h-2V12z"/>
+<rect x="16" y="20" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="8" height="2"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/jarmods.svg b/application/resources/pe_dark/scalable/jarmods.svg
new file mode 100644
index 00000000..cb9a97ba
--- /dev/null
+++ b/application/resources/pe_dark/scalable/jarmods.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20
+ C32,29.3,29.3,32,26,32z"/>
+<path fill="#999999" d="M16.5,0.6l2.2,4.5l5,0.7l-3.6,3.5l0.8,4.9l-4.4-2.3l-4.4,2.3l0.8-4.9L9.4,5.8l5-0.7L16.5,0.6z"/>
+<g>
+ <g>
+ <path fill="#FFFFFF" d="M15.9,24.2c-2.9,0-5.3-0.8-5.5-1.8c-0.1-0.4,0.2-0.9,1.7-1.4l1.3-0.4l-1.2,0.7c-0.1,0.1-0.3,0.2-0.3,0.3
+ c0,0,0.1,0.3,1.2,0.4c1.2,0.1,2.1,0.2,2.8,0.2c1.2,0,2.3-0.1,4.1-0.5l0.1,0l0,0c0,0,0.8,0.5,1.9,0.9l0.4,0.1l-0.3,0.1
+ C19.7,24,17.4,24.2,15.9,24.2z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M15.3,20.4c-3.3,0-5.7-0.6-5.8-1.5c-0.1-0.5,0.6-1,1.9-1.5l0.8-0.3l-0.7,0.5c-0.1,0.1-0.4,0.4-0.4,0.6
+ c0,0.1,0.2,0.3,1.1,0.4c1.3,0.1,2.3,0.2,3.2,0.2c1.7,0,3.4-0.2,5.7-0.6l0.1,0l0.1,0.1c0,0,0.5,0.5,1.3,0.8l0.5,0.2l-0.5,0.1
+ C20.3,20,17.7,20.4,15.3,20.4z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M15.3,27.4C15.3,27.4,15.3,27.4,15.3,27.4c-3.1,0-6.3-0.3-9.4-0.8c-1.2-0.2-1.8-0.5-1.8-1
+ c0.1-1,3.1-2,4.7-2c0.4,0,0.7,0.1,0.9,0.2l0.6,0.4l-0.7-0.1c0,0-0.4-0.1-1.1,0.1c-1.6,0.5-2,0.8-2,0.9c0,0,0,0.1,0.2,0.2
+ c1.4,0.6,4.6,1,8.7,1c4.3,0,8.4-0.4,10.3-1c0.9-0.3,1.1-0.6,1.1-0.7c0-0.2-0.2-0.4-0.2-0.4l-0.9-0.8l1.1,0.5
+ c0.7,0.3,0.8,0.7,0.7,0.9C27.4,26,22.4,27.4,15.3,27.4z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M13.6,16.7c-3,0-6.7-0.3-6.9-1.2c-0.1-0.4,0.5-0.7,0.7-0.8c2.5-1.1,4.6-1.2,5.2-1.2c0.1,0,0.1,0,0.1,0l1,0
+ l-1,0.3c-1.8,0.4-3.4,1.1-3.4,1.4c0,0,0,0.2,1.2,0.4c0.8,0.1,1.9,0.1,3.1,0.1c1.6,0,3.4-0.1,5-0.2c2.5-0.2,5.1-0.7,5.1-0.7
+ l1.3-0.2L23.9,15c0,0-0.9,0.4-1.5,0.8l0,0C20.1,16.4,16.9,16.7,13.6,16.7z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M23.5,20.3v-0.2c0-0.1,0-0.3,0.2-0.3c3.8-2,3.8-3.7,3.7-4.3c-0.2-0.9-1.1-1.4-1.9-1.4c-0.1,0-0.2,0-0.3,0
+ c-0.5,0.1-0.7,0.2-0.7,0.2l-0.5,0.2l0.3-0.5c0,0,0.2-0.3,0.6-0.5c0.4-0.2,0.9-0.2,1.3-0.2c1.5,0,2.7,0.9,2.9,2.2
+ c0.2,1.5-1.1,3.5-5.4,4.7L23.5,20.3z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M16.9,29c-1.2,0-2.4,0-3.5-0.1c-3.8-0.2-4.8-0.8-4.8-1v-0.2l0.2,0c1.8,0.3,4.2,0.5,6.8,0.5
+ c3,0,5.9-0.3,8.4-0.7c4.4-0.9,4.9-1.9,4.9-1.9l0.3-0.8l-0.1,0.9c-0.1,1.2-1.5,2.1-4.1,2.6C22.9,28.7,20.1,29,16.9,29z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/java.svg b/application/resources/pe_dark/scalable/java.svg
new file mode 100644
index 00000000..9e1091fa
--- /dev/null
+++ b/application/resources/pe_dark/scalable/java.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <path id="XMLID_1_" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20C32,29.3,29.3,32,26,32z"/>
+</g>
+<path fill="none" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20C32,29.3,29.3,32,26,32z"/>
+<g>
+ <path fill="#999999" d="M16.7,15.6l1-0.8c0.1-0.1,1.9-1.6,0.4-3.4c-1.3-1.6-1.8-3.1-1.4-4.5c1.1-3.4,7.2-4.9,7.4-5l1-0.2l-0.9,0.5
+ C20.7,4.3,19,5.8,18.8,7c-0.2,0.9,0.4,1.7,1.1,2.7l0.2,0.3c0.5,0.7,0.6,1.4,0.5,2.1C20.2,13.8,18,15,17.9,15L16.7,15.6z"/>
+</g>
+<g>
+ <g>
+ <path fill="#FFFFFF" d="M15.9,24.2c-2.9,0-5.3-0.8-5.5-1.8c-0.1-0.4,0.2-0.9,1.7-1.4l1.3-0.4l-1.2,0.7c-0.1,0.1-0.3,0.2-0.3,0.3
+ c0,0,0.1,0.3,1.2,0.4c1.2,0.1,2.1,0.2,2.8,0.2c1.2,0,2.3-0.1,4.1-0.5l0.1,0l0,0c0,0,0.8,0.5,1.9,0.9l0.4,0.1l-0.3,0.1
+ C19.7,24,17.4,24.2,15.9,24.2z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M15.3,20.4c-3.3,0-5.7-0.6-5.8-1.5c-0.1-0.5,0.6-1,1.9-1.5l0.8-0.3l-0.7,0.5c-0.1,0.1-0.4,0.4-0.4,0.6
+ c0,0.1,0.2,0.3,1.1,0.4c1.3,0.1,2.3,0.2,3.2,0.2c1.7,0,3.4-0.2,5.7-0.6l0.1,0l0.1,0.1c0,0,0.5,0.5,1.3,0.8l0.5,0.2l-0.5,0.1
+ C20.3,20,17.7,20.4,15.3,20.4z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M15.3,27.4C15.3,27.4,15.3,27.4,15.3,27.4c-3.1,0-6.3-0.3-9.4-0.8c-1.2-0.2-1.8-0.5-1.8-1
+ c0.1-1,3.1-2,4.7-2c0.4,0,0.7,0.1,0.9,0.2l0.6,0.4l-0.7-0.1c0,0-0.4-0.1-1.1,0.1c-1.6,0.5-2,0.8-2,0.9c0,0,0,0.1,0.2,0.2
+ c1.4,0.6,4.6,1,8.7,1c4.3,0,8.4-0.4,10.3-1c0.9-0.3,1.1-0.6,1.1-0.7c0-0.2-0.2-0.4-0.2-0.4l-0.9-0.8l1.1,0.5
+ c0.7,0.3,0.8,0.7,0.7,0.9C27.4,26,22.4,27.4,15.3,27.4z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M13.6,16.7c-3,0-6.7-0.3-6.9-1.2c-0.1-0.4,0.5-0.7,0.7-0.8c2.5-1.1,4.6-1.2,5.2-1.2c0.1,0,0.1,0,0.1,0l1,0
+ l-1,0.3c-1.8,0.4-3.4,1.1-3.4,1.4c0,0,0,0.2,1.2,0.4c0.8,0.1,1.9,0.1,3.1,0.1c1.6,0,3.4-0.1,5-0.2c2.5-0.2,5.1-0.7,5.1-0.7
+ l1.3-0.2L23.9,15c0,0-0.9,0.4-1.5,0.8l0,0C20.1,16.4,16.9,16.7,13.6,16.7z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M23.5,20.3v-0.2c0-0.1,0-0.3,0.2-0.3c3.8-2,3.8-3.7,3.7-4.3c-0.2-0.9-1.1-1.4-1.9-1.4c-0.1,0-0.2,0-0.3,0
+ c-0.5,0.1-0.7,0.2-0.7,0.2l-0.5,0.2l0.3-0.5c0,0,0.2-0.3,0.6-0.5c0.4-0.2,0.9-0.2,1.3-0.2c1.5,0,2.7,0.9,2.9,2.2
+ c0.2,1.5-1.1,3.5-5.4,4.7L23.5,20.3z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M16.9,29c-1.2,0-2.4,0-3.5-0.1c-3.8-0.2-4.8-0.8-4.8-1v-0.2l0.2,0c1.8,0.3,4.2,0.5,6.8,0.5
+ c3,0,5.9-0.3,8.4-0.7c4.4-0.9,4.9-1.9,4.9-1.9l0.3-0.8l-0.1,0.9c-0.1,1.2-1.5,2.1-4.1,2.6C22.9,28.7,20.1,29,16.9,29z"/>
+ </g>
+</g>
+<path fill="#999999" d="M16.8,4.2c1.8-1.4,3-2.8,3.7-4.2h-1.7c-0.8,1-1.9,1.8-2.9,2.7c-1.2,1-2.5,2-3.3,3.2c-1.6,2.6,1,5.2,4,8
+ l0.5,0.5l-0.3-0.6c-0.3-0.7-0.7-1.3-1.2-1.9C14.2,9.6,12.7,7.4,16.8,4.2z"/>
+</svg>
diff --git a/application/resources/pe_dark/scalable/loadermods.svg b/application/resources/pe_dark/scalable/loadermods.svg
new file mode 100644
index 00000000..24226a09
--- /dev/null
+++ b/application/resources/pe_dark/scalable/loadermods.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#666666" d="M16,6.4l2.9,6l6.6,1l-4.8,4.6l1.1,6.5L16,21.4l-5.9,3.1l1.1-6.5
+ l-4.8-4.6l6.6-1L16,6.4z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20
+ C32,29.3,29.3,32,26,32z M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V6z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/log.svg b/application/resources/pe_dark/scalable/log.svg
new file mode 100644
index 00000000..68686a7d
--- /dev/null
+++ b/application/resources/pe_dark/scalable/log.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M30,28c-3.1,0.1-8.9,0.7-12.1,2.3C17.8,31.3,17,32,16,32c-1,0-1.8-0.7-1.9-1.7
+ c-3.2-1.6-9-2.2-12.1-2.3c-1.1,0-2-0.9-2-2V2c0-1.1,0.9-2,2-2c0.1,0,0.1,0,0.2,0C16,0.4,16,4,16,4s0-3.6,13.8-4c0.1,0,0.1,0,0.2,0
+ c1.1,0,2,0.9,2,2v24C32,27.1,31.1,28,30,28z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M14,6.3C11.4,5,7.2,4.4,4,4.2v19.9c5.4,0.3,8.4,1.1,10,1.9V6.3z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M28,4.2C24.8,4.4,20.6,5,18,6.3V26c1.6-0.8,4.6-1.6,10-1.9V4.2z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/minecraft.svg b/application/resources/pe_dark/scalable/minecraft.svg
new file mode 100644
index 00000000..01baf575
--- /dev/null
+++ b/application/resources/pe_dark/scalable/minecraft.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill-rule="evenodd" clip-rule="evenodd" fill="none" width="32" height="32"/>
+<g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" points="16,14.2 30,7.1 30,24.9 16,32 "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#666666" points="16,14.2 2,7.1 2,24.9 16,32 "/>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#999999" points="2,7.1 16,14.2 30,7.1 16,0 "/>
+ </g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/multimc.svg b/application/resources/pe_dark/scalable/multimc.svg
new file mode 100644
index 00000000..e4cf7b7f
--- /dev/null
+++ b/application/resources/pe_dark/scalable/multimc.svg
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="#666666" width="32" height="32"/>
+<polygon fill="#999999" points="0,5 1,5 1,4 4,4 4,5 8,5 8,8 9,8 9,2 12,2 12,5 13,5 13,4 16,4 16,8 17,8 17,6 18,6 18,5 20,5 20,8
+ 21,8 21,6 22,6 22,5 24,5 24,4 26,4 26,5 29,5 29,4 32,4 32,0 0,0 "/>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-963.8778" y1="47.5718" x2="-963.0319" y2="49.6501" gradientTransform="matrix(20.79 0 0 14.7315 20048.0879 -696.8257)">
+ <stop offset="0" style="stop-color:#000000;stop-opacity:0.8"/>
+ <stop offset="1" style="stop-color:#000000;stop-opacity:0.35"/>
+</linearGradient>
+<path fill="url(#SVGID_1_)" d="M18.5,21.5c-0.5-0.4-1-1-1.8-1.9c-1,1.2-1.9,2.1-2.8,2.7c-1.1,0.7-2.5,1-4.1,1c-2,0-3.6-0.5-4.9-1.6
+ c-1.4-1.1-2.1-2.6-2.1-4.4c0-1.7,0.7-3.2,2.1-4.4c1.2-1,2.9-1.6,5-1.6c1.1,0,2,0.2,2.8,0.5c0.9,0.3,1.7,0.8,2.3,1.4
+ c0.6,0.5,1.2,1.2,1.8,1.9c1-1.2,1.9-2.1,2.8-2.7c1.1-0.7,2.5-1,4.1-1c2,0,3.6,0.5,4.9,1.6c1.4,1.1,2.1,2.6,2.1,4.4
+ c0,1.7-0.7,3.2-2.1,4.4c-1.2,1-2.9,1.6-5,1.6c-1.1,0-2-0.2-2.8-0.5S19.2,22.1,18.5,21.5 M9.6,21.3c2.4,0,4.3-1.2,5.8-3.7
+ c-1.9-2.7-3.8-4.1-5.8-4.1c-1.5,0-2.6,0.4-3.3,1.1c-0.8,0.8-1.2,1.7-1.2,2.8c0,1.2,0.4,2.1,1.2,2.8C7.1,20.9,8.2,21.3,9.6,21.3
+ M23.9,13.5c-2.2,0-4.1,1.2-5.8,3.7c1.8,2.7,3.8,4.1,5.8,4.1c1.5,0,2.6-0.4,3.3-1.1c0.8-0.8,1.2-1.7,1.2-2.8c0-1.2-0.4-2.1-1.2-2.8
+ C26.3,13.8,25.2,13.5,23.9,13.5"/>
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-964.0289" y1="48.0195" x2="-962.7877" y2="48.9627" gradientTransform="matrix(20.79 0 0 14.7315 20047.7695 -696.964)">
+ <stop offset="0" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#999999;stop-opacity:0.6"/>
+</linearGradient>
+<path fill="url(#SVGID_2_)" d="M17.6,20.1c-0.5-0.4-1-1-1.8-1.9c-1,1.2-1.9,2.1-2.8,2.7c-1.1,0.7-2.5,1-4.1,1c-2,0-3.6-0.5-4.9-1.6
+ c-1.4-1.1-2.1-2.6-2.1-4.4c0-1.7,0.7-3.2,2.1-4.4c1.2-1,2.9-1.6,5-1.6c1.1,0,2,0.2,2.8,0.5c0.9,0.3,1.7,0.8,2.3,1.4
+ c0.6,0.5,1.2,1.2,1.8,1.9c1-1.2,1.9-2.1,2.8-2.7c1.1-0.7,2.5-1,4.1-1c2,0,3.6,0.5,4.9,1.6c1.4,1.1,2.1,2.6,2.1,4.4
+ c0,1.7-0.7,3.2-2.1,4.4c-1.2,1-2.9,1.6-5,1.6c-1.1,0-2-0.2-2.8-0.5C19.2,21.2,18.4,20.8,17.6,20.1 M8.7,19.9c2.4,0,4.3-1.2,5.8-3.7
+ c-1.9-2.7-3.8-4.1-5.8-4.1c-1.5,0-2.6,0.4-3.3,1.1C4.6,14,4.2,14.9,4.2,16c0,1.2,0.4,2.1,1.2,2.8C6.2,19.5,7.3,19.9,8.7,19.9
+ M23,12.1c-2.2,0-4.1,1.2-5.8,3.7c1.8,2.7,3.8,4.1,5.8,4.1c1.5,0,2.6-0.4,3.3-1.1c0.8-0.8,1.2-1.7,1.2-2.8c0-1.2-0.4-2.1-1.2-2.8
+ C25.5,12.5,24.4,12.1,23,12.1"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/new.svg b/application/resources/pe_dark/scalable/new.svg
new file mode 100644
index 00000000..0377aceb
--- /dev/null
+++ b/application/resources/pe_dark/scalable/new.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="none" width="32" height="32"/>
+<path d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20C32,29.3,29.3,32,26,32z M6,2C4.9,2,4,2.9,4,4s0.9,2,2,2
+ s2-0.9,2-2S7.1,2,6,2z M28,8H4v18c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V8z"/>
+<path fill="#666666" d="M20,20h-2v2c0,1.1-0.9,2-2,2s-2-0.9-2-2v-2h-2c-1.1,0-2-0.9-2-2s0.9-2,2-2h2v-2c0-1.1,0.9-2,2-2s2,0.9,2,2v2
+ h2c1.1,0,2,0.9,2,2S21.1,20,20,20z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/news.svg b/application/resources/pe_dark/scalable/news.svg
new file mode 100644
index 00000000..84979dcb
--- /dev/null
+++ b/application/resources/pe_dark/scalable/news.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="none" width="32" height="32"/>
+<g>
+ <g>
+ <path d="M26,0H6C2.6,0,0,2.6,0,6v14c0,3.4,2.6,6,6,6l4,6l4-6h12c3.4,0,6-2.6,6-6V6C32,2.6,29.4,0,26,0z M16,20H6v-2h10V20z M26,16
+ H6v-2h20V16z M26,12H6v-2h20V12z M26,8H6V6h20V8z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/notes.svg b/application/resources/pe_dark/scalable/notes.svg
new file mode 100644
index 00000000..72649721
--- /dev/null
+++ b/application/resources/pe_dark/scalable/notes.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20
+ C32,29.3,29.3,32,26,32z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<g>
+ <rect x="8" y="16" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="16" height="2"/>
+ <rect x="8" y="12" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="16" height="2"/>
+ <rect x="8" y="8" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="16" height="2"/>
+ <rect x="8" y="20" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="8" height="2"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/patreon.svg b/application/resources/pe_dark/scalable/patreon.svg
new file mode 100644
index 00000000..01cb279a
--- /dev/null
+++ b/application/resources/pe_dark/scalable/patreon.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="none" width="32" height="32"/>
+<path fill="#666666" d="M16,0C7.2,0,0,7.2,0,16v16h15.3c0.2,0,0.4,0,0.7,0c8.8,0,16-7.2,16-16S24.8,0,16,0L16,0z"/>
+<path fill="#FFFFFF" d="M16,3.7C9.2,3.7,3.7,9.2,3.7,16v7.3v5V32h4.9V16c0-4.1,3.3-7.3,7.3-7.3s7.3,3.3,7.3,7.3
+ c0,4.1-3.3,7.3-7.3,7.3c-1.5,0-2.9-0.4-4-1.2v5.3c0.8,0.5,2.5,0.8,4.6,0.8C23.1,28,28.3,22.6,28.3,16C28.3,9.2,22.8,3.7,16,3.7
+ L16,3.7z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/proxy.svg b/application/resources/pe_dark/scalable/proxy.svg
new file mode 100644
index 00000000..98bcfac1
--- /dev/null
+++ b/application/resources/pe_dark/scalable/proxy.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M21.9,4H11.6c-0.8-2.3-3-4-5.6-4C2.7,0,0,2.7,0,6s2.7,6,6,6c2.6,0,4.8-1.7,5.6-4
+ h10.3c1.1,0,2,0.9,2,2v1.4h4V10C27.9,6.7,25.2,4,21.9,4z M6,8C4.9,8,4,7.1,4,6s0.9-2,2-2c1.1,0,2,0.9,2,2S7.1,8,6,8z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M23.9,20.6V22c0,1.1-0.9,2-2,2H11.6c-0.8-2.3-3-4-5.6-4c-3.3,0-6,2.7-6,6
+ s2.7,6,6,6c2.6,0,4.8-1.7,5.6-4h10.3c3.3,0,6-2.7,6-6v-1.4H23.9z M6,28c-1.1,0-2-0.9-2-2s0.9-2,2-2c1.1,0,2,0.9,2,2S7.1,28,6,28z"/>
+<g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#666666" d="M32,22H20V10h12V22z M28,14h-4v4h4V14z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/quickmods.svg b/application/resources/pe_dark/scalable/quickmods.svg
new file mode 100644
index 00000000..346729f1
--- /dev/null
+++ b/application/resources/pe_dark/scalable/quickmods.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20
+ C32,29.3,29.3,32,26,32z M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V6z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#666666" d="M10.6,24.2c-0.3,0-0.6-0.1-0.8-0.2C9.3,23.7,9,23.2,9,22.6V9.8
+ c0-0.6,0.3-1.1,0.8-1.4c0.3-0.2,0.5-0.2,0.8-0.2c0.2,0,0.5,0.1,0.7,0.2l12.8,6.4c0.5,0.3,0.9,0.8,0.9,1.4c0,0.6-0.3,1.2-0.9,1.4
+ L11.3,24C11.1,24.1,10.8,24.2,10.6,24.2z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/refresh.svg b/application/resources/pe_dark/scalable/refresh.svg
new file mode 100644
index 00000000..c227cd6c
--- /dev/null
+++ b/application/resources/pe_dark/scalable/refresh.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="none" width="32" height="32"/>
+<path d="M31.8,17.4c-0.4-0.9-1.2-1.4-2.1-1.4h-2.3c0-7.6-6.1-13.7-13.7-13.7C6.1,2.3,0,8.4,0,16c0,7.6,6.1,13.7,13.7,13.7
+ c2.5,0,4.8-0.7,6.8-1.8l-3.4-3.4c-1,0.4-2.2,0.7-3.4,0.7c-5,0-9.1-4.1-9.1-9.1s4.1-9.1,9.1-9.1c5.1,0,9.1,4.1,9.1,9.1h-2.3
+ c-0.9,0-1.8,0.6-2.1,1.4c-0.4,0.9-0.2,1.8,0.5,2.5l4.6,4.6c0.4,0.4,1,0.7,1.6,0.7c0.6,0,1.2-0.2,1.6-0.7l4.6-4.6
+ C32,19.2,32.2,18.3,31.8,17.4z"/>
+</svg>
diff --git a/application/resources/pe_dark/scalable/resourcepacks.svg b/application/resources/pe_dark/scalable/resourcepacks.svg
new file mode 100644
index 00000000..0db2beb1
--- /dev/null
+++ b/application/resources/pe_dark/scalable/resourcepacks.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M28,10c0-1.1-0.9-2-2-2H6c-1.1,0-2,0.9-2,2v16c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V10z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M26,4h-4V2c0-1.1-0.9-2-2-2h-8c-1.1,0-2,0.9-2,2v2H6c-3.3,0-6,2.7-6,6v16
+ c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V10C32,6.7,29.3,4,26,4z M12,3c0-0.6,0.4-1,1-1h6c0.6,0,1,0.4,1,1v1h-8V3z M6,8h20
+ c1.1,0,2,0.9,2,2v4H4v-4C4,8.9,4.9,8,6,8z M18,17c0,1.1-0.9,2-2,2s-2-0.9-2-2c0-0.4,0.1-0.7,0.3-1h3.4C17.9,16.3,18,16.6,18,17z
+ M26,28H6c-1.1,0-2-0.9-2-2V16h8.1c-0.1,0.3-0.1,0.7-0.1,1c0,2.2,1.8,4,4,4s4-1.8,4-4c0-0.3-0.1-0.7-0.1-1H28v10
+ C28,27.1,27.1,28,26,28z"/>
+</svg>
diff --git a/application/resources/pe_dark/scalable/screenshots.svg b/application/resources/pe_dark/scalable/screenshots.svg
new file mode 100644
index 00000000..2803b9aa
--- /dev/null
+++ b/application/resources/pe_dark/scalable/screenshots.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20
+ C32,29.3,29.3,32,26,32z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#666666" d="M24,26H8c-1.1,0-2-0.9-2-2v-0.7c0.8-1.7,1.5-3.8,2-4.8
+ c1.1-2.4,3.5,3.5,4.9,3.5c2.8,0,6.2-10.7,9.1-7.4c1.4,1.6,2.9,5.8,4,8.4V24C26,25.1,25.1,26,24,26z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#999999" d="M9,6c1.7,0,3,1.3,3,3c0,1.7-1.3,3-3,3c-1.7,0-3-1.3-3-3
+ C6,7.3,7.3,6,9,6z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/settings.svg b/application/resources/pe_dark/scalable/settings.svg
new file mode 100644
index 00000000..c9f701e7
--- /dev/null
+++ b/application/resources/pe_dark/scalable/settings.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect y="0" fill="none" width="32" height="32"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20
+ C32,29.3,29.3,32,26,32z M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V6z"/>
+<rect x="16" y="10" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="8" height="2"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8,18h6v6H8V18z M10,22h2v-2h-2V22z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8,8h6v6H8V8z M10,12h2v-2h-2V12z"/>
+<rect x="16" y="20" fill-rule="evenodd" clip-rule="evenodd" fill="#666666" width="8" height="2"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/status-bad.svg b/application/resources/pe_dark/scalable/status-bad.svg
new file mode 100644
index 00000000..f455965a
--- /dev/null
+++ b/application/resources/pe_dark/scalable/status-bad.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path d="M26,32H6c-3.4,0-6-2.6-6-6V6c0-3.4,2.6-6,6-6h20c3.4,0,6,2.6,6,6v20C32,29.4,29.4,32,26,32z"/>
+<path fill="#FFFFFF" d="M21.6,21.4c-0.8,0.8-2,0.8-2.8,0L16,18.6l-2.8,2.8c-0.8,0.8-2,0.8-2.8,0c-0.8-0.8-0.8-2,0-2.8l2.8-2.8
+ L10.4,13c-0.8-0.8-0.8-2,0-2.8c0.8-0.8,2-0.8,2.8,0L16,13l2.8-2.8c0.8-0.8,2-0.8,2.8,0s0.8,2,0,2.8l-2.8,2.8l2.8,2.8
+ C22.4,19.4,22.4,20.6,21.6,21.4z"/>
+</svg>
diff --git a/application/resources/pe_dark/scalable/status-good.svg b/application/resources/pe_dark/scalable/status-good.svg
new file mode 100644
index 00000000..4ba91f2d
--- /dev/null
+++ b/application/resources/pe_dark/scalable/status-good.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="none" d="M26,0H6C2.6,0,0,2.6,0,6v20c0,3.4,2.6,6,6,6h20c3.4,0,6-2.6,6-6V6C32,2.6,29.4,0,26,0z"/>
+<path fill="none" d="M21,10.4l-7,7l-2.8-2.8c-0.8-0.8-2-0.8-2.8,0s-0.8,2,0,2.8l4.2,4.2c0.8,0.8,2,0.8,2.8,0l8.4-8.4
+ c0.8-0.8,0.8-2,0-2.8S21.8,9.6,21,10.4z"/>
+<path d="M26,0H6C2.6,0,0,2.6,0,6v20c0,3.4,2.6,6,6,6h20c3.4,0,6-2.6,6-6V6C32,2.6,29.4,0,26,0z"/>
+<path fill="#FFFFFF" d="M21,10.4l-7,7l-2.8-2.8c-0.8-0.8-2-0.8-2.8,0s-0.8,2,0,2.8l4.2,4.2c0.8,0.8,2,0.8,2.8,0l8.4-8.4
+ c0.8-0.8,0.8-2,0-2.8S21.8,9.6,21,10.4z"/>
+</svg>
diff --git a/application/resources/pe_dark/scalable/status-yellow.svg b/application/resources/pe_dark/scalable/status-yellow.svg
new file mode 100644
index 00000000..69133817
--- /dev/null
+++ b/application/resources/pe_dark/scalable/status-yellow.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <path fill="#E3A333" d="M26,0H6C2.7,0,0,2.7,0,6v20c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V6C32,2.7,29.3,0,26,0z M28,26
+ c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h20c1.1,0,2,0.9,2,2V26z"/>
+</g>
+<path d="M26,0H6C2.7,0,0,2.7,0,6v20c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V6C32,2.7,29.3,0,26,0z"/>
+<path d="M28,26c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h20c1.1,0,2,0.9,2,2V26z"/>
+<g>
+ <path fill="#FFFFFF" d="M6,20c0-5.8,2.4-7.9,5.8-7.9c2,0,3.4,0.7,5.3,1.9c1.6,1,2.5,1.5,3.3,1.5c0.7,0,1.2-0.7,1.3-3.1H26
+ c0.2,6.1-2.3,8-5.5,8c-2,0-3.5-0.8-5.3-1.9c-1.7-1-2.6-1.6-3.3-1.6c-0.8,0-1.4,0.5-1.6,3.2H6z"/>
+</g>
+</svg>
diff --git a/application/resources/pe_dark/scalable/viewfolder.svg b/application/resources/pe_dark/scalable/viewfolder.svg
new file mode 100644
index 00000000..3af36240
--- /dev/null
+++ b/application/resources/pe_dark/scalable/viewfolder.svg
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect y="0" fill="none" width="32" height="32"/>
+<path d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h8c2.6,0,4.8,1.7,5.6,4H26c3.3,0,6,2.7,6,6v16C32,29.3,29.3,32,26,32z M28,10
+ c0-1.1-0.9-2-2-2H16V6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V10z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/index.theme b/application/resources/pe_light/index.theme
new file mode 100644
index 00000000..c106acc8
--- /dev/null
+++ b/application/resources/pe_light/index.theme
@@ -0,0 +1,11 @@
+[Icon Theme]
+Name=pe_light
+Comment=Icons by pexner (light)
+Inherits=multimc
+Directories=scalable
+
+[scalable]
+Size=48
+Type=Scalable
+MinSize=16
+MaxSize=256
diff --git a/application/resources/pe_light/pe_light.qrc b/application/resources/pe_light/pe_light.qrc
new file mode 100644
index 00000000..53d0890b
--- /dev/null
+++ b/application/resources/pe_light/pe_light.qrc
@@ -0,0 +1,36 @@
+<!DOCTYPE RCC>
+<RCC version="1.0">
+ <qresource prefix="/icons/pe_light">
+ <file>index.theme</file>
+ <file>scalable/about.svg</file>
+ <file>scalable/accounts.svg</file>
+ <file>scalable/bug.svg</file>
+ <file>scalable/centralmods.svg</file>
+ <file>scalable/checkupdate.svg</file>
+ <file>scalable/copy.svg</file>
+ <file>scalable/coremods.svg</file>
+ <file>scalable/externaltools.svg</file>
+ <file>scalable/instance-settings.svg</file>
+ <file>scalable/jarmods.svg</file>
+ <file>scalable/java.svg</file>
+ <file>scalable/loadermods.svg</file>
+ <file>scalable/log.svg</file>
+ <file>scalable/minecraft.svg</file>
+ <file>scalable/multimc.svg</file>
+ <file>scalable/new.svg</file>
+ <file>scalable/news.svg</file>
+ <file>scalable/notes.svg</file>
+ <file>scalable/patreon.svg</file>
+ <file>scalable/proxy.svg</file>
+ <file>scalable/quickmods.svg</file>
+ <file>scalable/refresh.svg</file>
+ <file>scalable/resourcepacks.svg</file>
+ <file>scalable/screenshots.svg</file>
+ <file>scalable/settings.svg</file>
+ <file>scalable/status-bad.svg</file>
+ <file>scalable/status-good.svg</file>
+ <file>scalable/status-yellow.svg</file>
+ <file>scalable/viewfolder.svg</file>
+ </qresource>
+</RCC>
+
diff --git a/application/resources/pe_light/scalable/about.svg b/application/resources/pe_light/scalable/about.svg
new file mode 100644
index 00000000..8d00c32e
--- /dev/null
+++ b/application/resources/pe_light/scalable/about.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <g>
+ <polygon fill="#F2F2F2" points="17.8,21 17.8,11.9 11.9,11.9 11.9,14.2 14.2,14.2 14.2,21 11.9,21 11.9,23.3 20.1,23.3 20.1,21
+ "/>
+ <circle fill="#F2F2F2" cx="16" cy="8.3" r="1.8"/>
+ </g>
+ <path fill="#F2F2F2" d="M16,32C7.2,32,0,24.8,0,16C0,7.2,7.2,0,16,0c8.8,0,16,7.2,16,16C32,24.8,24.8,32,16,32L16,32z M16,4
+ C9.4,4,4,9.4,4,16s5.4,12,12,12s12-5.4,12-12S22.6,4,16,4z"/>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/accounts.svg b/application/resources/pe_light/scalable/accounts.svg
new file mode 100644
index 00000000..3a092d03
--- /dev/null
+++ b/application/resources/pe_light/scalable/accounts.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#999999" d="M25.8,17.5c1.4-1.4,2.2-3.4,2.2-5.5V8c0-4.4-3.6-8-8-8
+ c-0.6,0-1.2,0.1-1.8,0.2c1.3,1.1,2.4,2.4,3,4C22.8,4.7,24,6.2,24,8v4c0,1.8-1.2,3.3-2.8,3.8c-0.2,0.4-0.4,0.8-0.6,1.2
+ c1.5,1.2,2.8,2.6,3.7,4.2c1.8,1.1,3.1,2.7,3.6,4.7c0,1.1-0.9,2-2,2h-0.3c-0.4,1.6-1.3,3-2.5,4H26c3.3,0,6-2.7,6-6
+ C31.4,22.3,28.9,19.2,25.8,17.5z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M18,32H6c-3.3,0-6-2.7-6-6l0,0c0.6-3.7,3.1-6.8,6.2-8.5
+ C4.9,16.1,4,14.1,4,12V8c0-4.4,3.6-8,8-8s8,3.6,8,8v4c0,2.1-0.9,4.1-2.2,5.5c3.1,1.7,5.6,4.8,6.2,8.5l0,0C24,29.3,21.3,32,18,32z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#4D4D4D" d="M16,12V8c0-2.2-1.8-4-4-4S8,5.8,8,8v4c0,2.2,1.8,4,4,4
+ S16,14.2,16,12z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#4D4D4D" d="M20,26c-0.9-3.4-4.3-6-8-6l0,0l0,0c-3.7,0-7.1,2.6-8,6l0,0
+ c0,1.1,0.9,2,2,2h12C19.1,28,20,27.1,20,26L20,26z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/bug.svg b/application/resources/pe_light/scalable/bug.svg
new file mode 100644
index 00000000..ccb64bc5
--- /dev/null
+++ b/application/resources/pe_light/scalable/bug.svg
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect x="0" fill="none" width="32" height="32"/>
+<g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#CCCCCC" d="M22.7,5.3c-0.3-1.2-0.9-2.3-1.8-3.2c-2.7-2.8-7.2-2.8-9.9,0
+ c-0.9,0.9-1.5,2-1.8,3.2C13.5,3.3,18.5,3.3,22.7,5.3z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M30,17.9h-4.1c0-0.7,0.1-1.3,0.1-2c0-0.7,0-1.4-0.1-2
+ c0,0,0,0,0.1,0v0h2c1.1,0,2-0.9,2-2c0-1.1-0.9-2-2-2h-2v0c-0.3,0-0.6,0.1-0.8,0.1c-1.2-3.1-3.9-4.1-9.2-4.1s-7.9,1-9.2,4.1
+ C6.6,9.9,6.3,9.8,6,9.8v0H4c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2h2v0c0,0,0,0,0.1,0c0,0.6-0.1,1.3-0.1,2c0,0.7,0,1.3,0.1,2H2
+ c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2h4.5c0.3,1.4,0.7,2.8,1.2,4H6c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2h2v0c0.7,0,1.4-0.1,2.1-0.3
+ c1.5,1.4,3.4,2.3,5.9,2.3s4.4-0.9,5.9-2.3c0.7,0.2,1.4,0.3,2.1,0.3v0h2c1.1,0,2-0.9,2-2c0-1.1-0.9-2-2-2h-1.7
+ c0.5-1.2,0.9-2.6,1.2-4H30c1.1,0,2-0.9,2-2C32,18.8,31.1,17.9,30,17.9z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/centralmods.svg b/application/resources/pe_light/scalable/centralmods.svg
new file mode 100644
index 00000000..050fdc58
--- /dev/null
+++ b/application/resources/pe_light/scalable/centralmods.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="none" width="32" height="32"/>
+<path fill="#F2F2F2" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h8c2.6,0,4.8,1.7,5.6,4H26c3.3,0,6,2.7,6,6v16
+ C32,29.3,29.3,32,26,32z M28,10c0-1.1-0.9-2-2-2H16V6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V10z
+ "/>
+<path fill="#CCCCCC" d="M16,10.2l2.2,4.5l5,0.7L19.6,19l0.8,4.9L16,21.6l-4.4,2.3l0.8-4.9l-3.6-3.5l5-0.7L16,10.2z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/checkupdate.svg b/application/resources/pe_light/scalable/checkupdate.svg
new file mode 100644
index 00000000..08b8dcd5
--- /dev/null
+++ b/application/resources/pe_light/scalable/checkupdate.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#CCCCCC" d="M26,24h-0.4c0-0.1-0.1-0.2-0.1-0.3c-0.7-1.6-1.5-2.8-3.5-3.4V18c0-3.3-2.7-6-6-6c-3.3,0-6,2.7-6,6v2.3
+ c-2,0.6-2.9,1.8-3.5,3.4c0,0,0,0.1,0,0.1C2.8,23.1,0,19.9,0,16v-2c0-4.4,3.6-8,8-8c0.8,0,1.5,0.1,2.2,0.3C10.9,2.7,14.2,0,18,0
+ c4.4,0,8,3.6,8,8c0,0.7-0.1,1.4-0.3,2c0.1,0,0.2,0,0.3,0c3.3,0,6,2.7,6,6v2C32,21.3,29.3,24,26,24z"/>
+<path fill="#F2F2F2" d="M12,24h2v-6c0-1.1,0.9-2,2-2c1.1,0,2,0.9,2,2v6h2c0.8,0,1.5,0.5,1.8,1.2c0.1,0.2,0.1,0.4,0.1,0.6
+ c0.1,0.6-0.1,1.2-0.6,1.6l-4,4C17,31.8,16.5,32,16,32c-0.5,0-1-0.2-1.4-0.6l-4-4c-0.4-0.4-0.6-1-0.6-1.6c0-0.2,0.1-0.4,0.1-0.6
+ C10.5,24.5,11.2,24,12,24z"/>
+<rect fill="none" width="32" height="32"/>
+</svg>
diff --git a/application/resources/pe_light/scalable/copy.svg b/application/resources/pe_light/scalable/copy.svg
new file mode 100644
index 00000000..abdcce09
--- /dev/null
+++ b/application/resources/pe_light/scalable/copy.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#CCCCCC" d="M28,25.6V10c0-3.3-2.7-6-6-6H6.4c0.8-2.3,3-4,5.6-4h14c3.3,0,6,2.7,6,6v14C32,22.6,30.3,24.8,28,25.6z"/>
+<path fill="#F2F2F2" d="M26,12v14c0,3.3-2.7,6-6,6H6c-3.3,0-6-2.7-6-6V12c0-3.3,2.7-6,6-6h14C23.3,6,26,8.7,26,12z M4,26
+ c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V14H4V26z M6,8c-1.1,0-2,0.9-2,2s0.9,2,2,2s2-0.9,2-2S7.1,8,6,8z"/>
+<rect fill="none" width="32" height="32"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/coremods.svg b/application/resources/pe_light/scalable/coremods.svg
new file mode 100644
index 00000000..c8fb0eb9
--- /dev/null
+++ b/application/resources/pe_light/scalable/coremods.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<circle fill-rule="evenodd" clip-rule="evenodd" fill="#4D4D4D" cx="16" cy="16" r="12"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M16,32C7.2,32,0,24.8,0,16C0,7.2,7.2,0,16,0c8.8,0,16,7.2,16,16
+ C32,24.8,24.8,32,16,32z M16,4C9.4,4,4,9.4,4,16c0,6.6,5.4,12,12,12s12-5.4,12-12C28,9.4,22.6,4,16,4z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M16,6l2.9,6l6.6,1l-4.8,4.6l1.1,6.5L16,21l-5.9,3.1l1.1-6.5
+ l-4.8-4.6l6.6-1L16,6z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/externaltools.svg b/application/resources/pe_light/scalable/externaltools.svg
new file mode 100644
index 00000000..4d232bcf
--- /dev/null
+++ b/application/resources/pe_light/scalable/externaltools.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M6,32h20c3.3,0,6-2.7,6-6V6c0-3.3-2.7-6-6-6h-9.1
+ C17.6,1.2,18,2.6,18,4h8c1.1,0,2,0.9,2,2v20c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2v-4.5l-4-3V26C0,29.3,2.7,32,6,32z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M8.8,17.6C9.2,17.9,9.6,18,10,18c0.3,0,0.6-0.1,0.9-0.2
+ c0.7-0.3,1.1-1,1.1-1.8v-1.9V14c6.3,0,11.7,4.2,13.4,10c0.4-1.3,0.6-2.6,0.6-4c0-7.7-6.3-14-14-14V4c0-0.8-0.4-1.5-1.1-1.8
+ C10.6,2.1,10.3,2,10,2C9.6,2,9.2,2.1,8.8,2.4l-8,6C0.3,8.8,0,9.4,0,10c0,0.6,0.3,1.2,0.8,1.6L8.8,17.6z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/instance-settings.svg b/application/resources/pe_light/scalable/instance-settings.svg
new file mode 100644
index 00000000..83b92a52
--- /dev/null
+++ b/application/resources/pe_light/scalable/instance-settings.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect y="0" fill="none" width="32" height="32"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6
+ v20C32,29.3,29.3,32,26,32z M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V6z"/>
+<rect x="16" y="10" fill-rule="evenodd" clip-rule="evenodd" fill="#CCCCCC" width="8" height="2"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M8,18h6v6H8V18z M10,22h2v-2h-2V22z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M8,8h6v6H8V8z M10,12h2v-2h-2V12z"/>
+<rect x="16" y="20" fill-rule="evenodd" clip-rule="evenodd" fill="#CCCCCC" width="8" height="2"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/jarmods.svg b/application/resources/pe_light/scalable/jarmods.svg
new file mode 100644
index 00000000..9852c805
--- /dev/null
+++ b/application/resources/pe_light/scalable/jarmods.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6
+ v20C32,29.3,29.3,32,26,32z"/>
+<path fill="#4D4D4D" d="M16.5,0.6l2.2,4.5l5,0.7l-3.6,3.5l0.8,4.9l-4.4-2.3l-4.4,2.3l0.8-4.9L9.4,5.8l5-0.7L16.5,0.6z"/>
+<g>
+ <g>
+ <path fill="#666666" d="M15.9,24.2c-2.9,0-5.3-0.8-5.5-1.8c-0.1-0.4,0.2-0.9,1.7-1.4l1.3-0.4l-1.2,0.7c-0.1,0.1-0.3,0.2-0.3,0.3
+ c0,0,0.1,0.3,1.2,0.4c1.2,0.1,2.1,0.2,2.8,0.2c1.2,0,2.3-0.1,4.1-0.5l0.1,0l0,0c0,0,0.8,0.5,1.9,0.9l0.4,0.1l-0.3,0.1
+ C19.7,24,17.4,24.2,15.9,24.2z"/>
+ </g>
+ <g>
+ <path fill="#666666" d="M15.3,20.4c-3.3,0-5.7-0.6-5.8-1.5c-0.1-0.5,0.6-1,1.9-1.5l0.8-0.3l-0.7,0.5c-0.1,0.1-0.4,0.4-0.4,0.6
+ c0,0.1,0.2,0.3,1.1,0.4c1.3,0.1,2.3,0.2,3.2,0.2c1.7,0,3.4-0.2,5.7-0.6l0.1,0l0.1,0.1c0,0,0.5,0.5,1.3,0.8l0.5,0.2l-0.5,0.1
+ C20.3,20,17.7,20.4,15.3,20.4z"/>
+ </g>
+ <g>
+ <path fill="#666666" d="M15.3,27.4C15.3,27.4,15.3,27.4,15.3,27.4c-3.1,0-6.3-0.3-9.4-0.8c-1.2-0.2-1.8-0.5-1.8-1
+ c0.1-1,3.1-2,4.7-2c0.4,0,0.7,0.1,0.9,0.2l0.6,0.4l-0.7-0.1c0,0-0.4-0.1-1.1,0.1c-1.6,0.5-2,0.8-2,0.9c0,0,0,0.1,0.2,0.2
+ c1.4,0.6,4.6,1,8.7,1c4.3,0,8.4-0.4,10.3-1c0.9-0.3,1.1-0.6,1.1-0.7c0-0.2-0.2-0.4-0.2-0.4l-0.9-0.8l1.1,0.5
+ c0.7,0.3,0.8,0.7,0.7,0.9C27.4,26,22.4,27.4,15.3,27.4z"/>
+ </g>
+ <g>
+ <path fill="#666666" d="M13.6,16.7c-3,0-6.7-0.3-6.9-1.2c-0.1-0.4,0.5-0.7,0.7-0.8c2.5-1.1,4.6-1.2,5.2-1.2c0.1,0,0.1,0,0.1,0l1,0
+ l-1,0.3c-1.8,0.4-3.4,1.1-3.4,1.4c0,0,0,0.2,1.2,0.4c0.8,0.1,1.9,0.1,3.1,0.1c1.6,0,3.4-0.1,5-0.2c2.5-0.2,5.1-0.7,5.1-0.7
+ l1.3-0.2L23.9,15c0,0-0.9,0.4-1.5,0.8l0,0C20.1,16.4,16.9,16.7,13.6,16.7z"/>
+ </g>
+ <g>
+ <path fill="#666666" d="M23.5,20.3v-0.2c0-0.1,0-0.3,0.2-0.3c3.8-2,3.8-3.7,3.7-4.3c-0.2-0.9-1.1-1.4-1.9-1.4c-0.1,0-0.2,0-0.3,0
+ c-0.5,0.1-0.7,0.2-0.7,0.2l-0.5,0.2l0.3-0.5c0,0,0.2-0.3,0.6-0.5c0.4-0.2,0.9-0.2,1.3-0.2c1.5,0,2.7,0.9,2.9,2.2
+ c0.2,1.5-1.1,3.5-5.4,4.7L23.5,20.3z"/>
+ </g>
+ <g>
+ <path fill="#666666" d="M16.9,29c-1.2,0-2.4,0-3.5-0.1c-3.8-0.2-4.8-0.8-4.8-1v-0.2l0.2,0c1.8,0.3,4.2,0.5,6.8,0.5
+ c3,0,5.9-0.3,8.4-0.7c4.4-0.9,4.9-1.9,4.9-1.9l0.3-0.8l-0.1,0.9c-0.1,1.2-1.5,2.1-4.1,2.6C22.9,28.7,20.1,29,16.9,29z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/java.svg b/application/resources/pe_light/scalable/java.svg
new file mode 100644
index 00000000..0584058a
--- /dev/null
+++ b/application/resources/pe_light/scalable/java.svg
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <path id="XMLID_2_" fill="#F2F2F2" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20C32,29.3,29.3,32,26,32z"
+ />
+</g>
+<path fill="none" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20C32,29.3,29.3,32,26,32z"/>
+<g>
+ <path fill="#4D4D4D" d="M16.7,15.6l1-0.8c0.1-0.1,1.9-1.6,0.4-3.4c-1.3-1.6-1.8-3.1-1.4-4.5c1.1-3.4,7.2-4.9,7.4-5l1-0.2l-0.9,0.5
+ C20.7,4.3,19,5.8,18.8,7c-0.2,0.9,0.4,1.7,1.1,2.7l0.2,0.3c0.5,0.7,0.6,1.4,0.5,2.1C20.2,13.8,18,15,17.9,15L16.7,15.6z"/>
+</g>
+<g>
+ <g>
+ <path fill="#666666" d="M15.9,24.2c-2.9,0-5.3-0.8-5.5-1.8c-0.1-0.4,0.2-0.9,1.7-1.4l1.3-0.4l-1.2,0.7c-0.1,0.1-0.3,0.2-0.3,0.3
+ c0,0,0.1,0.3,1.2,0.4c1.2,0.1,2.1,0.2,2.8,0.2c1.2,0,2.3-0.1,4.1-0.5l0.1,0l0,0c0,0,0.8,0.5,1.9,0.9l0.4,0.1l-0.3,0.1
+ C19.7,24,17.4,24.2,15.9,24.2z"/>
+ </g>
+ <g>
+ <path fill="#666666" d="M15.3,20.4c-3.3,0-5.7-0.6-5.8-1.5c-0.1-0.5,0.6-1,1.9-1.5l0.8-0.3l-0.7,0.5c-0.1,0.1-0.4,0.4-0.4,0.6
+ c0,0.1,0.2,0.3,1.1,0.4c1.3,0.1,2.3,0.2,3.2,0.2c1.7,0,3.4-0.2,5.7-0.6l0.1,0l0.1,0.1c0,0,0.5,0.5,1.3,0.8l0.5,0.2l-0.5,0.1
+ C20.3,20,17.7,20.4,15.3,20.4z"/>
+ </g>
+ <g>
+ <path fill="#666666" d="M15.3,27.4C15.3,27.4,15.3,27.4,15.3,27.4c-3.1,0-6.3-0.3-9.4-0.8c-1.2-0.2-1.8-0.5-1.8-1
+ c0.1-1,3.1-2,4.7-2c0.4,0,0.7,0.1,0.9,0.2l0.6,0.4l-0.7-0.1c0,0-0.4-0.1-1.1,0.1c-1.6,0.5-2,0.8-2,0.9c0,0,0,0.1,0.2,0.2
+ c1.4,0.6,4.6,1,8.7,1c4.3,0,8.4-0.4,10.3-1c0.9-0.3,1.1-0.6,1.1-0.7c0-0.2-0.2-0.4-0.2-0.4l-0.9-0.8l1.1,0.5
+ c0.7,0.3,0.8,0.7,0.7,0.9C27.4,26,22.4,27.4,15.3,27.4z"/>
+ </g>
+ <g>
+ <path fill="#666666" d="M13.6,16.7c-3,0-6.7-0.3-6.9-1.2c-0.1-0.4,0.5-0.7,0.7-0.8c2.5-1.1,4.6-1.2,5.2-1.2c0.1,0,0.1,0,0.1,0l1,0
+ l-1,0.3c-1.8,0.4-3.4,1.1-3.4,1.4c0,0,0,0.2,1.2,0.4c0.8,0.1,1.9,0.1,3.1,0.1c1.6,0,3.4-0.1,5-0.2c2.5-0.2,5.1-0.7,5.1-0.7
+ l1.3-0.2L23.9,15c0,0-0.9,0.4-1.5,0.8l0,0C20.1,16.4,16.9,16.7,13.6,16.7z"/>
+ </g>
+ <g>
+ <path fill="#666666" d="M23.5,20.3v-0.2c0-0.1,0-0.3,0.2-0.3c3.8-2,3.8-3.7,3.7-4.3c-0.2-0.9-1.1-1.4-1.9-1.4c-0.1,0-0.2,0-0.3,0
+ c-0.5,0.1-0.7,0.2-0.7,0.2l-0.5,0.2l0.3-0.5c0,0,0.2-0.3,0.6-0.5c0.4-0.2,0.9-0.2,1.3-0.2c1.5,0,2.7,0.9,2.9,2.2
+ c0.2,1.5-1.1,3.5-5.4,4.7L23.5,20.3z"/>
+ </g>
+ <g>
+ <path fill="#666666" d="M16.9,29c-1.2,0-2.4,0-3.5-0.1c-3.8-0.2-4.8-0.8-4.8-1v-0.2l0.2,0c1.8,0.3,4.2,0.5,6.8,0.5
+ c3,0,5.9-0.3,8.4-0.7c4.4-0.9,4.9-1.9,4.9-1.9l0.3-0.8l-0.1,0.9c-0.1,1.2-1.5,2.1-4.1,2.6C22.9,28.7,20.1,29,16.9,29z"/>
+ </g>
+</g>
+<path fill="#4D4D4D" d="M16.8,4.2c1.8-1.4,3-2.8,3.7-4.2h-1.7c-0.8,1-1.9,1.8-2.9,2.7c-1.2,1-2.5,2-3.3,3.2c-1.6,2.6,1,5.2,4,8
+ l0.5,0.5l-0.3-0.6c-0.3-0.7-0.7-1.3-1.2-1.9C14.2,9.6,12.7,7.4,16.8,4.2z"/>
+</svg>
diff --git a/application/resources/pe_light/scalable/loadermods.svg b/application/resources/pe_light/scalable/loadermods.svg
new file mode 100644
index 00000000..913c1968
--- /dev/null
+++ b/application/resources/pe_light/scalable/loadermods.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#4D4D4D" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M16,6.4l2.9,6l6.6,1l-4.8,4.6l1.1,6.5L16,21.4l-5.9,3.1l1.1-6.5
+ l-4.8-4.6l6.6-1L16,6.4z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6
+ v20C32,29.3,29.3,32,26,32z M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V6z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/log.svg b/application/resources/pe_light/scalable/log.svg
new file mode 100644
index 00000000..82282ca4
--- /dev/null
+++ b/application/resources/pe_light/scalable/log.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M30,28c-3.1,0.1-8.9,0.7-12.1,2.3C17.8,31.3,17,32,16,32
+ c-1,0-1.8-0.7-1.9-1.7c-3.2-1.6-9-2.2-12.1-2.3c-1.1,0-2-0.9-2-2V2c0-1.1,0.9-2,2-2c0.1,0,0.1,0,0.2,0C16,0.4,16,4,16,4
+ s0-3.6,13.8-4c0.1,0,0.1,0,0.2,0c1.1,0,2,0.9,2,2v24C32,27.1,31.1,28,30,28z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#4D4D4D" d="M14,6.3C11.4,5,7.2,4.4,4,4.2v19.9c5.4,0.3,8.4,1.1,10,1.9V6.3z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#4D4D4D" d="M28,4.2C24.8,4.4,20.6,5,18,6.3V26c1.6-0.8,4.6-1.6,10-1.9V4.2z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/minecraft.svg b/application/resources/pe_light/scalable/minecraft.svg
new file mode 100644
index 00000000..d772111f
--- /dev/null
+++ b/application/resources/pe_light/scalable/minecraft.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill-rule="evenodd" clip-rule="evenodd" fill="none" width="32" height="32"/>
+<g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#999999" points="16,14.2 30,7.1 30,24.9 16,32 "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#CCCCCC" points="16,14.2 2,7.1 2,24.9 16,32 "/>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" points="2,7.1 16,14.2 30,7.1 16,0 "/>
+ </g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/multimc.svg b/application/resources/pe_light/scalable/multimc.svg
new file mode 100644
index 00000000..8b2cb631
--- /dev/null
+++ b/application/resources/pe_light/scalable/multimc.svg
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="#999999" width="32" height="32"/>
+<polygon fill="#F2F2F2" points="0,5 1,5 1,4 4,4 4,5 8,5 8,8 9,8 9,2 12,2 12,5 13,5 13,4 16,4 16,8 17,8 17,6 18,6 18,5 20,5 20,8
+ 21,8 21,6 22,6 22,5 24,5 24,4 26,4 26,5 29,5 29,4 32,4 32,0 0,0 "/>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="2.8" y1="17.35" x2="30.7" y2="17.35">
+ <stop offset="0" style="stop-color:#000000;stop-opacity:0.8"/>
+ <stop offset="1" style="stop-color:#000000;stop-opacity:0.35"/>
+</linearGradient>
+<path fill="url(#SVGID_1_)" d="M18.5,21.5c-0.5-0.4-1-1-1.8-1.9c-1,1.2-1.9,2.1-2.8,2.7c-1.1,0.7-2.5,1-4.1,1c-2,0-3.6-0.5-4.9-1.6
+ c-1.4-1.1-2.1-2.6-2.1-4.4c0-1.7,0.7-3.2,2.1-4.4c1.2-1,2.9-1.6,5-1.6c1.1,0,2,0.2,2.8,0.5c0.9,0.3,1.7,0.8,2.3,1.4
+ c0.6,0.5,1.2,1.2,1.8,1.9c1-1.2,1.9-2.1,2.8-2.7c1.1-0.7,2.5-1,4.1-1c2,0,3.6,0.5,4.9,1.6c1.4,1.1,2.1,2.6,2.1,4.4
+ c0,1.7-0.7,3.2-2.1,4.4c-1.2,1-2.9,1.6-5,1.6c-1.1,0-2-0.2-2.8-0.5S19.2,22.1,18.5,21.5 M9.6,21.3c2.4,0,4.3-1.2,5.8-3.7
+ c-1.9-2.7-3.8-4.1-5.8-4.1c-1.5,0-2.6,0.4-3.3,1.1c-0.8,0.8-1.2,1.7-1.2,2.8c0,1.2,0.4,2.1,1.2,2.8C7.1,20.9,8.2,21.3,9.6,21.3
+ M23.9,13.5c-2.2,0-4.1,1.2-5.8,3.7c1.8,2.7,3.8,4.1,5.8,4.1c1.5,0,2.6-0.4,3.3-1.1c0.8-0.8,1.2-1.7,1.2-2.8c0-1.2-0.4-2.1-1.2-2.8
+ C26.3,13.8,25.2,13.5,23.9,13.5"/>
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-964.0289" y1="48.0195" x2="-962.7877" y2="48.9627" gradientTransform="matrix(20.79 0 0 14.7315 20047.7695 -696.964)">
+ <stop offset="0" style="stop-color:#CCCCCC"/>
+ <stop offset="1" style="stop-color:#F2F2F2;stop-opacity:0.6"/>
+</linearGradient>
+<path fill="url(#SVGID_2_)" d="M17.6,20.1c-0.5-0.4-1-1-1.8-1.9c-1,1.2-1.9,2.1-2.8,2.7c-1.1,0.7-2.5,1-4.1,1c-2,0-3.6-0.5-4.9-1.6
+ c-1.4-1.1-2.1-2.6-2.1-4.4c0-1.7,0.7-3.2,2.1-4.4c1.2-1,2.9-1.6,5-1.6c1.1,0,2,0.2,2.8,0.5c0.9,0.3,1.7,0.8,2.3,1.4
+ c0.6,0.5,1.2,1.2,1.8,1.9c1-1.2,1.9-2.1,2.8-2.7c1.1-0.7,2.5-1,4.1-1c2,0,3.6,0.5,4.9,1.6c1.4,1.1,2.1,2.6,2.1,4.4
+ c0,1.7-0.7,3.2-2.1,4.4c-1.2,1-2.9,1.6-5,1.6c-1.1,0-2-0.2-2.8-0.5C19.2,21.2,18.4,20.8,17.6,20.1 M8.7,19.9c2.4,0,4.3-1.2,5.8-3.7
+ c-1.9-2.7-3.8-4.1-5.8-4.1c-1.5,0-2.6,0.4-3.3,1.1C4.6,14,4.2,14.9,4.2,16c0,1.2,0.4,2.1,1.2,2.8C6.2,19.5,7.3,19.9,8.7,19.9
+ M23,12.1c-2.2,0-4.1,1.2-5.8,3.7c1.8,2.7,3.8,4.1,5.8,4.1c1.5,0,2.6-0.4,3.3-1.1c0.8-0.8,1.2-1.7,1.2-2.8c0-1.2-0.4-2.1-1.2-2.8
+ C25.5,12.5,24.4,12.1,23,12.1"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/new.svg b/application/resources/pe_light/scalable/new.svg
new file mode 100644
index 00000000..96fd1f5b
--- /dev/null
+++ b/application/resources/pe_light/scalable/new.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="none" width="32" height="32"/>
+<path fill="#F2F2F2" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6v20C32,29.3,29.3,32,26,32z M6,2
+ C4.9,2,4,2.9,4,4s0.9,2,2,2s2-0.9,2-2S7.1,2,6,2z M28,8H4v18c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V8z"/>
+<path fill="#CCCCCC" d="M20,20h-2v2c0,1.1-0.9,2-2,2s-2-0.9-2-2v-2h-2c-1.1,0-2-0.9-2-2s0.9-2,2-2h2v-2c0-1.1,0.9-2,2-2s2,0.9,2,2v2
+ h2c1.1,0,2,0.9,2,2S21.1,20,20,20z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/news.svg b/application/resources/pe_light/scalable/news.svg
new file mode 100644
index 00000000..6f184afc
--- /dev/null
+++ b/application/resources/pe_light/scalable/news.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M26,0H6C2.7,0,0,2.7,0,6v14c0,3.3,2.7,6,6,6l4,6l4-6h12
+ c3.3,0,6-2.7,6-6V6C32,2.7,29.3,0,26,0z M16,20H6v-2h10V20z M26,16H6v-2h20V16z M26,12H6v-2h20V12z M26,8H6V6h20V8z"/>
+ </g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/notes.svg b/application/resources/pe_light/scalable/notes.svg
new file mode 100644
index 00000000..02dc11ec
--- /dev/null
+++ b/application/resources/pe_light/scalable/notes.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6
+ v20C32,29.3,29.3,32,26,32z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#4D4D4D" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<g>
+ <rect x="8" y="16" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="16" height="2"/>
+ <rect x="8" y="12" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="16" height="2"/>
+ <rect x="8" y="8" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="16" height="2"/>
+ <rect x="8" y="20" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="8" height="2"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/patreon.svg b/application/resources/pe_light/scalable/patreon.svg
new file mode 100644
index 00000000..0bd08826
--- /dev/null
+++ b/application/resources/pe_light/scalable/patreon.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="none" width="32" height="32"/>
+<path fill="#F2F2F2" d="M16,0C7.2,0,0,7.2,0,16v16h15.3c0.2,0,0.4,0,0.7,0c8.8,0,16-7.2,16-16S24.8,0,16,0L16,0z"/>
+<path d="M16,3.7C9.2,3.7,3.7,9.2,3.7,16v7.3v5V32h4.9V16c0-4.1,3.3-7.3,7.3-7.3s7.3,3.3,7.3,7.3c0,4.1-3.3,7.3-7.3,7.3
+ c-1.5,0-2.9-0.4-4-1.2v5.3c0.8,0.5,2.5,0.8,4.6,0.8C23.1,28,28.3,22.6,28.3,16C28.3,9.2,22.8,3.7,16,3.7L16,3.7z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/proxy.svg b/application/resources/pe_light/scalable/proxy.svg
new file mode 100644
index 00000000..9de8d6d1
--- /dev/null
+++ b/application/resources/pe_light/scalable/proxy.svg
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M21.9,4H11.6c-0.8-2.3-3-4-5.6-4C2.7,0,0,2.7,0,6s2.7,6,6,6
+ c2.6,0,4.8-1.7,5.6-4h10.3c1.1,0,2,0.9,2,2v1.4h4V10C27.9,6.7,25.2,4,21.9,4z M6,8C4.9,8,4,7.1,4,6s0.9-2,2-2c1.1,0,2,0.9,2,2
+ S7.1,8,6,8z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M23.9,20.6V22c0,1.1-0.9,2-2,2H11.6c-0.8-2.3-3-4-5.6-4
+ c-3.3,0-6,2.7-6,6s2.7,6,6,6c2.6,0,4.8-1.7,5.6-4h10.3c3.3,0,6-2.7,6-6v-1.4H23.9z M6,28c-1.1,0-2-0.9-2-2s0.9-2,2-2
+ c1.1,0,2,0.9,2,2S7.1,28,6,28z"/>
+<g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#999999" d="M32,22H20V10h12V22z M28,14h-4v4h4V14z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/quickmods.svg b/application/resources/pe_light/scalable/quickmods.svg
new file mode 100644
index 00000000..6dbeab52
--- /dev/null
+++ b/application/resources/pe_light/scalable/quickmods.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#4D4D4D" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6
+ v20C32,29.3,29.3,32,26,32z M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V6z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M10.6,24.2c-0.3,0-0.6-0.1-0.8-0.2C9.3,23.7,9,23.2,9,22.6V9.8
+ c0-0.6,0.3-1.1,0.8-1.4c0.3-0.2,0.5-0.2,0.8-0.2c0.2,0,0.5,0.1,0.7,0.2l12.8,6.4c0.5,0.3,0.9,0.8,0.9,1.4c0,0.6-0.3,1.2-0.9,1.4
+ L11.3,24C11.1,24.1,10.8,24.2,10.6,24.2z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/refresh.svg b/application/resources/pe_light/scalable/refresh.svg
new file mode 100644
index 00000000..9a724d91
--- /dev/null
+++ b/application/resources/pe_light/scalable/refresh.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="none" width="32" height="32"/>
+<path fill="#F2F2F2" d="M31.8,17.4c-0.4-0.9-1.2-1.4-2.1-1.4h-2.3c0-7.6-6.1-13.7-13.7-13.7C6.1,2.3,0,8.4,0,16
+ c0,7.6,6.1,13.7,13.7,13.7c2.5,0,4.8-0.7,6.8-1.8l-3.4-3.4c-1,0.4-2.2,0.7-3.4,0.7c-5,0-9.1-4.1-9.1-9.1s4.1-9.1,9.1-9.1
+ c5.1,0,9.1,4.1,9.1,9.1h-2.3c-0.9,0-1.8,0.6-2.1,1.4c-0.4,0.9-0.2,1.8,0.5,2.5l4.6,4.6c0.4,0.4,1,0.7,1.6,0.7c0.6,0,1.2-0.2,1.6-0.7
+ l4.6-4.6C32,19.2,32.2,18.3,31.8,17.4z"/>
+</svg>
diff --git a/application/resources/pe_light/scalable/resourcepacks.svg b/application/resources/pe_light/scalable/resourcepacks.svg
new file mode 100644
index 00000000..7d6323f2
--- /dev/null
+++ b/application/resources/pe_light/scalable/resourcepacks.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#4D4D4D" d="M28,10c0-1.1-0.9-2-2-2H6c-1.1,0-2,0.9-2,2v16c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V10z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M26,4h-4V2c0-1.1-0.9-2-2-2h-8c-1.1,0-2,0.9-2,2v2H6
+ c-3.3,0-6,2.7-6,6v16c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V10C32,6.7,29.3,4,26,4z M12,3c0-0.6,0.4-1,1-1h6c0.6,0,1,0.4,1,1v1h-8V3z
+ M6,8h20c1.1,0,2,0.9,2,2v4H4v-4C4,8.9,4.9,8,6,8z M18,17c0,1.1-0.9,2-2,2s-2-0.9-2-2c0-0.4,0.1-0.7,0.3-1h3.4
+ C17.9,16.3,18,16.6,18,17z M26,28H6c-1.1,0-2-0.9-2-2V16h8.1c-0.1,0.3-0.1,0.7-0.1,1c0,2.2,1.8,4,4,4s4-1.8,4-4c0-0.3-0.1-0.7-0.1-1
+ H28v10C28,27.1,27.1,28,26,28z"/>
+</svg>
diff --git a/application/resources/pe_light/scalable/screenshots.svg b/application/resources/pe_light/scalable/screenshots.svg
new file mode 100644
index 00000000..f2887be6
--- /dev/null
+++ b/application/resources/pe_light/scalable/screenshots.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6
+ v20C32,29.3,29.3,32,26,32z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#4D4D4D" d="M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20
+ c1.1,0,2-0.9,2-2V6z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M24,26H8c-1.1,0-2-0.9-2-2v-0.7c0.8-1.7,1.5-3.8,2-4.8
+ c1.1-2.4,3.5,3.5,4.9,3.5c2.8,0,6.2-10.7,9.1-7.4c1.4,1.6,2.9,5.8,4,8.4V24C26,25.1,25.1,26,24,26z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#CCCCCC" d="M9,6c1.7,0,3,1.3,3,3c0,1.7-1.3,3-3,3c-1.7,0-3-1.3-3-3
+ C6,7.3,7.3,6,9,6z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/settings.svg b/application/resources/pe_light/scalable/settings.svg
new file mode 100644
index 00000000..83b92a52
--- /dev/null
+++ b/application/resources/pe_light/scalable/settings.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect y="0" fill="none" width="32" height="32"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#F2F2F2" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h20c3.3,0,6,2.7,6,6
+ v20C32,29.3,29.3,32,26,32z M28,6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V6z"/>
+<rect x="16" y="10" fill-rule="evenodd" clip-rule="evenodd" fill="#CCCCCC" width="8" height="2"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M8,18h6v6H8V18z M10,22h2v-2h-2V22z"/>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M8,8h6v6H8V8z M10,12h2v-2h-2V12z"/>
+<rect x="16" y="20" fill-rule="evenodd" clip-rule="evenodd" fill="#CCCCCC" width="8" height="2"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/status-bad.svg b/application/resources/pe_light/scalable/status-bad.svg
new file mode 100644
index 00000000..2c24970c
--- /dev/null
+++ b/application/resources/pe_light/scalable/status-bad.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="#F2F2F2" d="M26,32H6c-3.4,0-6-2.6-6-6V6c0-3.4,2.6-6,6-6h20c3.4,0,6,2.6,6,6v20C32,29.4,29.4,32,26,32z"/>
+<path fill="#4D4D4D" d="M21.6,21.6c-0.8,0.8-2,0.8-2.8,0L16,18.8l-2.8,2.8c-0.8,0.8-2,0.8-2.8,0c-0.8-0.8-0.8-2,0-2.8l2.8-2.8
+ l-2.8-2.8c-0.8-0.8-0.8-2,0-2.8c0.8-0.8,2-0.8,2.8,0l2.8,2.8l2.8-2.8c0.8-0.8,2-0.8,2.8,0s0.8,2,0,2.8L18.8,16l2.8,2.8
+ C22.4,19.6,22.4,20.8,21.6,21.6z"/>
+</svg>
diff --git a/application/resources/pe_light/scalable/status-good.svg b/application/resources/pe_light/scalable/status-good.svg
new file mode 100644
index 00000000..bf9a4174
--- /dev/null
+++ b/application/resources/pe_light/scalable/status-good.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<path fill="none" d="M26,0H6C2.6,0,0,2.6,0,6v20c0,3.4,2.6,6,6,6h20c3.4,0,6-2.6,6-6V6C32,2.6,29.4,0,26,0z"/>
+<path fill="none" d="M21,10.4l-7,7l-2.8-2.8c-0.8-0.8-2-0.8-2.8,0s-0.8,2,0,2.8l4.2,4.2c0.8,0.8,2,0.8,2.8,0l8.4-8.4
+ c0.8-0.8,0.8-2,0-2.8S21.8,9.6,21,10.4z"/>
+<path fill="#F2F2F2" d="M26,0H6C2.6,0,0,2.6,0,6v20c0,3.4,2.6,6,6,6h20c3.4,0,6-2.6,6-6V6C32,2.6,29.4,0,26,0z"/>
+<path fill="#4D4D4D" d="M21,10.4l-7,7l-2.8-2.8c-0.8-0.8-2-0.8-2.8,0s-0.8,2,0,2.8l4.2,4.2c0.8,0.8,2,0.8,2.8,0l8.4-8.4
+ c0.8-0.8,0.8-2,0-2.8S21.8,9.6,21,10.4z"/>
+</svg>
diff --git a/application/resources/pe_light/scalable/status-yellow.svg b/application/resources/pe_light/scalable/status-yellow.svg
new file mode 100644
index 00000000..f7d2236b
--- /dev/null
+++ b/application/resources/pe_light/scalable/status-yellow.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g>
+ <path fill="#E3A333" d="M26,0H6C2.7,0,0,2.7,0,6v20c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V6C32,2.7,29.3,0,26,0z M28,26
+ c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h20c1.1,0,2,0.9,2,2V26z"/>
+</g>
+<path fill="#F2F2F2" d="M26,0H6C2.7,0,0,2.7,0,6v20c0,3.3,2.7,6,6,6h20c3.3,0,6-2.7,6-6V6C32,2.7,29.3,0,26,0z"/>
+<path fill="#F2F2F2" d="M28,26c0,1.1-0.9,2-2,2H6c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h20c1.1,0,2,0.9,2,2V26z"/>
+<g>
+ <path fill="#4D4D4D" d="M6,20c0-5.8,2.4-7.9,5.8-7.9c2,0,3.4,0.7,5.3,1.9c1.6,1,2.5,1.5,3.3,1.5c0.7,0,1.2-0.7,1.3-3.1H26
+ c0.2,6.1-2.3,8-5.5,8c-2,0-3.5-0.8-5.3-1.9c-1.7-1-2.6-1.6-3.3-1.6c-0.8,0-1.4,0.5-1.6,3.2H6z"/>
+</g>
+</svg>
diff --git a/application/resources/pe_light/scalable/viewfolder.svg b/application/resources/pe_light/scalable/viewfolder.svg
new file mode 100644
index 00000000..b36343fe
--- /dev/null
+++ b/application/resources/pe_light/scalable/viewfolder.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<rect fill="none" width="32" height="32"/>
+<path fill="#F2F2F2" d="M26,32H6c-3.3,0-6-2.7-6-6V6c0-3.3,2.7-6,6-6h8c2.6,0,4.8,1.7,5.6,4H26c3.3,0,6,2.7,6,6v16
+ C32,29.3,29.3,32,26,32z M28,10c0-1.1-0.9-2-2-2H16V6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V10z
+ "/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/application/resources/sources/clucker.svg b/application/resources/sources/clucker.svg
new file mode 100644
index 00000000..0c1727eb
--- /dev/null
+++ b/application/resources/sources/clucker.svg
@@ -0,0 +1,404 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="clucker.svg"
+ inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/chicken128.png"
+ inkscape:export-xdpi="360"
+ inkscape:export-ydpi="360">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4008">
+ <stop
+ id="stop4010"
+ offset="0"
+ style="stop-color:#4a0000;stop-opacity:1;" />
+ <stop
+ id="stop4012"
+ offset="1"
+ style="stop-color:#360000;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3945">
+ <stop
+ id="stop3947"
+ offset="0"
+ style="stop-color:#4e300d;stop-opacity:1;" />
+ <stop
+ id="stop3949"
+ offset="1"
+ style="stop-color:#604000;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3939">
+ <stop
+ id="stop3941"
+ offset="0"
+ style="stop-color:#5b2400;stop-opacity:1;" />
+ <stop
+ id="stop3943"
+ offset="1"
+ style="stop-color:#8d3800;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3838">
+ <stop
+ style="stop-color:#af6c1d;stop-opacity:1;"
+ offset="0"
+ id="stop3840" />
+ <stop
+ style="stop-color:#604000;stop-opacity:1;"
+ offset="1"
+ id="stop3842" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3830">
+ <stop
+ style="stop-color:#ff7f2a;stop-opacity:1;"
+ offset="0"
+ id="stop3832" />
+ <stop
+ style="stop-color:#8d3800;stop-opacity:1"
+ offset="1"
+ id="stop3834" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3820">
+ <stop
+ style="stop-color:#ff0000;stop-opacity:1;"
+ offset="0"
+ id="stop3822" />
+ <stop
+ style="stop-color:#360000;stop-opacity:1"
+ offset="1"
+ id="stop3824" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter3816"
+ x="-0.22469135"
+ width="1.4493827"
+ y="-0.16851852"
+ height="1.337037">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.6851852"
+ id="feGaussianBlur3818" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3820"
+ id="linearGradient3828"
+ x1="12.904698"
+ y1="1043.2582"
+ x2="19.445436"
+ y2="1052.4506"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-1,5.2165626e-5)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3820"
+ id="linearGradient3909"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.125,-2,911.19195)"
+ x1="12.904698"
+ y1="1043.2582"
+ x2="19.445436"
+ y2="1052.4506" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3820"
+ id="linearGradient3911"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-2,1.0000522)"
+ x1="12.904698"
+ y1="1043.2582"
+ x2="19.445436"
+ y2="1052.4506" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4008"
+ id="linearGradient3915"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.125,0,0,1,16.5,1.0000522)"
+ x1="12.904698"
+ y1="1043.2582"
+ x2="19.445436"
+ y2="1052.4506" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3820"
+ id="linearGradient4032"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-25,-2.9999652)"
+ x1="12.904698"
+ y1="1043.2582"
+ x2="19.445436"
+ y2="1052.4506" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4008"
+ id="linearGradient4034"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.125,0,0,1,-6.5,-2.9999652)"
+ x1="12.904698"
+ y1="1043.2582"
+ x2="19.445436"
+ y2="1052.4506" />
+ <filter
+ inkscape:collect="always"
+ id="filter4053"
+ x="-0.12098765"
+ width="1.2419753"
+ y="-0.090740741"
+ height="1.1814815">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.058642"
+ id="feGaussianBlur4055" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3830"
+ id="linearGradient3840"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.70710371,1032.3713,730.70724)"
+ x1="13.258252"
+ y1="1033.889"
+ x2="17.500893"
+ y2="1041.7556" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3830"
+ id="linearGradient3846"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-4,3.0000194)"
+ x1="13.258252"
+ y1="1033.889"
+ x2="17.500893"
+ y2="1041.7556" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3838"
+ id="linearGradient3849"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-4,3.0000194)"
+ x1="14.142136"
+ y1="1038.0433"
+ x2="18.119612"
+ y2="1047.1473" />
+ <filter
+ inkscape:collect="always"
+ id="filter3879">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.42040957"
+ id="feGaussianBlur3881" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter3850">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.04"
+ id="feGaussianBlur3852" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter3854">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.04"
+ id="feGaussianBlur3856" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.313708"
+ inkscape:cx="2.6058272"
+ inkscape:cy="11.408405"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1614"
+ inkscape:window-height="1030"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="4"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1020.3622)">
+ <path
+ style="opacity:0.87866109;fill:#070707;fill-opacity:1;stroke:none;filter:url(#filter4053)"
+ d="m 10,1023.3622 -3,3 0,20 4,0 0,5 8,0 1,-1 0,-4 5,0 3,-3 0,-20 -18,0 z"
+ id="path4022"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3806"
+ d="m 6.1703915,1025.53 0,4 0,16 5.0000005,0 0,4 8,0 0,-4 5,0 0,-16 0,-4 -18.0000005,0 z"
+ style="opacity:0.75313804;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter3816)" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path3861"
+ d="m 23,1025.3622 4,-3 0,20 -3,3 -1,-1 z"
+ style="fill:#6c6c6c;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#e2e2e2;fill-opacity:1;stroke:none"
+ d="m 6,1025.3622 3,-3 18,0 -3,3 0,20 -18,0 z"
+ id="rect3858"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <rect
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ id="rect3759"
+ width="4"
+ height="4"
+ x="7"
+ y="1029.3622" />
+ <rect
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ id="rect3761"
+ width="4"
+ height="4"
+ x="19"
+ y="1029.3622" />
+ <rect
+ style="fill:url(#linearGradient3828);fill-opacity:1;stroke:none"
+ id="rect3769"
+ width="8"
+ height="8"
+ x="11"
+ y="1041.3622" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter3854)"
+ id="rect3773"
+ width="1"
+ height="1"
+ x="9"
+ y="1030.3622" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter3850)"
+ id="rect3775"
+ width="1"
+ height="1"
+ x="21"
+ y="1030.3622" />
+ <path
+ style="fill:url(#linearGradient3911);fill-opacity:1;stroke:none"
+ d="m 10,1042.3622 8,0 0,8 -8,0 z"
+ id="rect3902"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3907"
+ d="m 11,1041.3622 8,0 -1,1 -8,0 z"
+ style="fill:url(#linearGradient3909);fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3913"
+ d="m 18,1042.3622 1,-1 0,8 -1,1 z"
+ style="fill:url(#linearGradient3915);fill-opacity:1;stroke:none"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ d="m 9,1022.3622 18,0 -3,3 -18,0 z"
+ id="rect4019"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:url(#linearGradient3846);fill-opacity:1;stroke:none"
+ d="m 3.9999995,1036.3622 3.0000005,-3 16,0 0,8 -3,3 -16,0 z"
+ id="rect3815"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <rect
+ style="fill:#b34f0e;fill-opacity:1;stroke:none;opacity:1"
+ id="rect3851"
+ width="4.2426286"
+ height="4.0000043"
+ x="28.284193"
+ y="1056.3621"
+ transform="matrix(0.70710873,-0.70710483,0,1,0,0)" />
+ <rect
+ style="fill:#8d5910;fill-opacity:1;stroke:none;opacity:1"
+ id="rect3855"
+ width="4.2426286"
+ height="4"
+ x="28.284189"
+ y="1060.3621"
+ transform="matrix(0.70710883,-0.70710473,0,1,0,0)" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3970"
+ d="m 20,1036.3622 c 0,1 0,6 0,7 -3,0 -11.0351165,-0.059 -15.5,0.7502 l 1.230393,1.1835 15.5625,-0.094 2.707107,-2.8397 0,-4 0,-4 -1,-1 z"
+ style="opacity:0.63598326;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter3879)"
+ sodipodi:nodetypes="cccccccccc" />
+ <rect
+ y="1040.3622"
+ x="3.9999995"
+ height="4"
+ width="16"
+ id="rect3917"
+ style="fill:url(#linearGradient3849);fill-opacity:1;stroke:none" />
+ <rect
+ y="1036.3622"
+ x="3.9999995"
+ height="4"
+ width="16"
+ id="rect3923"
+ style="fill:url(#linearGradient3846);fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:url(#linearGradient3840);fill-opacity:1;stroke:none"
+ id="rect3931"
+ width="16.000004"
+ height="4.242579"
+ x="1040.3712"
+ y="1461.4012"
+ transform="matrix(1,0,-0.70710986,0.7071037,0,0)" />
+ </g>
+</svg>
diff --git a/application/resources/sources/creeper.svg b/application/resources/sources/creeper.svg
new file mode 100644
index 00000000..2a2e39b6
--- /dev/null
+++ b/application/resources/sources/creeper.svg
@@ -0,0 +1,775 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="creeper.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient3917">
+ <stop
+ id="stop3919"
+ offset="0"
+ style="stop-color:#115008;stop-opacity:1;" />
+ <stop
+ style="stop-color:#39c228;stop-opacity:1;"
+ offset="0.49999952"
+ id="stop3921" />
+ <stop
+ id="stop3923"
+ offset="1"
+ style="stop-color:#c7f7c2;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3892">
+ <stop
+ style="stop-color:#1a1a1a;stop-opacity:1;"
+ offset="0"
+ id="stop3894" />
+ <stop
+ style="stop-color:#1a1a1a;stop-opacity:0;"
+ offset="1"
+ id="stop3896" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3871">
+ <stop
+ style="stop-color:#115008;stop-opacity:1;"
+ offset="0"
+ id="stop3873" />
+ <stop
+ id="stop3900"
+ offset="0.5"
+ style="stop-color:#39c228;stop-opacity:1;" />
+ <stop
+ style="stop-color:#c7f7c2;stop-opacity:1;"
+ offset="1"
+ id="stop3875" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter3867">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.792"
+ id="feGaussianBlur3869" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3892"
+ id="linearGradient3898"
+ x1="16"
+ y1="31"
+ x2="16"
+ y2="26"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3871"
+ id="linearGradient5605"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,1020.3622)"
+ x1="27"
+ y1="26"
+ x2="5"
+ y2="3" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3871-3"
+ id="linearGradient5605-2"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,1020.3622)"
+ x1="27"
+ y1="26"
+ x2="5"
+ y2="3" />
+ <linearGradient
+ id="linearGradient3871-3">
+ <stop
+ style="stop-color:#115008;stop-opacity:1;"
+ offset="0"
+ id="stop3873-5" />
+ <stop
+ id="stop3900-7"
+ offset="0.5"
+ style="stop-color:#39c228;stop-opacity:1;" />
+ <stop
+ style="stop-color:#c7f7c2;stop-opacity:1;"
+ offset="1"
+ id="stop3875-9" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3917"
+ id="linearGradient3147"
+ x1="31"
+ y1="1052.3622"
+ x2="4"
+ y2="1024.3622"
+ gradientUnits="userSpaceOnUse"
+ spreadMethod="reflect" />
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter4028"
+ x="-0.14708571"
+ width="1.2941715"
+ y="-0.25740001"
+ height="1.5148">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.429"
+ id="feGaussianBlur4030" />
+ </filter>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter4056">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.676"
+ id="feGaussianBlur4058" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter5711"
+ x="-0.1728"
+ width="1.3456"
+ y="-0.3456"
+ height="1.6912">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.144"
+ id="feGaussianBlur5713" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter5719"
+ x="-0.18"
+ width="1.36"
+ y="-0.36"
+ height="1.72">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.15"
+ id="feGaussianBlur5721" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter5723"
+ x="-0.21"
+ width="1.42"
+ y="-0.28"
+ height="1.56">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.35"
+ id="feGaussianBlur5725" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter5727"
+ x="-0.21"
+ width="1.42"
+ y="-0.28"
+ height="1.56">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.35"
+ id="feGaussianBlur5729" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4"
+ inkscape:cx="57.618613"
+ inkscape:cy="29.528242"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1607"
+ inkscape:window-height="1030"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="4"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1020.3622)">
+ <rect
+ style="fill:#2b1100;fill-opacity:1;stroke:none"
+ id="rect3063"
+ width="22"
+ height="22"
+ x="5"
+ y="5"
+ transform="translate(0,1020.3622)"
+ rx="5"
+ ry="5" />
+ <path
+ id="path3065"
+ d="m 6,1026.3622 0,22 22,0 0,-22 z m 2,2 6,0 0,6 6,0 0,-6 6,0 0,6 -6,0 0,3 3,0 0,9 -3,0 0,-3 -6,0 0,3 -3,0 0,-9 3,0 0,-3 -6,0 z"
+ style="fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter3867)"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccccccccccccccc" />
+ <path
+ style="fill:url(#linearGradient5605);fill-opacity:1;stroke:none"
+ d="m 7,1022.3622 c -2.77,0 -5,2.23 -5,5 l 0,25 28,0 0,-25 c 0,-2.77 -2.23,-5 -5,-5 z m 0,5 6,0 0,6 6,0 0,-6 6,0 0,6 -6,0 0,3 3,0 0,9 -3,0 0,-3 -6,0 0,3 -3,0 0,-9 3,0 0,-3 -6,0 z"
+ id="rect3045"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssccsssccccccccccccccccccccc" />
+ <g
+ id="g5466"
+ style="opacity:0.3"
+ transform="translate(0,-1)">
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3902"
+ d="m 3.999974,1022.3622 3,0 0,3 -3,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3904"
+ d="m 6.999974,1022.3622 3,0 0,3 -3,0 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3906"
+ d="m 3.999974,1025.3622 3,0 0,3 -3,0 z"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3908"
+ d="m 0.999974,1025.3622 3,0 0,3 -3,0 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3914"
+ d="m 3.999974,1028.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3916"
+ d="m 0.999974,1028.3622 3,0 0,3 -3,0 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3918"
+ d="m 6.999974,1025.3622 3,0 0,3 -3,0 z"
+ style="fill:#4d4d4d;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3924"
+ d="m 9.999974,1025.3622 3,0 0,3 -3,0 z"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3926"
+ d="m 12.999974,1028.3622 3,0 0,3 -3,0 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3930"
+ d="m 12.999974,1025.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3932"
+ d="m 9.999974,1022.3622 3,0 0,3 -3,0 z"
+ style="fill:#666666;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3936"
+ d="m 12.999974,1022.3622 3,0 0,3 -3,0 z"
+ style="fill:#333333;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3999"
+ d="m 18.99998,1028.3622 0,-3 3,0 0,3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4007"
+ d="m 15.99998,1031.3622 0,-3 3,0 0,3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4009"
+ d="m 24.99998,1031.3622 0,-3 3,0 0,3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4011"
+ d="m 24.99998,1034.3622 0,-3 3,0 0,3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4013"
+ d="m 21.99998,1028.3622 0,-3 3,0 0,3 z"
+ style="fill:#4d4d4d;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4015"
+ d="m 24.99998,1028.3622 0,-3 3,0 0,3 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4017"
+ d="m 15.99998,1028.3622 0,-3 3,0 0,3 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4019"
+ d="m 21.99998,1025.3622 0,-3 3,0 0,3 z"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4023"
+ d="m 24.99998,1025.3622 0,-3 3,0 0,3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4027"
+ d="m 18.99998,1025.3622 0,-3 3,0 0,3 z"
+ style="fill:#666666;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4029"
+ d="m 15.99998,1025.3622 0,-3 3,0 0,3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4035"
+ d="m 15.99998,1034.3622 0,-3 3,0 0,3 z"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4039"
+ d="m 6.99998,1034.3622 0,3 3,0 0,-3 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4041"
+ d="m 6.99998,1037.3622 0,3 3,0 0,-3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4043"
+ d="m 9.99998,1034.3622 0,3 3,0 0,-3 z"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4049"
+ d="m 3.99998,1034.3622 0,3 3,0 0,-3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4053"
+ d="m 12.99998,1031.3622 0,3 3,0 0,-3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4059"
+ d="m 3.99998,1037.3622 0,3 3,0 0,-3 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4063"
+ d="m 12.99998,1043.3622 0,3 3,0 0,-3 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4069"
+ d="m 6.99998,1040.3622 0,3 3,0 0,-3 z"
+ style="fill:#666666;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4071"
+ d="m 3.99998,1040.3622 0,3 3,0 0,-3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4073"
+ d="m 6.99998,1043.3622 0,3 3,0 0,-3 z"
+ style="fill:#333333;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4075"
+ d="m 3.99998,1043.3622 0,3 3,0 0,-3 z"
+ style="fill:#ececec;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4077"
+ d="m 3.99998,1031.3622 0,3 3,0 0,-3 z"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4133"
+ d="m 28,1028.3622 0,3 3,0 0,-3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4143"
+ d="m 28,1031.3622 0,3 3,0 0,-3 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4155"
+ d="m 28,1034.3622 0,3 3,0 0,-3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4159"
+ d="m 28,1037.3622 0,3 3,0 0,-3 z"
+ style="fill:#ececec;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4161"
+ d="m 28,1025.3622 0,3 3,0 0,-3 z"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4175"
+ d="m 28,1043.3622 0,3 3,0 0,-3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4185"
+ d="m 28,1046.3622 0,3 3,0 0,-3 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4197"
+ d="m 28,1049.3622 0,3 3,0 0,-3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4203"
+ d="m 28,1040.3622 0,3 3,0 0,-3 z"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4207"
+ d="m 6.99998,1049.3622 0,3 3,0 0,-3 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4211"
+ d="m 9.99998,1049.3622 0,3 3,0 0,-3 z"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4213"
+ d="m 9.99998,1046.3622 0,3 3,0 0,-3 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4215"
+ d="m 6.99998,1046.3622 0,3 3,0 0,-3 z"
+ style="fill:#666666;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4217"
+ d="m 3.99998,1049.3622 0,3 3,0 0,-3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4219"
+ d="m 12.99998,1049.3622 0,3 3,0 0,-3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4221"
+ d="m 12.99998,1046.3622 0,3 3,0 0,-3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4245"
+ d="m 3.99998,1046.3622 0,3 3,0 0,-3 z"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4261"
+ d="m 0.99998,1034.3622 0,3 3,0 0,-3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4263"
+ d="m 0.99998,1031.3622 0,3 3,0 0,-3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4267"
+ d="m 0.99998,1037.3622 0,3 3,0 0,-3 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4273"
+ d="m 0.99998,1043.3622 0,3 3,0 0,-3 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4275"
+ d="m 0.99998,1040.3622 0,3 3,0 0,-3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4303"
+ d="m 0.99998,1049.3622 0,3 3,0 0,-3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4305"
+ d="m 0.99998,1046.3622 0,3 3,0 0,-3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4093"
+ d="m 12.999974,1043.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4099"
+ d="m 15.999974,1043.3622 3,0 0,3 -3,0 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4105"
+ d="m 21.999974,1043.3622 3,0 0,3 -3,0 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4109"
+ d="m 21.999974,1040.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4113"
+ d="m 18.999974,1034.3622 3,0 0,3 -3,0 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4115"
+ d="m 21.999974,1037.3622 3,0 0,3 -3,0 z"
+ style="fill:#333333;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4117"
+ d="m 21.999974,1034.3622 3,0 0,3 -3,0 z"
+ style="fill:#ececec;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4119"
+ d="m 9.999974,1034.3622 3,0 0,3 -3,0 z"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4377"
+ d="m 21.999974,1043.3622 3,0 0,3 -3,0 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4379"
+ d="m 18.999974,1046.3622 3,0 0,3 -3,0 z"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4381"
+ d="m 15.999974,1046.3622 3,0 0,3 -3,0 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4383"
+ d="m 15.999974,1043.3622 3,0 0,3 -3,0 z"
+ style="fill:#666666;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4387"
+ d="m 18.999974,1049.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4389"
+ d="m 15.999974,1049.3622 3,0 0,3 -3,0 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4391"
+ d="m 21.999974,1046.3622 3,0 0,3 -3,0 z"
+ style="fill:#4d4d4d;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4393"
+ d="m 21.999974,1049.3622 3,0 0,3 -3,0 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4395"
+ d="m 21.999974,1040.3622 3,0 0,3 -3,0 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4397"
+ d="m 24.999974,1046.3622 3,0 0,3 -3,0 z"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4399"
+ d="m 27.999974,1049.3622 3,0 0,3 -3,0 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4401"
+ d="m 24.999974,1049.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4403"
+ d="m 27.999974,1046.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4405"
+ d="m 24.999974,1043.3622 3,0 0,3 -3,0 z"
+ style="fill:#666666;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4407"
+ d="m 24.999974,1040.3622 3,0 0,3 -3,0 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4409"
+ d="m 27.999974,1043.3622 3,0 0,3 -3,0 z"
+ style="fill:#333333;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4411"
+ d="m 27.999974,1040.3622 3,0 0,3 -3,0 z"
+ style="fill:#ececec;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4417"
+ d="m 18.999974,1034.3622 3,0 0,3 -3,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4419"
+ d="m 21.999974,1034.3622 3,0 0,3 -3,0 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4433"
+ d="m 21.999974,1037.3622 3,0 0,3 -3,0 z"
+ style="fill:#4d4d4d;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4435"
+ d="m 21.999974,1040.3622 3,0 0,3 -3,0 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4439"
+ d="m 24.999974,1037.3622 3,0 0,3 -3,0 z"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4441"
+ d="m 27.999974,1040.3622 3,0 0,3 -3,0 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4443"
+ d="m 24.999974,1040.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4445"
+ d="m 27.999974,1037.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4447"
+ d="m 24.999974,1034.3622 3,0 0,3 -3,0 z"
+ style="fill:#666666;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4449"
+ d="m 24.999974,1031.3622 3,0 0,3 -3,0 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4451"
+ d="m 27.999974,1034.3622 3,0 0,3 -3,0 z"
+ style="fill:#333333;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4453"
+ d="m 27.999974,1031.3622 3,0 0,3 -3,0 z"
+ style="fill:#ececec;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4455"
+ d="m 15.999974,1031.3622 3,0 0,3 -3,0 z"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ </g>
+ <path
+ style="fill:#000000;stroke:none"
+ d="m 7,1020.3622 c -3.878,0 -7,3.122 -7,7 l 0,25 2,0 0,-25 c 0,-2.77 2.23,-5 5,-5 l 18,0 c 2.77,0 5,2.23 5,5 l 0,25 2,0 0,-25 c 0,-3.878 -3.122,-7 -7,-7 z"
+ id="rect3887"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssccssssccsss" />
+ <path
+ style="opacity:0.34999999999999998;fill:url(#linearGradient3147);fill-opacity:1;stroke:none"
+ d="m 7,1021.3622 c -3.324,0 -6,2.676 -6,6 l 0,25 1,0 0,-25 c 0,-2.77 2.23,-5 5,-5 l 18,0 c 2.77,0 5,2.23 5,5 l 0,25 1,0 0,-25 c 0,-3.324 -2.676,-6 -6,-6 l -18,0 z"
+ id="rect3098"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:url(#linearGradient3898);fill-opacity:1;stroke:none"
+ id="rect3890"
+ width="32"
+ height="6"
+ x="0"
+ y="26"
+ transform="translate(0,1020.3622)" />
+ </g>
+</svg>
diff --git a/application/resources/sources/enderpearl.svg b/application/resources/sources/enderpearl.svg
new file mode 100644
index 00000000..ac9378f5
--- /dev/null
+++ b/application/resources/sources/enderpearl.svg
@@ -0,0 +1,271 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64"
+ height="64"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="enderpearl.svg"
+ inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/enderpearl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4030">
+ <stop
+ id="stop4032"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop4034"
+ offset="1"
+ style="stop-color:#0c493f;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3954">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3956" />
+ <stop
+ style="stop-color:#0f5f52;stop-opacity:1;"
+ offset="1"
+ id="stop3958" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter3884">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.505"
+ id="feGaussianBlur3886" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter3898"
+ x="-0.20110182"
+ width="1.4022036"
+ y="-0.20210065"
+ height="1.4042013">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.0604979"
+ id="feGaussianBlur3900" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter3916"
+ x="-0.11491533"
+ width="1.2298307"
+ y="-0.11548609"
+ height="1.2309722">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.6059988"
+ id="feGaussianBlur3918" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter3992">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.44"
+ id="feGaussianBlur3994" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3954"
+ id="radialGradient4024"
+ gradientUnits="userSpaceOnUse"
+ cx="32"
+ cy="32"
+ fx="32"
+ fy="32"
+ r="20"
+ gradientTransform="matrix(1.1486906,1.2798015,-0.74419869,0.66795831,19.056258,-30.328315)" />
+ <filter
+ inkscape:collect="always"
+ id="filter4082"
+ x="-0.13465964"
+ width="1.2693193"
+ y="-0.12490681"
+ height="1.2498136">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.763901"
+ id="feGaussianBlur4084" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter4110"
+ x="-0.17716113"
+ width="1.3543223"
+ y="-0.17804105"
+ height="1.3560821">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.93424815"
+ id="feGaussianBlur4112" />
+ </filter>
+ <linearGradient
+ id="linearGradient3954-9">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3956-4" />
+ <stop
+ style="stop-color:#0f5f52;stop-opacity:1;"
+ offset="1"
+ id="stop3958-2" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3954"
+ id="radialGradient4230"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1486906,1.2798015,-0.74419869,0.66795831,19.056258,-30.328315)"
+ cx="32"
+ cy="32"
+ fx="32"
+ fy="32"
+ r="20" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3954"
+ id="radialGradient4250"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1486906,1.2798015,-0.74419869,0.66795831,19.056258,-30.328315)"
+ cx="32"
+ cy="32"
+ fx="32"
+ fy="32"
+ r="20" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-241.15414"
+ inkscape:cy="194.64078"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="1607"
+ inkscape:window-height="1030"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="2"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="11.25,96.5"
+ id="guide4252" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-988.36218)">
+ <path
+ sodipodi:type="arc"
+ style="fill:#032620;fill-opacity:1;stroke:none;filter:url(#filter3992)"
+ id="path3005"
+ sodipodi:cx="32"
+ sodipodi:cy="32"
+ sodipodi:rx="24"
+ sodipodi:ry="24"
+ d="M 56,32 A 24,24 0 1 1 8,32 24,24 0 1 1 56,32 z"
+ transform="matrix(1.1666667,0,0,1.1666667,-5.3333344,983.02885)" />
+ <g
+ id="g4116"
+ transform="matrix(1.0195929,0,0,1.0195936,-0.15674338,-19.992546)">
+ <path
+ transform="matrix(1.1769403,0,0,1.1769403,-6.1232836,982.70009)"
+ d="M 52,32 C 52,43.045695 43.045695,52 32,52 20.954305,52 12,43.045695 12,32 12,20.954305 20.954305,12 32,12 c 11.045695,0 20,8.954305 20,20 z"
+ sodipodi:ry="20"
+ sodipodi:rx="20"
+ sodipodi:cy="32"
+ sodipodi:cx="32"
+ id="path3014"
+ style="fill:url(#radialGradient4024);fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="ssccs"
+ inkscape:connector-curvature="0"
+ id="path3866"
+ transform="matrix(1.1769403,0,0,1.1769403,-5.6620909,982.68843)"
+ d="m 28,16 c -6.627417,0 -12,5.372583 -12,12 0,0.20181 0.0214,0.394383 0.03125,0.59375 C 20,20 22,22 28.65625,16.03125 28.436252,16.019242 28.222996,16 28,16 z"
+ style="fill:#00ffcc;fill-opacity:1;stroke:none;filter:url(#filter3884)" />
+ <path
+ transform="matrix(1.487885,0,0,1.487885,-10.597031,-493.22036)"
+ style="fill:#00ffcc;fill-opacity:1;stroke:none;filter:url(#filter3898)"
+ d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
+ id="path3888"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssccs" />
+ <path
+ sodipodi:nodetypes="ssccs"
+ inkscape:connector-curvature="0"
+ id="path3902"
+ d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
+ style="fill:#00ffcc;fill-opacity:1;stroke:none;filter:url(#filter3916)"
+ transform="matrix(-1.8359746,0,0,-1.8359746,81.432966,2885.3572)" />
+ <path
+ transform="matrix(-1.1914115,0,0,-1.1914115,69.087304,2235.4229)"
+ style="fill:#d7f4d7;fill-opacity:1;stroke:none;filter:url(#filter3916)"
+ d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
+ id="path3920"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssccs" />
+ <path
+ sodipodi:nodetypes="csccsc"
+ inkscape:connector-curvature="0"
+ id="path3964"
+ d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 5.570868,-4.4816 8.905966,-4.4575 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter4110)"
+ transform="matrix(0.58516297,0,0,0.58516297,6.7391969,416.10681)" />
+ <path
+ transform="translate(0,988.36218)"
+ sodipodi:nodetypes="ccccccccccccccccccssssscsscsscccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path4036"
+ d="M 30,29 30.450431,19.407328 32.447263,28.5316 35,27 l 1,-6 -1,-4 1,-2 0,3 1.125,3.375 -0.07418,2.744617 L 44.0828,21.873859 37,26 l -1,4 2,2 3.375,0 5.0625,-3.0625 -4.3125,4.375 L 36,34 c 0,0 2.686048,7.256632 1.846439,8.096462 -0.326542,0.326628 -1.289256,-3.475594 -2.437243,-4.77335 C 34.192758,35.947974 32.79132,37.0625 32.5625,37.0625 c -0.602669,0 -2.136064,2.519769 -3.25945,4.522134 -0.205342,0.36601 0.728015,9.714733 0.308259,6.715119 C 29.482708,47.380759 28,44 28,44 c 0,0 0,-2 0,-3 0,-1 2,-3 2,-4 0,-1 0,-3 0,-3 0,0 -4.25,-1.125 -5.25,-1.125 -0.47674,0 -1.893857,0.89205 -3.377184,1.040709 C 19.744745,34.078874 18.0625,33.5 18.0625,33.5 L 16.774038,34.754808 17,39 l -2,-4 2,-3 3.8125,-0.0625 1.170423,-6.693425 3.092068,-2.055016 -2.122126,3.038537 -0.913529,5.350612 L 28,31 z"
+ style="opacity:0.86178864;fill:#000000;fill-opacity:0.86666667;stroke:none;filter:url(#filter4082)" />
+ </g>
+ </g>
+</svg>
diff --git a/application/resources/sources/ftb-glow.svg b/application/resources/sources/ftb-glow.svg
new file mode 100644
index 00000000..be78c78e
--- /dev/null
+++ b/application/resources/sources/ftb-glow.svg
@@ -0,0 +1,606 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32px"
+ height="32px"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="ftb-glow.svg"
+ inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/ftb_glow128.png"
+ inkscape:export-xdpi="360"
+ inkscape:export-ydpi="360">
+ <defs
+ id="defs2987">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4462">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4464" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4466" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3981">
+ <stop
+ style="stop-color:#000083;stop-opacity:1;"
+ offset="0"
+ id="stop3983" />
+ <stop
+ id="stop3985"
+ offset="0.25"
+ style="stop-color:#1919ff;stop-opacity:1;" />
+ <stop
+ id="stop3987"
+ offset="0.5"
+ style="stop-color:#1919ff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#1919ff;stop-opacity:1;"
+ offset="0.75"
+ id="stop3989" />
+ <stop
+ style="stop-color:#00007d;stop-opacity:1;"
+ offset="1"
+ id="stop3991" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3941">
+ <stop
+ id="stop3943"
+ offset="0"
+ style="stop-color:#00830e;stop-opacity:1;" />
+ <stop
+ style="stop-color:#00c017;stop-opacity:1;"
+ offset="0.25"
+ id="stop3945" />
+ <stop
+ style="stop-color:#00ff1e;stop-opacity:1;"
+ offset="0.5"
+ id="stop3947" />
+ <stop
+ id="stop3949"
+ offset="0.75"
+ style="stop-color:#00ff1e;stop-opacity:1;" />
+ <stop
+ id="stop3951"
+ offset="1"
+ style="stop-color:#007d0f;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3801">
+ <stop
+ style="stop-color:#830000;stop-opacity:1"
+ offset="0"
+ id="stop3803" />
+ <stop
+ id="stop3811"
+ offset="0.25"
+ style="stop-color:#ff0000;stop-opacity:1;" />
+ <stop
+ id="stop3809"
+ offset="0.5"
+ style="stop-color:#ff0000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ff0000;stop-opacity:1;"
+ offset="0.75"
+ id="stop3813" />
+ <stop
+ style="stop-color:#7d0000;stop-opacity:1"
+ offset="1"
+ id="stop3805" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter4107"
+ x="-0.14444444"
+ width="1.2888889"
+ y="-0.12380952"
+ height="1.247619">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.4444444"
+ id="feGaussianBlur4109" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter4452">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.85596708"
+ id="feGaussianBlur4454" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4462"
+ id="linearGradient4468"
+ x1="-34.75"
+ y1="14"
+ x2="72.5"
+ y2="18.5"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.228145,0,0,1,111.61491,355.31802)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3801"
+ id="linearGradient4476"
+ gradientUnits="userSpaceOnUse"
+ x1="-8"
+ y1="2"
+ x2="-4"
+ y2="6" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3941"
+ id="linearGradient4478"
+ gradientUnits="userSpaceOnUse"
+ x1="-8"
+ y1="2"
+ x2="-4"
+ y2="6" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3981"
+ id="linearGradient4480"
+ gradientUnits="userSpaceOnUse"
+ x1="-8"
+ y1="2"
+ x2="-4"
+ y2="6" />
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter4107-6"
+ x="-0.14444444"
+ width="1.2888889"
+ y="-0.12380952"
+ height="1.247619">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.4444444"
+ id="feGaussianBlur4109-1" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3941"
+ id="linearGradient3336"
+ gradientUnits="userSpaceOnUse"
+ x1="-8"
+ y1="6"
+ x2="4"
+ y2="17" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3981"
+ id="linearGradient3338"
+ gradientUnits="userSpaceOnUse"
+ x1="-16"
+ y1="2"
+ x2="-4"
+ y2="14" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3801"
+ id="linearGradient3340"
+ gradientUnits="userSpaceOnUse"
+ x1="-8"
+ y1="6"
+ x2="4"
+ y2="18" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3801"
+ id="linearGradient3342"
+ gradientUnits="userSpaceOnUse"
+ x1="-8"
+ y1="2"
+ x2="-4"
+ y2="6" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3801"
+ id="linearGradient3344"
+ gradientUnits="userSpaceOnUse"
+ x1="-8"
+ y1="2"
+ x2="-4"
+ y2="6" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="6.8684247"
+ inkscape:cy="24.209238"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1607"
+ inkscape:window-height="1030"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:guide-bbox="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2993"
+ empspacing="2"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="4,48"
+ id="guide3346" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="-29,35"
+ id="guide3348" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="-62,42"
+ id="guide3350" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="-58,69"
+ id="guide3352" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata2990">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:url(#linearGradient4468);fill-opacity:1;stroke:none"
+ id="rect4460"
+ width="495.75"
+ height="96.25"
+ x="-76.537521"
+ y="319.06802" />
+ <g
+ id="g3280"
+ transform="translate(2,53)"
+ inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/vectors/ftb.png"
+ inkscape:export-xdpi="360"
+ inkscape:export-ydpi="360">
+ <g
+ transform="translate(-2,-53)"
+ id="g8144"
+ style="filter:url(#filter4107)">
+ <path
+ style="fill:#5353ff;fill-opacity:1;stroke:none"
+ d="m 4,2 12,0 0,4 -8,0 0,4 4,0 0,4 -4,0 0,8 -4,0 z"
+ id="path8146"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ <path
+ style="fill:#009a00;fill-opacity:1;stroke:none"
+ d="m 8,6 12,0 0,4 -4,0 0,16 -4,0 0,-16 -4,0 z"
+ id="path8148"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ style="fill:#ac0000;fill-opacity:1;stroke:none"
+ d="m 16,10 0,20 8,0 0,-4 -4,0 0,-4 4,0 0,-4 -4,0 0,-4 4,0 0,-4 -8,0 z m 8,4 0,4 4,0 0,-4 -4,0 z m 0,8 0,4 4,0 0,-4 -4,0 z"
+ id="path8150"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g8256"
+ transform="translate(32,-53)">
+ <g
+ id="g8258"
+ transform="translate(-18,4)">
+ <path
+ sodipodi:nodetypes="ccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path8260"
+ d="m -8,2 4,0 8,0 0,4 -4,0 0,16 -4,0 0,-16 0,0 -4,0 z"
+ style="fill:url(#linearGradient3336);fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#ffffff;fill-opacity:0.50196078;stroke:none"
+ d="m -8,2 1,1 0,2 -1,1 z"
+ id="path8262"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8264"
+ d="M 4,2 3,3 -7,3 -8,2 z"
+ style="fill:#ffffff;fill-opacity:0.50196078;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8266"
+ d="m -4,22 1,-1 2,0 1,1 z"
+ style="fill:#000000;fill-opacity:0.3466667;stroke:none" />
+ <path
+ style="fill:#000000;fill-opacity:0.25777779;stroke:none"
+ d="M 4,6 3,5 3,3 4,2 z"
+ id="path8268"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#000000;fill-opacity:0.3466667;stroke:none"
+ d="m -8,6 1,-1 4,0 -1,1 z"
+ id="path8270"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8272"
+ d="M 0,6 -1,5 3,5 4,6 z"
+ style="fill:#000000;fill-opacity:0.3466667;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8274"
+ d="m -4,6 1,-1 0,16 -1,1 z"
+ style="fill:#ffffff;fill-opacity:0.50196078;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8276"
+ d="M 0,22 -1,21 -1,5 0,6 z"
+ style="fill:#000000;fill-opacity:0.25777779;stroke:none" />
+ </g>
+ <g
+ transform="translate(-14,0)"
+ id="g8278">
+ <path
+ sodipodi:nodetypes="ccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path8280"
+ d="m -16,2 12,0 0,4 -8,0 0,4 4,0 0,4 -4,0 0,8 -4,0 z"
+ style="fill:url(#linearGradient3338);fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8282"
+ d="m -16,2 1,1 0,18 -1,1 z"
+ style="fill:#ffffff;fill-opacity:0.50222222;stroke:none" />
+ <path
+ style="fill:#ffffff;fill-opacity:0.40888887;stroke:none"
+ d="M -4,2 -5,3 -15,3 -16,2 z"
+ id="path8284"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#ffffff;fill-opacity:0.3466667;stroke:none"
+ d="m -16,22 1,-1 2,0 1,1 z"
+ id="path8286"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8288"
+ d="M -4,6 -5,5 -5,3 -4,2 z"
+ style="fill:#ffffff;fill-opacity:0.25777779;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8290"
+ d="m -12,14 -1,-1 4,0 1,1 z"
+ style="fill:#ffffff;fill-opacity:0.3466667;stroke:none" />
+ <path
+ style="fill:#ffffff;fill-opacity:0.3466667;stroke:none"
+ d="m -12,6 -1,-1 8,0 1,1 z"
+ id="path8292"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#ffffff;fill-opacity:0.25777779;stroke:none"
+ d="m -8,14 -1,-1 0,-2 1,-1 z"
+ id="path8294"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8296"
+ d="m -8,10 -1,1 -4,0 1,-1 z"
+ style="fill:#ffffff;fill-opacity:0.40888887;stroke:none" />
+ <path
+ style="fill:#ffffff;fill-opacity:0.25777779;stroke:none"
+ d="m -12,10 -1,1 0,-6 1,1 z"
+ id="path8298"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8300"
+ d="m -12,22 -1,-1 0,-8 1,1 z"
+ style="fill:#ffffff;fill-opacity:0.25777779;stroke:none" />
+ </g>
+ <g
+ id="g8302">
+ <g
+ id="g8304"
+ transform="translate(-10,8)">
+ <path
+ style="fill:url(#linearGradient3340);fill-opacity:1;stroke:none"
+ d="m -8,2 8,0 0,4 -4,0 0,4 4,0 0,4 -4,0 0,4 4,0 0,4 -8,0 z"
+ id="path8306"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ style="fill:#ffffff;fill-opacity:0.39111113;stroke:none"
+ d="m -8,2 1,1 0,18 -1,1 z"
+ id="path8308"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8310"
+ d="M 0,2 -1,3 -7,3 -8,2 z"
+ style="fill:#ffffff;fill-opacity:0.23999999;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8312"
+ d="m -8,22 1,-1 6,0 1,1 z"
+ style="fill:#000000;fill-opacity:0.43111112;stroke:none" />
+ <path
+ style="fill:#000000;fill-opacity:0.25777779;stroke:none"
+ d="M 0,6 -1,5 -1,3 0,2 z"
+ id="path8314"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#000000;fill-opacity:0.43111112;stroke:none"
+ d="M -4,6 -5,5 -1,5 0,6 z"
+ id="path8316"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8318"
+ d="m -4,14 -1,-1 4,0 1,1 z"
+ style="fill:#000000;fill-opacity:0.43111112;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8320"
+ d="m -4,10 -1,1 0,-6 1,1 z"
+ style="fill:#000000;fill-opacity:0.25777779;stroke:none" />
+ <path
+ style="fill:#000000;fill-opacity:0.25777779;stroke:none"
+ d="m -4,18 -1,1 0,-6 1,1 z"
+ id="path8322"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8324"
+ d="m 0,22 -1,-1 0,-2 1,-1 z"
+ style="fill:#000000;fill-opacity:0.25777779;stroke:none" />
+ <path
+ style="fill:#ffffff;fill-opacity:0.23999999;stroke:none"
+ d="m 0,10 -1,1 -4,0 1,-1 z"
+ id="path8326"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8328"
+ d="m 0,18 -1,1 -4,0 1,-1 z"
+ style="fill:#ffffff;fill-opacity:0.23999999;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8330"
+ d="m 0,14 -1,-1 0,-2 1,-1 z"
+ style="fill:#000000;fill-opacity:0.25777779;stroke:none" />
+ </g>
+ <g
+ transform="translate(-2,12)"
+ id="g8332">
+ <rect
+ style="fill:url(#linearGradient3342);fill-opacity:1;stroke:none"
+ id="rect8334"
+ width="4"
+ height="4"
+ x="-8"
+ y="2" />
+ <path
+ style="fill:#ffffff;fill-opacity:0.39111113;stroke:none"
+ d="m -8,2 1,1 0,2 -1,1 z"
+ id="path8336"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8338"
+ d="M -4,2 -5,3 -7,3 -8,2 z"
+ style="fill:#ffffff;fill-opacity:0.23999999;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8340"
+ d="m -8,6 1,-1 2,0 1,1 z"
+ style="fill:#000000;fill-opacity:0.43111112;stroke:none" />
+ <path
+ style="fill:#000000;fill-opacity:0.25777779;stroke:none"
+ d="M -4,6 -5,5 -5,3 -4,2 z"
+ id="path8342"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ <g
+ id="g8344"
+ transform="translate(-2,20)">
+ <rect
+ y="2"
+ x="-8"
+ height="4"
+ width="4"
+ id="rect8346"
+ style="fill:url(#linearGradient3344);fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8348"
+ d="m -8,2 1,1 0,2 -1,1 z"
+ style="fill:#ffffff;fill-opacity:0.39111113;stroke:none" />
+ <path
+ style="fill:#ffffff;fill-opacity:0.23999999;stroke:none"
+ d="M -4,2 -5,3 -7,3 -8,2 z"
+ id="path8350"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#000000;fill-opacity:0.43111112;stroke:none"
+ d="m -8,6 1,-1 2,0 1,1 z"
+ id="path8352"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path8354"
+ d="M -4,6 -5,5 -5,3 -4,2 z"
+ style="fill:#000000;fill-opacity:0.25777779;stroke:none" />
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/application/resources/sources/ftb-logo.svg b/application/resources/sources/ftb-logo.svg
new file mode 100644
index 00000000..8cf73567
--- /dev/null
+++ b/application/resources/sources/ftb-logo.svg
@@ -0,0 +1,257 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ width="128"
+ height="128"
+ sodipodi:docname="ftb-logo.svg"
+ inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/ftb_logo128.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3027">
+ <stop
+ style="stop-color:#418cc6;stop-opacity:1"
+ offset="0"
+ id="stop3029" />
+ <stop
+ style="stop-color:#014b85;stop-opacity:1"
+ offset="1"
+ id="stop3031" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3019">
+ <stop
+ style="stop-color:#41cd55;stop-opacity:1"
+ offset="0"
+ id="stop3021" />
+ <stop
+ style="stop-color:#018d15;stop-opacity:1"
+ offset="1"
+ id="stop3023" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3011">
+ <stop
+ style="stop-color:#d24141;stop-opacity:1"
+ offset="0"
+ id="stop3013" />
+ <stop
+ style="stop-color:#910101;stop-opacity:1"
+ offset="1"
+ id="stop3015" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter3826"
+ color-interpolation-filters="sRGB">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="3.4237769"
+ id="feGaussianBlur3828" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3830"
+ gradientUnits="userSpaceOnUse"
+ x1="567.10803"
+ y1="231.67372"
+ x2="567.10803"
+ y2="300.68848" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3027"
+ id="linearGradient3832"
+ gradientUnits="userSpaceOnUse"
+ x1="548.19916"
+ y1="255.50847"
+ x2="548.19916"
+ y2="324.71759" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3011"
+ id="linearGradient3834"
+ gradientUnits="userSpaceOnUse"
+ x1="600.95337"
+ y1="257.41525"
+ x2="600.95337"
+ y2="324.16464" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3848"
+ gradientUnits="userSpaceOnUse"
+ x1="567.10803"
+ y1="231.67372"
+ x2="567.10803"
+ y2="300.68848" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3027"
+ id="linearGradient3850"
+ gradientUnits="userSpaceOnUse"
+ x1="548.19916"
+ y1="255.50847"
+ x2="548.19916"
+ y2="324.71759" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3011"
+ id="linearGradient3852"
+ gradientUnits="userSpaceOnUse"
+ x1="600.95337"
+ y1="257.41525"
+ x2="600.95337"
+ y2="324.16464" />
+ </defs>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1607"
+ inkscape:window-height="1030"
+ id="namedview4"
+ showgrid="false"
+ showguides="false"
+ inkscape:guide-bbox="true"
+ inkscape:zoom="4"
+ inkscape:cx="32.725294"
+ inkscape:cy="54.630313"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="g3838">
+ <sodipodi:guide
+ orientation="1,0"
+ position="352.46726,316.96211"
+ id="guide2991" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="347.41115,278.08622"
+ id="guide2993" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="431.31454,337.77645"
+ id="guide3001" />
+ <inkscape:grid
+ type="xygrid"
+ id="grid3005"
+ empspacing="4"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="431.28645,312"
+ id="guide3007" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="73.25,82.125"
+ id="guide3856" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="75.5,79.25"
+ id="guide3858" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="35.125,49.75"
+ id="guide3860" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="39.686368,60.45763"
+ id="guide3862" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="41.9375,48.59375"
+ id="guide3864" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="28.416854,59.142853"
+ id="guide3866" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="28.416854,56.623785"
+ id="guide3868" />
+ </sodipodi:namedview>
+ <g
+ id="g3838"
+ transform="matrix(1,0,0,1.018245,3.8570626,-2.6546202)">
+ <g
+ style="opacity:0.33054397;fill:#000000;fill-opacity:1;filter:url(#filter3826)"
+ transform="matrix(0.83116569,0,0,0.83116569,-409.72999,-161.96543)"
+ id="g3040">
+ <path
+ sodipodi:nodetypes="ccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path3042"
+ d="m 547.55325,231.83317 c -0.0986,2.38736 42.68285,2.06721 42.92078,0 l 3.59546,21.34804 -2.92131,0 c -3.03427,-7.13555 -5.22493,-14.772 -17.52786,-16.40428 l 0,59.32506 5.6179,1.34829 0,3.37075 -20.67388,0 0,-3.14603 5.73213,-1.53592 0,-59.58687 c -6.03051,0.84659 -12.06101,1.92591 -18.09152,15.95485 l -2.69659,0 z"
+ style="fill:#000000;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccccccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path3044"
+ d="m 505.54497,324.79984 20.44916,0 0,-3.14603 -5.73026,-1.0674 0,-28.9322 9.10101,-0.11236 c 3.72116,2.12145 5.47848,6.20675 6.51676,11.01109 l 2.6966,-0.22472 0,-24.26934 -3.14603,0 c -1.29037,3.73961 -0.27178,8.24887 -6.51677,10.33694 l -8.65157,-0.11236 0,-27.13447 c 15.85546,-0.55543 21.31445,0.2909 29.77489,16.46046 l 2.92131,0 -4.71904,-22.02218 c -0.99909,3.14752 -12.86953,2.24716 -42.69606,2.24716 l 0.0281,2.72468 c 3.6912,0.29962 3.59931,0.57116 5.14038,0.87078 l -0.0562,59.2127 -5.05612,1.51683 z"
+ style="fill:#000000;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3046"
+ d="m 612.29661,257.60381 -27.75,0.125 0,3.125 5.15625,0.90625 0,58.875 -5.40625,1.46875 0,2.46875 27.65625,0 c 32.83223,-0.42026 25.38759,-33.26589 5.15625,-36.40625 19.87788,-2.96053 19.96965,-30.36986 -4.8125,-30.5625 z m -2.375,3.34375 c 16.40273,0 18.2699,25.53125 -1.6875,25.53125 l -9.21875,0 0,-25.5 10.90625,-0.0312 z m -1.1875,28.84375 c 10.10368,0.81978 14.43973,6.63609 15.71875,15.6875 2.50148,17.70261 -22.21516,16.36814 -25.375,15.15625 l 0,-30.78125 9.65625,-0.0625 z"
+ style="fill:#000000;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="matrix(0.83116569,0,0,0.83116569,-412.777,-169.25441)"
+ id="g3035">
+ <path
+ style="fill:url(#linearGradient3848);fill-opacity:1;stroke:none"
+ d="m 547.55325,231.83317 c -0.0986,2.38736 42.68285,2.06721 42.92078,0 l 3.59546,21.34804 -2.92131,0 c -3.03427,-7.13555 -5.22493,-14.772 -17.52786,-16.40428 l 0,59.32506 5.6179,1.34829 0,3.37075 -20.67388,0 0,-3.14603 5.73213,-1.53592 0,-59.58687 c -6.03051,0.84659 -12.06101,1.92591 -18.09152,15.95485 l -2.69659,0 z"
+ id="path2987"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccc" />
+ <path
+ style="fill:url(#linearGradient3850);fill-opacity:1;stroke:none"
+ d="m 505.54497,324.79984 20.44916,0 0,-3.14603 -5.73026,-1.0674 0,-28.9322 9.0706,-0.0112 c 7.23229,-0.009 6.17144,5.6893 6.17144,10.66981 l 3.07233,0 0,-24.25397 -3.14603,0 c 0.0737,4.503 1.04842,10.24675 -6.09774,10.23698 l -9.0706,-0.0124 0,-27.13447 c 15.85546,-0.55543 21.31445,0.2909 29.77489,16.46046 l 2.92131,0 -4.71904,-22.02218 c -0.99909,3.14752 -12.86953,2.24716 -42.69606,2.24716 l 0.0281,2.72468 c 3.6912,0.29962 3.59931,0.57116 5.14038,0.87078 l -0.0562,59.2127 -5.05612,1.51683 z"
+ id="path2989"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccsccccsccccccccccc" />
+ <path
+ style="fill:url(#linearGradient3852);fill-opacity:1;stroke:none"
+ d="m 612.29661,257.60381 -27.75,0.125 0,3.125 5.15625,0.90625 0,58.875 -5.40625,1.46875 0,2.46875 27.65625,0 c 32.83223,-0.42026 25.38759,-33.26589 5.15625,-36.40625 19.87788,-2.96053 19.96965,-30.36986 -4.8125,-30.5625 z m -2.375,3.34375 c 16.40273,0 18.2699,25.53125 -1.6875,25.53125 l -9.21875,0 0,-25.5 10.90625,-0.0312 z m -1.1875,28.84375 c 10.10368,0.81978 14.43973,6.63609 15.71875,15.6875 2.50148,17.70261 -22.21516,16.36814 -25.375,15.15625 l 0,-30.78125 9.65625,-0.0625 z"
+ id="path2995"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+</svg>
diff --git a/application/resources/sources/gear.svg b/application/resources/sources/gear.svg
new file mode 100644
index 00000000..c0169aec
--- /dev/null
+++ b/application/resources/sources/gear.svg
@@ -0,0 +1,434 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64"
+ height="64"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="gear.svg"
+ inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/gear128.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4030">
+ <stop
+ id="stop4032"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop4034"
+ offset="1"
+ style="stop-color:#0c493f;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3954">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3956" />
+ <stop
+ style="stop-color:#0f5f52;stop-opacity:1;"
+ offset="1"
+ id="stop3958" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3954-9">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3956-4" />
+ <stop
+ style="stop-color:#0f5f52;stop-opacity:1;"
+ offset="1"
+ id="stop3958-2" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3954"
+ id="radialGradient4230"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1486906,1.2798015,-0.74419869,0.66795831,19.056258,-30.328315)"
+ cx="32"
+ cy="32"
+ fx="32"
+ fy="32"
+ r="20" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3954"
+ id="radialGradient4250"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1486906,1.2798015,-0.74419869,0.66795831,19.056258,-30.328315)"
+ cx="32"
+ cy="32"
+ fx="32"
+ fy="32"
+ r="20" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3954"
+ id="radialGradient3069"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1486906,1.2798015,-0.74419869,0.66795831,19.056258,-30.328315)"
+ cx="32"
+ cy="32"
+ fx="32"
+ fy="32"
+ r="20" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9"
+ id="linearGradient3917"
+ x1="43.78125"
+ y1="42.687496"
+ x2="15.453125"
+ y2="21.578121"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1428571,0,0,1.1428571,-2.2857143,-2.28571)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3911-5"
+ id="linearGradient3929-9"
+ gradientUnits="userSpaceOnUse"
+ x1="40.5"
+ y1="36.999996"
+ x2="9"
+ y2="19.499996" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3911-5">
+ <stop
+ style="stop-color:#8c3800;stop-opacity:1"
+ offset="0"
+ id="stop3913-6" />
+ <stop
+ style="stop-color:#ff6701;stop-opacity:1"
+ offset="1"
+ id="stop3915-3" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9"
+ id="linearGradient3986"
+ gradientUnits="userSpaceOnUse"
+ x1="28"
+ y1="28"
+ x2="44"
+ y2="32" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9"
+ id="linearGradient3925-4"
+ x1="16"
+ y1="16"
+ x2="48"
+ y2="48"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3919-9">
+ <stop
+ style="stop-color:#fff306;stop-opacity:1;"
+ offset="0"
+ id="stop3921-2" />
+ <stop
+ style="stop-color:#ff7f01;stop-opacity:1;"
+ offset="1"
+ id="stop3923-3" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(-12,-12)"
+ y2="48"
+ x2="48"
+ y1="16"
+ x1="16"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4025"
+ xlink:href="#linearGradient3919-9"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3919-9-3">
+ <stop
+ style="stop-color:#ff9e06;stop-opacity:1"
+ offset="0"
+ id="stop3921-2-9" />
+ <stop
+ style="stop-color:#af4600;stop-opacity:1"
+ offset="1"
+ id="stop3923-3-4" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(-8,-8)"
+ y2="48"
+ x2="48"
+ y1="16"
+ x1="16"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4065"
+ xlink:href="#linearGradient3919-9-3"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3919-9-35">
+ <stop
+ style="stop-color:#ff9e06;stop-opacity:1"
+ offset="0"
+ id="stop3921-2-3" />
+ <stop
+ style="stop-color:#af4600;stop-opacity:1"
+ offset="1"
+ id="stop3923-3-5" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(-8,-8)"
+ y2="48"
+ x2="48"
+ y1="16"
+ x1="16"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4098"
+ xlink:href="#linearGradient3919-9-35"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(92.25,1040.3622)"
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9-7"
+ id="linearGradient3986-9"
+ gradientUnits="userSpaceOnUse"
+ x1="28"
+ y1="28"
+ x2="44"
+ y2="32" />
+ <linearGradient
+ id="linearGradient3919-9-7">
+ <stop
+ style="stop-color:#fff306;stop-opacity:1;"
+ offset="0"
+ id="stop3921-2-93" />
+ <stop
+ style="stop-color:#ff7f01;stop-opacity:1;"
+ offset="1"
+ id="stop3923-3-0" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9-7"
+ id="linearGradient3917-1"
+ x1="43.78125"
+ y1="42.687496"
+ x2="15.453125"
+ y2="21.578121"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1428571,0,0,1.1428571,89.96429,1038.0765)" />
+ <linearGradient
+ id="linearGradient4172">
+ <stop
+ style="stop-color:#fff306;stop-opacity:1;"
+ offset="0"
+ id="stop4174" />
+ <stop
+ style="stop-color:#ff7f01;stop-opacity:1;"
+ offset="1"
+ id="stop4176" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(92.25,1040.3622)"
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9-7"
+ id="linearGradient3925-4-8"
+ x1="16"
+ y1="16"
+ x2="48"
+ y2="48"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient4179">
+ <stop
+ style="stop-color:#fff306;stop-opacity:1;"
+ offset="0"
+ id="stop4181" />
+ <stop
+ style="stop-color:#ff7f01;stop-opacity:1;"
+ offset="1"
+ id="stop4183" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5178-5"
+ id="linearGradient5184-3"
+ x1="-58.570175"
+ y1="1003.1377"
+ x2="-18.635777"
+ y2="1034.4441"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient5178-5">
+ <stop
+ style="stop-color:#13daba;stop-opacity:0.50196081;"
+ offset="0"
+ id="stop5180-8" />
+ <stop
+ style="stop-color:#03251f;stop-opacity:1"
+ offset="1"
+ id="stop5182-3" />
+ </linearGradient>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter4462-8">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.68"
+ id="feGaussianBlur4464-6" />
+ </filter>
+ <linearGradient
+ gradientTransform="translate(164.98654,52.0355)"
+ y2="1034.4441"
+ x2="-18.635777"
+ y1="1003.1377"
+ x1="-58.570175"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4197"
+ xlink:href="#linearGradient5178-5"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5178-5"
+ id="linearGradient4308"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(164.98654,52.0355)"
+ x1="-58.570175"
+ y1="1003.1377"
+ x2="-18.635777"
+ y2="1034.4441" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9-7"
+ id="linearGradient4310"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(92.25,1040.3622)"
+ x1="16"
+ y1="16"
+ x2="48"
+ y2="48" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9-7"
+ id="linearGradient4312"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1428571,0,0,1.1428571,89.96429,1038.0765)"
+ x1="43.78125"
+ y1="42.687496"
+ x2="15.453125"
+ y2="21.578121" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9-7"
+ id="linearGradient4314"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(92.25,1040.3622)"
+ x1="28"
+ y1="28"
+ x2="44"
+ y2="32" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2"
+ inkscape:cx="63.31906"
+ inkscape:cy="60.240415"
+ inkscape:document-units="px"
+ inkscape:current-layer="g4300"
+ showgrid="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="1607"
+ inkscape:window-height="1030"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="4"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingx="1px"
+ spacingy="1px" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="11.25,96.5"
+ id="guide4252" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-988.36218)">
+ <g
+ id="g4300"
+ transform="translate(-92.25,-52.00002)">
+ <path
+ sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect4162-6"
+ d="m 120.25,1044.3622 -4,4 0,4 -3,-3 -6,0 -6,6 0,6 3,3 -4,0 -4,4 0,8 4,4 4,0 -3,3 0,6 6,6 6,0 3,-3 0,4 4,4 8,0 4,-4 0,-4 3,3 6,0 6,-6 0,-6 -3,-3 4,0 4,-4 0,-8 -4,-4 -4,0 3,-3 0,-6 -6,-6 -6,0 -3,3 0,-4 -4,-4 z"
+ style="color:#000000;fill:url(#linearGradient4308);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter4462-8);enable-background:accumulate" />
+ <path
+ id="rect3071-3"
+ d="m 120.25,1048.3622 0,4.4062 c -0.22274,0.045 -0.43627,0.1037 -0.65625,0.1563 -0.4105,0.098 -0.81848,0.19 -1.21875,0.3125 -0.0218,0.01 -0.0408,0.024 -0.0625,0.031 -0.59186,0.1833 -1.18309,0.3898 -1.75,0.625 -0.50056,0.2088 -0.98977,0.4401 -1.46875,0.6875 -0.0827,0.043 -0.16797,0.081 -0.25,0.125 -0.55648,0.2973 -1.10149,0.6219 -1.625,0.9687 l -3.125,-3.125 -5.65625,5.6562 3.125,3.125 c -0.34167,0.5158 -0.67512,1.046 -0.96875,1.5938 -0.048,0.09 -0.0783,0.1905 -0.125,0.2812 -0.23239,0.45 -0.45783,0.9059 -0.65625,1.375 -0.0127,0.03 -0.0187,0.063 -0.0312,0.094 -0.23753,0.5694 -0.44005,1.1553 -0.625,1.75 -0.13065,0.4218 -0.24046,0.848 -0.34375,1.2812 -0.0526,0.22 -0.11102,0.4335 -0.15625,0.6563 l -4.40625,0 0,8 4.40625,0 c 0.0452,0.2227 0.10369,0.4363 0.15625,0.6562 0.0979,0.4105 0.19004,0.8185 0.3125,1.2188 0.007,0.022 0.0245,0.041 0.0312,0.062 0.18332,0.5918 0.38983,1.1831 0.625,1.75 0.2088,0.5005 0.44015,0.9897 0.6875,1.4687 0.0467,0.091 0.077,0.1914 0.125,0.2813 0.0175,0.033 0.0448,0.061 0.0625,0.094 0.27878,0.5148 0.58417,1.0139 0.90625,1.5 l -3.125,3.125 5.65625,5.6563 3.125,-3.125 c 0.52351,0.3468 1.06852,0.6714 1.625,0.9687 0.082,0.044 0.16729,0.082 0.25,0.125 0.45001,0.2324 0.90589,0.4579 1.375,0.6563 0.0303,0.013 0.0634,0.019 0.0937,0.031 0.56941,0.2376 1.15536,0.4401 1.75,0.625 0.42179,0.1307 0.84805,0.2405 1.28125,0.3438 0.21027,0.05 0.41221,0.1127 0.625,0.1562 0.01,0 0.0212,0 0.0312,0 l 0,4.4063 8,0 0,-4.4063 c 0.22283,-0.045 0.43616,-0.1037 0.65625,-0.1562 0.92356,-0.2207 1.81865,-0.4999 2.6875,-0.8438 0.61879,-0.2435 1.22575,-0.5106 1.8125,-0.8125 0.0825,-0.043 0.16813,-0.081 0.25,-0.125 0.55807,-0.2971 1.10017,-0.621 1.625,-0.9687 l 3.125,3.125 5.65625,-5.6563 -3.125,-3.125 c 0.34276,-0.5174 0.6751,-1.044 0.96875,-1.5937 0.0483,-0.09 0.0781,-0.1904 0.125,-0.2813 0.30187,-0.5867 0.56896,-1.1937 0.8125,-1.8125 0.34385,-0.8688 0.62307,-1.7639 0.84375,-2.6875 0.0525,-0.2201 0.111,-0.4334 0.15625,-0.6562 l 4.40625,0 0,-8 -4.40625,0 c -0.002,-0.01 0.002,-0.021 0,-0.031 -0.0435,-0.2127 -0.10613,-0.4148 -0.15625,-0.625 -0.22068,-0.9235 -0.4999,-1.8186 -0.84375,-2.6875 -0.24354,-0.6188 -0.51063,-1.2257 -0.8125,-1.8125 -0.0469,-0.091 -0.0767,-0.1912 -0.125,-0.2812 -0.29365,-0.5497 -0.62599,-1.0764 -0.96875,-1.5938 l 3.125,-3.125 -5.65625,-5.6562 -3.125,3.125 c -0.48499,-0.3213 -0.98661,-0.6273 -1.5,-0.9062 -0.0409,-0.022 -0.0839,-0.041 -0.125,-0.062 -0.0819,-0.044 -0.16745,-0.082 -0.25,-0.125 -0.58675,-0.3019 -1.19371,-0.569 -1.8125,-0.8125 -0.86885,-0.3439 -1.76394,-0.6231 -2.6875,-0.8438 -0.21019,-0.05 -0.4123,-0.1127 -0.625,-0.1562 -0.01,0 -0.0214,0 -0.0312,0 l 0,-4.4063 -8,0 z m 4,20 c 2.20914,0 4,1.7908 4,4 0,2.2091 -1.79086,4 -4,4 -0.27614,0 -0.55211,-0.041 -0.8125,-0.094 -1.82273,-0.373 -3.1875,-1.9732 -3.1875,-3.9062 0,-0.2762 0.0405,-0.5521 0.0937,-0.8125 0.37299,-1.8228 1.97325,-3.1875 3.90625,-3.1875 z"
+ style="color:#000000;fill:url(#linearGradient4310);fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3874-0"
+ d="m 124.25,1056.3622 c -8.83656,0 -16,7.1634 -16,16 0,8.8365 7.16344,16 16,16 8.83656,0 16,-7.1635 16,-16 0,-8.8366 -7.16344,-16 -16,-16 z m 0,12 c 2.20914,0 4,1.7908 4,4 0,2.2091 -1.79086,4 -4,4 -2.20914,0 -4,-1.7909 -4,-4 0,-2.2092 1.79086,-4 4,-4 z"
+ style="fill:url(#linearGradient4312);fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3876-7"
+ d="m 124.25,1064.3622 c -4.41828,0 -8,3.5817 -8,8 0,4.4183 3.58172,8 8,8 4.41828,0 8,-3.5817 8,-8 0,-4.4183 -3.58172,-8 -8,-8 z m 0,4 c 2.20914,0 4,1.7908 4,4 0,2.2091 -1.79086,4 -4,4 -2.20914,0 -4,-1.7909 -4,-4 0,-2.2092 1.79086,-4 4,-4 z"
+ style="fill:url(#linearGradient4314);fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3927-9"
+ d="m 124.25,1056.3622 c -8.83656,0 -16,7.1634 -16,16 0,4.8907 2.19848,9.2526 5.65625,12.1875 -2.28249,-2.7658 -3.65625,-6.3215 -3.65625,-10.1875 0,-8.8366 7.16344,-16 16,-16 3.86599,0 7.42176,1.3737 10.1875,3.6562 -2.93487,-3.4577 -7.29683,-5.6562 -12.1875,-5.6562 z"
+ style="fill:#000000;fill-opacity:0.39130435;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3970-3"
+ d="m 131.8125,1069.7997 c 0.27256,0.8054 0.4375,1.665 0.4375,2.5625 0,4.4183 -3.58172,8 -8,8 -2.72065,0 -5.11721,-1.3623 -6.5625,-3.4375 1.06926,3.1597 4.04169,5.4375 7.5625,5.4375 4.41828,0 8,-3.5817 8,-8 0,-1.6976 -0.53567,-3.2676 -1.4375,-4.5625 z"
+ style="fill:#000000;fill-opacity:0.39130435;stroke:none" />
+ </g>
+ </g>
+</svg>
diff --git a/application/resources/sources/herobrine.svg b/application/resources/sources/herobrine.svg
new file mode 100644
index 00000000..7392ba36
--- /dev/null
+++ b/application/resources/sources/herobrine.svg
@@ -0,0 +1,583 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="herobrine.svg"
+ inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/herobrine.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4">
+ <filter
+ inkscape:collect="always"
+ id="filter3927"
+ x="-0.10864197"
+ width="1.2172839"
+ y="-0.10864198"
+ height="1.217284">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.1769547"
+ id="feGaussianBlur3929" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter4035"
+ x="-0.066666667"
+ width="1.1333333"
+ y="-0.13333333"
+ height="1.2666667">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.16666667"
+ id="feGaussianBlur4037" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#484848"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-64.2584"
+ inkscape:cy="64.238479"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1607"
+ inkscape:window-height="1030"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2996"
+ empspacing="4"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1020.3622)">
+ <path
+ style="fill:#170b28;fill-opacity:1;stroke:none;filter:url(#filter3927)"
+ d="m 5.0606609,1024.2461 -1,1 0,24 1,1 24.0000001,0 1,-1 0,-24 -1,-1 z"
+ id="rect3223-4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ style="fill:#2b1e0d;fill-opacity:1;stroke:none"
+ d="m 6,1024.3622 20,0 c 1,0 2,1 2,2 l 0,7 -3,0 0,-3 -18,0 0,3 -3,0 0,-7.005 c 0,-0.995 1,-1.995 2,-1.995 z"
+ id="rect3978"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ <path
+ transform="translate(0,1020.3622)"
+ style="fill:#421d0a;fill-opacity:1;stroke:none"
+ d="m 10,22 3,0 0,3 6,0 0,-3 3,0 0,6 -12,0 z"
+ id="rect3981"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ transform="translate(0,1020.3622)"
+ style="fill:#9c694c;fill-opacity:1;stroke:none"
+ d="m 7,10 18,0 0,3 3,0 0,13 c 0,1 -1,2 -2,2 l -4,0 0,-6 -3,0 0,-3 6,0 0,-3 -6,0 0,3 -6,0 0,-3 -6,0 0,3 6,0 0,3 -3,0 0,6 -4,0 C 5,28 4,27 4,26 l 0,-10 0,-3 3,0 z"
+ id="rect3941"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccccccccccccccccc" />
+ <rect
+ style="fill:#bb8972;fill-opacity:1;stroke:none"
+ id="rect3939"
+ width="24"
+ height="24"
+ x="42"
+ y="1052.6122" />
+ <rect
+ y="1024.3622"
+ x="6.9999995"
+ height="3"
+ width="3"
+ id="rect3011-9"
+ style="fill:#2b1e0d;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#2f1f0f;fill-opacity:1;stroke:none"
+ id="rect3013-0"
+ width="3"
+ height="3"
+ x="10"
+ y="1024.3622" />
+ <rect
+ style="fill:#281c0b;fill-opacity:1;stroke:none"
+ id="rect3017-9"
+ width="3"
+ height="3"
+ x="13"
+ y="1024.3622" />
+ <rect
+ y="1024.3622"
+ x="16"
+ height="3"
+ width="3"
+ id="rect3019-6"
+ style="fill:#241808;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#261a0a;fill-opacity:1;stroke:none"
+ id="rect3021-8"
+ width="3"
+ height="3"
+ x="19"
+ y="1024.3622" />
+ <rect
+ y="1024.3622"
+ x="22"
+ height="3"
+ width="3"
+ id="rect3023-6"
+ style="fill:#2b1e0d;fill-opacity:1;stroke:none" />
+ <rect
+ y="1027.3622"
+ x="3.9999998"
+ height="3"
+ width="3"
+ id="rect3027-7"
+ style="fill:#2b1e0d;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#2b1e0d;fill-opacity:1;stroke:none"
+ id="rect3029-6"
+ width="3"
+ height="3"
+ x="6.9999995"
+ y="1027.3622" />
+ <rect
+ style="fill:#2b1e0d;fill-opacity:1;stroke:none"
+ id="rect3033-4"
+ width="3"
+ height="3"
+ x="10"
+ y="1027.3622" />
+ <rect
+ y="1027.3622"
+ x="13"
+ height="3"
+ width="3"
+ id="rect3035-4"
+ style="fill:#332411;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#422a12;fill-opacity:1;stroke:none"
+ id="rect3037-2"
+ width="3"
+ height="3"
+ x="16"
+ y="1027.3622" />
+ <rect
+ y="1027.3622"
+ x="19"
+ height="3"
+ width="3"
+ id="rect3039-4"
+ style="fill:#3f2a15;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#2c1e0e;fill-opacity:1;stroke:none"
+ id="rect3041-2"
+ width="3"
+ height="3"
+ x="22"
+ y="1027.3622" />
+ <rect
+ y="1027.3622"
+ x="25"
+ height="3"
+ width="3"
+ id="rect3043-1"
+ style="fill:#281c0b;fill-opacity:1;stroke:none" />
+ <rect
+ y="1030.3622"
+ x="3.9999998"
+ height="3"
+ width="3"
+ id="rect3045-3"
+ style="fill:#2b1e0d;fill-opacity:1;stroke:none" />
+ <rect
+ y="1030.3622"
+ x="25"
+ height="3"
+ width="3"
+ id="rect3061-7"
+ style="fill:#342512;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#6a4030;fill-opacity:1;stroke:none"
+ id="rect3177-4"
+ width="6"
+ height="3"
+ x="13"
+ y="1039.3622" />
+ <rect
+ style="fill:#41210c;fill-opacity:1;stroke:none"
+ id="rect3085"
+ width="3"
+ height="3"
+ x="10"
+ y="1042.3622" />
+ <rect
+ style="fill:#8a4c3d;fill-opacity:1;stroke:none"
+ id="rect3089"
+ width="6"
+ height="3"
+ x="13"
+ y="1042.3622" />
+ <rect
+ y="1042.3622"
+ x="19"
+ height="3"
+ width="3"
+ id="rect3091"
+ style="fill:#41210c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#421d0a;fill-opacity:1;stroke:none"
+ id="rect3093"
+ width="3"
+ height="3"
+ x="13"
+ y="1045.3622" />
+ <rect
+ y="1045.3622"
+ x="19"
+ height="3"
+ width="3"
+ id="rect3095"
+ style="fill:#45220e;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#45220e;fill-opacity:1;stroke:none"
+ id="rect3097"
+ width="3"
+ height="3"
+ x="10"
+ y="1045.3622" />
+ <rect
+ y="1045.3622"
+ x="16"
+ height="3"
+ width="3"
+ id="rect3099"
+ style="fill:#45220e;fill-opacity:1;stroke:none" />
+ <g
+ id="g3944"
+ transform="translate(-28,1.7382813e-5)">
+ <rect
+ y="1030.3622"
+ x="35"
+ height="3"
+ width="3"
+ id="rect3047-1"
+ style="fill:#b6896c;fill-opacity:1;stroke:none" />
+ <rect
+ y="1030.3622"
+ x="38"
+ height="3"
+ width="3"
+ id="rect3051-9"
+ style="fill:#bd8e72;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#c69680;fill-opacity:1;stroke:none"
+ id="rect3053-2"
+ width="3"
+ height="3"
+ x="41"
+ y="1030.3622" />
+ <rect
+ y="1030.3622"
+ x="44"
+ height="3"
+ width="3"
+ id="rect3055-9"
+ style="fill:#bd8b72;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bd8e74;fill-opacity:1;stroke:none"
+ id="rect3057-7"
+ width="3"
+ height="3"
+ x="47"
+ y="1030.3622" />
+ <rect
+ y="1030.3622"
+ x="50"
+ height="3"
+ width="3"
+ id="rect3059-2"
+ style="fill:#ac765a;fill-opacity:1;stroke:none" />
+ <rect
+ y="1033.3622"
+ x="32"
+ height="3"
+ width="3"
+ id="rect3063-8"
+ style="fill:#aa7d66;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b4846d;fill-opacity:1;stroke:none"
+ id="rect3065-6"
+ width="3"
+ height="3"
+ x="35"
+ y="1033.3622" />
+ <rect
+ style="fill:#aa7d66;fill-opacity:1;stroke:none"
+ id="rect3069-9"
+ width="3"
+ height="3"
+ x="38"
+ y="1033.3622" />
+ <rect
+ y="1033.3622"
+ x="41"
+ height="3"
+ width="3"
+ id="rect3071-7"
+ style="fill:#ad806d;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#9c725c;fill-opacity:1;stroke:none"
+ id="rect3073-1"
+ width="3"
+ height="3"
+ x="44"
+ y="1033.3622" />
+ <rect
+ y="1033.3622"
+ x="47"
+ height="3"
+ width="3"
+ id="rect3075-8"
+ style="fill:#bb8972;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#9c694c;fill-opacity:1;stroke:none"
+ id="rect3077-8"
+ width="3"
+ height="3"
+ x="50"
+ y="1033.3622" />
+ <rect
+ y="1033.3622"
+ x="53"
+ height="3"
+ width="3"
+ id="rect3079-2"
+ style="fill:#9c694c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b4846d;fill-opacity:1;stroke:none"
+ id="rect3153-6"
+ width="3"
+ height="3"
+ x="32"
+ y="1036.3622" />
+ <rect
+ style="fill:#b57b67;fill-opacity:1;stroke:none"
+ id="rect3159-7"
+ width="3"
+ height="3"
+ x="41"
+ y="1036.3622" />
+ <rect
+ y="1036.3622"
+ x="44"
+ height="3"
+ width="3"
+ id="rect3161-0"
+ style="fill:#bb8972;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#aa7d66;fill-opacity:1;stroke:none"
+ id="rect3167-3"
+ width="3"
+ height="3"
+ x="53"
+ y="1036.3622" />
+ <rect
+ y="1039.3622"
+ x="32"
+ height="3"
+ width="3"
+ id="rect3169-4"
+ style="fill:#9c6346;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b37b62;fill-opacity:1;stroke:none"
+ id="rect3171-8"
+ width="3"
+ height="3"
+ x="35"
+ y="1039.3622" />
+ <rect
+ style="fill:#b78272;fill-opacity:1;stroke:none"
+ id="rect3175-0"
+ width="3"
+ height="3"
+ x="38"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="47"
+ height="3"
+ width="3"
+ id="rect3181-9"
+ style="fill:#be886c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#a26a47;fill-opacity:1;stroke:none"
+ id="rect3183-7"
+ width="3"
+ height="3"
+ x="50"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="53"
+ height="3"
+ width="3"
+ id="rect3185-6"
+ style="fill:#805334;fill-opacity:1;stroke:none" />
+ <rect
+ y="1042.3622"
+ x="32"
+ height="3"
+ width="3"
+ id="rect3187-1"
+ style="fill:#905e43;fill-opacity:1;stroke:none" />
+ <rect
+ y="1042.3622"
+ x="53"
+ height="3"
+ width="3"
+ id="rect3203-8"
+ style="fill:#815339;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#6f452c;fill-opacity:1;stroke:none"
+ d="m 32,1045.3622 3,0 0,3 -1,0 c -1,0 -2,-1 -2,-2 z"
+ id="rect3205-4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ <rect
+ y="1045.3622"
+ x="35"
+ height="3"
+ width="3"
+ id="rect3207-2"
+ style="fill:#6d432a;fill-opacity:1;stroke:none" />
+ <rect
+ y="1045.3622"
+ x="50"
+ height="3"
+ width="3"
+ id="rect3219-4"
+ style="fill:#83553b;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#7a4e33;fill-opacity:1;stroke:none"
+ d="m 53,1045.3622 3,0 0,1 c 0,1 -1,2 -2,2 l -1,0 z"
+ id="rect3221-5"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ <rect
+ style="fill:#965f40;fill-opacity:1;stroke:none"
+ id="rect3083"
+ width="3"
+ height="3"
+ x="35"
+ y="1042.3622" />
+ <rect
+ y="1042.3622"
+ x="50"
+ height="3"
+ width="3"
+ id="rect3101"
+ style="fill:#8f5e3e;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g4045"
+ transform="matrix(1.05,0,0,1.05,14.2,-51.893092)">
+ <rect
+ y="1036.3622"
+ x="-7"
+ height="3"
+ width="6"
+ id="rect4011"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter4035)" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter4035)"
+ id="rect4039"
+ width="6"
+ height="3"
+ x="-7"
+ y="1036.3622" />
+ <rect
+ y="1036.3622"
+ x="-7"
+ height="3"
+ width="6"
+ id="rect4041"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter4035)" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter4035)"
+ id="rect4043"
+ width="6"
+ height="3"
+ x="-7"
+ y="1036.3622" />
+ </g>
+ <g
+ transform="matrix(1.05,0,0,1.05,26.2,-51.893092)"
+ id="g4051">
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter4035)"
+ id="rect4053"
+ width="6"
+ height="3"
+ x="-7"
+ y="1036.3622" />
+ <rect
+ y="1036.3622"
+ x="-7"
+ height="3"
+ width="6"
+ id="rect4055"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter4035)" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter4035)"
+ id="rect4057"
+ width="6"
+ height="3"
+ x="-7"
+ y="1036.3622" />
+ <rect
+ y="1036.3622"
+ x="-7"
+ height="3"
+ width="6"
+ id="rect4059"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter4035)" />
+ </g>
+ </g>
+</svg>
diff --git a/application/resources/sources/magitech.svg b/application/resources/sources/magitech.svg
new file mode 100644
index 00000000..c6dd6bc0
--- /dev/null
+++ b/application/resources/sources/magitech.svg
@@ -0,0 +1,886 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64"
+ height="64"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="magitech.svg"
+ inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/magitech128.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4053">
+ <stop
+ id="stop4055"
+ offset="0"
+ style="stop-color:#19c6a1;stop-opacity:0.75294119;" />
+ <stop
+ id="stop4057"
+ offset="0.30864197"
+ style="stop-color:#a4f4e3;stop-opacity:1;" />
+ <stop
+ style="stop-color:#d9f7f1;stop-opacity:1;"
+ offset="0.65432096"
+ id="stop4059" />
+ <stop
+ id="stop4061"
+ offset="1"
+ style="stop-color:#009b78;stop-opacity:0.75294119;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4001">
+ <stop
+ id="stop4003"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop4005"
+ offset="1"
+ style="stop-color:#0f5f52;stop-opacity:0" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3882">
+ <stop
+ style="stop-color:#19c6a1;stop-opacity:1;"
+ offset="0"
+ id="stop3884" />
+ <stop
+ style="stop-color:#a4f4e3;stop-opacity:1;"
+ offset="0.30864197"
+ id="stop3894" />
+ <stop
+ id="stop3935"
+ offset="0.65432096"
+ style="stop-color:#d9f7f1;stop-opacity:1;" />
+ <stop
+ style="stop-color:#009b7a;stop-opacity:1;"
+ offset="1"
+ id="stop3886" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5178">
+ <stop
+ style="stop-color:#13daba;stop-opacity:0.50196081;"
+ offset="0"
+ id="stop5180" />
+ <stop
+ style="stop-color:#03251f;stop-opacity:1"
+ offset="1"
+ id="stop5182" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4030">
+ <stop
+ id="stop4032"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop4034"
+ offset="1"
+ style="stop-color:#0c493f;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3954">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3956" />
+ <stop
+ style="stop-color:#0f5f52;stop-opacity:1;"
+ offset="1"
+ id="stop3958" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3954-9">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3956-4" />
+ <stop
+ style="stop-color:#0f5f52;stop-opacity:1;"
+ offset="1"
+ id="stop3958-2" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3954"
+ id="radialGradient4230"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1486906,1.2798015,-0.74419869,0.66795831,19.056258,-30.328315)"
+ cx="32"
+ cy="32"
+ fx="32"
+ fy="32"
+ r="20" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3954"
+ id="radialGradient4250"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1486906,1.2798015,-0.74419869,0.66795831,19.056258,-30.328315)"
+ cx="32"
+ cy="32"
+ fx="32"
+ fy="32"
+ r="20" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9"
+ id="linearGradient3917"
+ x1="43.78125"
+ y1="42.687496"
+ x2="15.453125"
+ y2="21.578121"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1428571,0,0,1.1428571,-2.2857143,-2.28571)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3911-5"
+ id="linearGradient3929-9"
+ gradientUnits="userSpaceOnUse"
+ x1="40.5"
+ y1="36.999996"
+ x2="9"
+ y2="19.499996" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3911-5">
+ <stop
+ style="stop-color:#8c3800;stop-opacity:1"
+ offset="0"
+ id="stop3913-6" />
+ <stop
+ style="stop-color:#ff6701;stop-opacity:1"
+ offset="1"
+ id="stop3915-3" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9"
+ id="linearGradient3986"
+ gradientUnits="userSpaceOnUse"
+ x1="28"
+ y1="28"
+ x2="44"
+ y2="32" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9"
+ id="linearGradient3925-4"
+ x1="16"
+ y1="16"
+ x2="48"
+ y2="48"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3919-9">
+ <stop
+ style="stop-color:#fff306;stop-opacity:1;"
+ offset="0"
+ id="stop3921-2" />
+ <stop
+ style="stop-color:#ff7f01;stop-opacity:1;"
+ offset="1"
+ id="stop3923-3" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(-12,-12)"
+ y2="48"
+ x2="48"
+ y1="16"
+ x1="16"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4025"
+ xlink:href="#linearGradient3919-9"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3919-9-3">
+ <stop
+ style="stop-color:#ff9e06;stop-opacity:1"
+ offset="0"
+ id="stop3921-2-9" />
+ <stop
+ style="stop-color:#af4600;stop-opacity:1"
+ offset="1"
+ id="stop3923-3-4" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(-8,-8)"
+ y2="48"
+ x2="48"
+ y1="16"
+ x1="16"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4065"
+ xlink:href="#linearGradient3919-9-3"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3919-9-35">
+ <stop
+ style="stop-color:#ff9e06;stop-opacity:1"
+ offset="0"
+ id="stop3921-2-3" />
+ <stop
+ style="stop-color:#af4600;stop-opacity:1"
+ offset="1"
+ id="stop3923-3-5" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(-8,-8)"
+ y2="48"
+ x2="48"
+ y1="16"
+ x1="16"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4098"
+ xlink:href="#linearGradient3919-9-35"
+ inkscape:collect="always" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3954-5"
+ id="radialGradient4024"
+ gradientUnits="userSpaceOnUse"
+ cx="32"
+ cy="32"
+ fx="32"
+ fy="32"
+ r="20"
+ gradientTransform="matrix(1.1486906,1.2798015,-0.74419869,0.66795831,19.056258,-30.328315)" />
+ <linearGradient
+ id="linearGradient3954-5">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3956-5" />
+ <stop
+ style="stop-color:#0f5f52;stop-opacity:1;"
+ offset="1"
+ id="stop3958-3" />
+ </linearGradient>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter3916-4"
+ x="-0.11491533"
+ width="1.2298307"
+ y="-0.11548609"
+ height="1.2309722">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.6059988"
+ id="feGaussianBlur3918-4" />
+ </filter>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter4082-1"
+ x="-0.13465963"
+ width="1.2693193"
+ y="-0.12490681"
+ height="1.2498136">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.763901"
+ id="feGaussianBlur4084-4" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9"
+ id="linearGradient4440"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1428571,0,0,1.1428571,-2.2857143,-2.28571)"
+ x1="43.78125"
+ y1="42.687496"
+ x2="15.453125"
+ y2="21.578121" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9"
+ id="linearGradient4442"
+ gradientUnits="userSpaceOnUse"
+ x1="28"
+ y1="28"
+ x2="44"
+ y2="32" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3954-5"
+ id="radialGradient4453"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3784287,1.5357628,-0.89303843,0.80155051,16.46751,-42.794012)"
+ cx="32"
+ cy="32"
+ fx="32"
+ fy="32"
+ r="20" />
+ <filter
+ inkscape:collect="always"
+ id="filter4462">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.68"
+ id="feGaussianBlur4464" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9-1"
+ id="linearGradient4438-1"
+ gradientUnits="userSpaceOnUse"
+ x1="16"
+ y1="16"
+ x2="48"
+ y2="48" />
+ <linearGradient
+ id="linearGradient3919-9-1">
+ <stop
+ style="stop-color:#fff306;stop-opacity:1;"
+ offset="0"
+ id="stop3921-2-92" />
+ <stop
+ style="stop-color:#ff7f01;stop-opacity:1;"
+ offset="1"
+ id="stop3923-3-6" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9"
+ id="linearGradient5119"
+ gradientUnits="userSpaceOnUse"
+ x1="16"
+ y1="16"
+ x2="48"
+ y2="48" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5178"
+ id="linearGradient5184"
+ x1="10.429825"
+ y1="1007.6377"
+ x2="38.114223"
+ y2="1024.6941"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter3992">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.44"
+ id="feGaussianBlur3994" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3954-1"
+ id="radialGradient4024-7"
+ gradientUnits="userSpaceOnUse"
+ cx="32"
+ cy="32"
+ fx="32"
+ fy="32"
+ r="20"
+ gradientTransform="matrix(1.1486906,1.2798015,-0.74419869,0.66795831,19.056258,-30.328315)" />
+ <linearGradient
+ id="linearGradient3954-1">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3956-2" />
+ <stop
+ style="stop-color:#0f5f52;stop-opacity:1;"
+ offset="1"
+ id="stop3958-9" />
+ </linearGradient>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter3884">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.505"
+ id="feGaussianBlur3886" />
+ </filter>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter3898"
+ x="-0.20110182"
+ width="1.4022036"
+ y="-0.20210065"
+ height="1.4042013">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.0604979"
+ id="feGaussianBlur3900" />
+ </filter>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter3916"
+ x="-0.11491533"
+ width="1.2298307"
+ y="-0.11548609"
+ height="1.2309722">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.6059988"
+ id="feGaussianBlur3918" />
+ </filter>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter4110"
+ x="-0.17716113"
+ width="1.3543223"
+ y="-0.17804106"
+ height="1.3560821">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.93424815"
+ id="feGaussianBlur4112" />
+ </filter>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter4082"
+ x="-0.13465963"
+ width="1.2693193"
+ y="-0.12490681"
+ height="1.2498136">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.763901"
+ id="feGaussianBlur4084" />
+ </filter>
+ <linearGradient
+ gradientTransform="translate(-72.736544,988.32667)"
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9-7"
+ id="linearGradient3986-9"
+ gradientUnits="userSpaceOnUse"
+ x1="28"
+ y1="28"
+ x2="44"
+ y2="32" />
+ <linearGradient
+ id="linearGradient3919-9-7">
+ <stop
+ style="stop-color:#fff306;stop-opacity:1;"
+ offset="0"
+ id="stop3921-2-93" />
+ <stop
+ style="stop-color:#ff7f01;stop-opacity:1;"
+ offset="1"
+ id="stop3923-3-0" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9-7"
+ id="linearGradient3917-1"
+ x1="43.78125"
+ y1="42.687496"
+ x2="15.453125"
+ y2="21.578121"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1428571,0,0,1.1428571,-75.022254,986.04097)" />
+ <linearGradient
+ id="linearGradient5362">
+ <stop
+ style="stop-color:#fff306;stop-opacity:1;"
+ offset="0"
+ id="stop5364" />
+ <stop
+ style="stop-color:#ff7f01;stop-opacity:1;"
+ offset="1"
+ id="stop5366" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(-72.736544,988.32667)"
+ inkscape:collect="always"
+ xlink:href="#linearGradient3919-9-7"
+ id="linearGradient3925-4-8"
+ x1="16"
+ y1="16"
+ x2="48"
+ y2="48"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient5369">
+ <stop
+ style="stop-color:#fff306;stop-opacity:1;"
+ offset="0"
+ id="stop5371" />
+ <stop
+ style="stop-color:#ff7f01;stop-opacity:1;"
+ offset="1"
+ id="stop5373" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3882"
+ id="linearGradient3888"
+ x1="42.125"
+ y1="10.375"
+ x2="24.75"
+ y2="56.125"
+ gradientUnits="userSpaceOnUse"
+ spreadMethod="pad" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5178-5"
+ id="linearGradient5184-3"
+ x1="-58.570175"
+ y1="1003.1377"
+ x2="-18.635777"
+ y2="1034.4441"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5178-5">
+ <stop
+ style="stop-color:#13daba;stop-opacity:1"
+ offset="0"
+ id="stop5180-8" />
+ <stop
+ style="stop-color:#03251f;stop-opacity:1"
+ offset="1"
+ id="stop5182-3" />
+ </linearGradient>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter4462-8">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.68"
+ id="feGaussianBlur4464-6" />
+ </filter>
+ <linearGradient
+ gradientTransform="translate(0.03199987,-988.33014)"
+ y2="1024.6941"
+ x2="38.114223"
+ y1="1007.6377"
+ x1="10.429825"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3913"
+ xlink:href="#linearGradient5178-5"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4001"
+ id="linearGradient3999"
+ x1="38.625706"
+ y1="34.124741"
+ x2="31.201086"
+ y2="28.82144"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4053"
+ id="linearGradient4023"
+ gradientUnits="userSpaceOnUse"
+ spreadMethod="pad"
+ x1="42.125"
+ y1="10.375"
+ x2="24.75"
+ y2="56.125"
+ gradientTransform="translate(0.375,988.42468)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4001"
+ id="linearGradient4081"
+ gradientUnits="userSpaceOnUse"
+ x1="38.183765"
+ y1="33.064079"
+ x2="31.201086"
+ y2="28.82144" />
+ <filter
+ inkscape:collect="always"
+ id="filter4101"
+ x="-0.2597809"
+ width="1.5195618"
+ y="-0.34475598"
+ height="1.689512">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.3585616"
+ id="feGaussianBlur4103" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter4153"
+ x="-0.10485404"
+ width="1.2097081"
+ y="-0.054822425"
+ height="1.1096448">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.0071355"
+ id="feGaussianBlur4155" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="20"
+ inkscape:cx="33.36206"
+ inkscape:cy="39.612969"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="1607"
+ inkscape:window-height="1030"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="4"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingx="1px"
+ spacingy="1px" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="11.25,96.5"
+ id="guide4252" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-988.36218)">
+ <g
+ id="g4430">
+ <path
+ style="color:#000000;fill:url(#linearGradient5184);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter4462);enable-background:accumulate;opacity:1"
+ d="m 28,992.36214 -4,4.00004 0,4.00002 -3,-3.00002 -6,0 -6,6.00002 0,6 3,3 -4,0 -4,4 0,8 4,4 4,0 -3,3 0,6 6,6 6,0 c 1.147043,0.435 1.437261,0.5242 1.5,3.3125 2.236628,0.5754 7.083754,1.6875 9.5,1.6875 15.46397,0 28,-12.536 28,-28 0,-11.5626 -6.99928,-21.50902 -17,-25.78131 -0.666614,1.59048 -2.504535,2.24015 -3,1.78129 l -4,-4.00004 z"
+ id="rect4162"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccccccsscccc" />
+ <path
+ id="rect3071"
+ d="m 28,8 0,4.40625 c -0.222736,0.04523 -0.43627,0.103686 -0.65625,0.15625 -0.410499,0.09787 -0.818477,0.190041 -1.21875,0.3125 -0.02176,0.0067 -0.04077,0.02449 -0.0625,0.03125 -0.591863,0.183324 -1.183088,0.389835 -1.75,0.625 -0.500562,0.208804 -0.989768,0.440151 -1.46875,0.6875 -0.08271,0.04255 -0.167971,0.08132 -0.25,0.125 -0.556479,0.297288 -1.101494,0.621939 -1.625,0.96875 l -3.125,-3.125 -5.65625,5.65625 3.125,3.125 c -0.341672,0.515748 -0.675122,1.045976 -0.96875,1.59375 -0.04801,0.08987 -0.07834,0.190559 -0.125,0.28125 -0.232389,0.450012 -0.457832,0.905888 -0.65625,1.375 -0.01273,0.03027 -0.01866,0.0634 -0.03125,0.09375 -0.237526,0.569414 -0.440047,1.155357 -0.625,1.75 -0.130645,0.421788 -0.240463,0.848047 -0.34375,1.28125 C 12.509936,27.56373 12.451477,27.777264 12.40625,28 L 8,28 l 0,8 4.40625,0 c 0.04523,0.222736 0.103686,0.43627 0.15625,0.65625 0.09787,0.410499 0.190041,0.818477 0.3125,1.21875 0.0067,0.02176 0.02449,0.04077 0.03125,0.0625 0.183324,0.591863 0.389835,1.183088 0.625,1.75 0.208804,0.500562 0.440151,0.989768 0.6875,1.46875 0.04666,0.09069 0.07699,0.191375 0.125,0.28125 0.01751,0.03266 0.04481,0.06119 0.0625,0.09375 0.278784,0.514793 0.584173,1.01383 0.90625,1.5 l -3.125,3.125 5.65625,5.65625 3.125,-3.125 c 0.523506,0.346811 1.068521,0.671462 1.625,0.96875 0.08203,0.04368 0.167292,0.08245 0.25,0.125 0.450012,0.232389 0.905888,0.457832 1.375,0.65625 0.03027,0.01273 0.0634,0.01866 0.09375,0.03125 0.569414,0.237526 1.155357,0.440047 1.75,0.625 0.421788,0.130645 0.848047,0.240463 1.28125,0.34375 0.21027,0.05024 0.412209,0.112707 0.625,0.15625 0.01001,0.002 0.02124,-0.002 0.03125,0 l 8,0 c 0.22283,-0.04525 0.436163,-0.103776 0.65625,-0.15625 0.923563,-0.220682 1.81865,-0.499897 2.6875,-0.84375 0.618794,-0.243545 1.225752,-0.510633 1.8125,-0.8125 0.08255,-0.04263 0.168126,-0.08126 0.25,-0.125 0.558072,-0.297141 1.100165,-0.621059 1.625,-0.96875 l 5.65625,-5.65625 c 0.342758,-0.517388 0.6751,-1.044039 0.96875,-1.59375 0.04827,-0.09005 0.07808,-0.190386 0.125,-0.28125 0.301867,-0.586748 0.568955,-1.193706 0.8125,-1.8125 0.343853,-0.86885 0.623068,-1.763937 0.84375,-2.6875 0.05247,-0.220087 0.111003,-0.43342 0.15625,-0.65625 l 0,-8 c -0.002,-0.0098 0.002,-0.02142 0,-0.03125 -0.04353,-0.2127 -0.106134,-0.414805 -0.15625,-0.625 -0.220682,-0.923563 -0.499897,-1.81865 -0.84375,-2.6875 -0.243545,-0.618794 -0.510633,-1.225752 -0.8125,-1.8125 -0.04692,-0.09086 -0.07673,-0.191205 -0.125,-0.28125 C 49.3626,22.012789 49.030258,21.486138 48.6875,20.96875 L 43.03125,15.3125 c -0.484994,-0.321298 -0.986607,-0.627358 -1.5,-0.90625 -0.04094,-0.02217 -0.08389,-0.04061 -0.125,-0.0625 -0.08187,-0.04374 -0.167451,-0.08237 -0.25,-0.125 -0.586748,-0.301867 -1.193706,-0.568955 -1.8125,-0.8125 -0.86885,-0.343853 -1.763937,-0.623068 -2.6875,-0.84375 -0.210195,-0.05012 -0.4123,-0.112724 -0.625,-0.15625 -0.0098,-0.002 -0.02142,0.002 -0.03125,0 L 36,8 z m 4,20 c 2.209139,0 4,1.790861 4,4 0,2.209139 -1.790861,4 -4,4 -0.276142,0 -0.55211,-0.04047 -0.8125,-0.09375 C 29.364767,35.533265 28,33.932997 28,32 28,31.723858 28.040466,31.44789 28.09375,31.1875 28.466735,29.364767 30.067003,28 32,28 z"
+ style="color:#000000;fill:url(#linearGradient5119);fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccssscsss"
+ transform="translate(0,988.36218)" />
+ <path
+ id="path3874"
+ transform="translate(0,988.36218)"
+ d="m 32,16 c -8.836556,0 -16,7.163444 -16,16 0,8.836556 7.163444,16 16,16 8.836556,0 16,-7.163444 16,-16 0,-8.836556 -7.163444,-16 -16,-16 z m 0,12 c 2.209139,0 4,1.790861 4,4 0,2.209139 -1.790861,4 -4,4 -2.209139,0 -4,-1.790861 -4,-4 0,-2.209139 1.790861,-4 4,-4 z"
+ style="fill:url(#linearGradient4440);fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3876"
+ transform="translate(0,988.36218)"
+ d="m 32,24 c -4.418278,0 -8,3.581722 -8,8 0,4.418278 3.581722,8 8,8 4.418278,0 8,-3.581722 8,-8 0,-4.418278 -3.581722,-8 -8,-8 z m 0,4 c 2.209139,0 4,1.790861 4,4 0,2.209139 -1.790861,4 -4,4 -2.209139,0 -4,-1.790861 -4,-4 0,-2.209139 1.790861,-4 4,-4 z"
+ style="fill:url(#linearGradient4442);fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3927"
+ d="m 32,1004.3622 c -8.836556,0 -16,7.1634 -16,16 0,4.8907 2.198478,9.2526 5.65625,12.1875 C 19.373756,1029.7839 18,1026.2282 18,1022.3622 c 0,-8.8366 7.163444,-16 16,-16 3.86599,0 7.42176,1.3737 10.1875,3.6562 -2.93487,-3.4577 -7.29683,-5.6562 -12.1875,-5.6562 z"
+ style="fill:#000000;fill-opacity:0.39130435;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3970"
+ d="m 39.5625,1017.7997 c 0.272555,0.8054 0.4375,1.665 0.4375,2.5625 0,4.4183 -3.581722,8 -8,8 -2.720651,0 -5.117207,-1.3623 -6.5625,-3.4375 1.069255,3.1597 4.041685,5.4375 7.5625,5.4375 4.418278,0 8,-3.5817 8,-8 0,-1.6976 -0.535669,-3.2676 -1.4375,-4.5625 z"
+ style="fill:#000000;fill-opacity:0.39130435;stroke:none" />
+ </g>
+ <g
+ id="g5168">
+ <path
+ style="fill:url(#linearGradient4081);fill-opacity:1;stroke:none"
+ d="M 42.3125,10.34375 C 42.036647,17.156583 44.403627,25.298186 33,31 18.729736,38.135058 22.534188,45.86375 26.144531,55.257813 c 0.677562,0.217822 -0.12077,-0.0069 0.580514,0.151895 C 28.421984,55.79405 30.185284,56 32,56 45.254834,56 56,45.254843 56,32 56,22.438466 50.403908,14.202051 42.3125,10.34375 z"
+ id="path3997"
+ transform="translate(0,988.36218)"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cscsssc" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter4101);enable-background:accumulate"
+ id="path4083"
+ sodipodi:cx="13.611806"
+ sodipodi:cy="37.881245"
+ sodipodi:rx="6.2755728"
+ sodipodi:ry="4.7287765"
+ d="m 19.887379,37.881245 c 0,2.611631 -2.80967,4.728776 -6.275573,4.728776 -3.465903,0 -6.2755729,-2.117145 -6.2755729,-4.728776 0,-2.611631 2.8096699,-4.728777 6.2755729,-4.728777 3.465903,0 6.275573,2.117146 6.275573,4.728777 z"
+ transform="matrix(1.338311,0,0,1.4370006,15.945267,978.21621)" />
+ <path
+ id="path3014"
+ d="m 42.3125,10.34375 c 1.626929,3.407127 2.260167,8.676072 -0.03685,13.414814 -1.556024,3.210082 -3.304624,6.220765 -7.658776,8.522607 -4.247767,2.245602 -8.002291,2.8045 -9.732287,4.512181 -4.014531,3.96275 -2.278905,11.00222 1.274261,18.448146 C 28.475952,55.986401 29.435328,56 32,56 45.254834,56 56,45.254843 56,32 56,22.438466 50.403908,14.202051 42.3125,10.34375 z"
+ style="opacity:0.87029275;fill:url(#radialGradient4453);fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cssscssc"
+ transform="translate(0,988.36218)" />
+ <path
+ sodipodi:nodetypes="ssccs"
+ inkscape:connector-curvature="0"
+ id="path3902"
+ d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
+ style="fill:#00ffcc;fill-opacity:1;stroke:none;filter:url(#filter3916-4);opacity:1"
+ transform="matrix(-1.8719467,0,0,-1.871948,82.871731,2921.8992)" />
+ <path
+ transform="matrix(-1.2147547,0,0,-1.2147555,70.284181,2259.2303)"
+ style="fill:#d7f4d7;fill-opacity:1;stroke:none;filter:url(#filter3916-4);opacity:1"
+ d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
+ id="path3920"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssccs" />
+ <path
+ transform="translate(0,988.36218)"
+ id="path4036"
+ d="M 44.78125 21.6875 L 41.28125 22.8125 C 41.121938 23.226574 40.928384 23.623793 40.71875 24.03125 L 44.78125 21.6875 z M 36.90625 28.53125 C 35.824388 29.387261 34.550485 30.224758 33 31 C 31.216966 31.891508 29.738803 32.739507 28.5 33.5625 C 29.458327 33.796351 30.4375 34.03125 30.4375 34.03125 L 30.4375 37.09375 C 30.4375 38.113344 28.40625 40.167906 28.40625 41.1875 L 28.40625 44.25 C 28.40625 44.25 29.900129 47.688 30.03125 48.625 C 30.45923 51.683387 29.509385 42.154431 29.71875 41.78125 C 30.864146 39.739651 32.416773 37.15625 33.03125 37.15625 C 33.264553 37.15625 34.697228 36.035418 35.9375 37.4375 C 37.107979 38.760684 38.10456 42.614278 38.4375 42.28125 C 39.293559 41.424965 36.5625 34.03125 36.5625 34.03125 L 42.78125 33.34375 L 47.1875 28.875 L 42.03125 32 L 38.59375 32 L 36.5625 29.96875 L 36.90625 28.53125 z "
+ style="opacity:0.86178864;fill:#000000;fill-opacity:0.86666667;stroke:none;filter:url(#filter4082-1)" />
+ <path
+ style="opacity:0.9497908;fill:url(#linearGradient3888);fill-opacity:1;stroke:none"
+ d="m 42.327724,10.343784 c -0.548738,-0.247754 -2.642269,-0.03831 -5.109835,2.376588 l 2.056042,0.657478 c 1.127203,-0.71102 1.815028,-0.50787 1.967315,-0.459692 1.494171,0.472705 0.645754,4.388833 0.1693,6.47919 -1.552718,8.361211 -9.002523,11.324205 -15.159208,14.152866 -3.345171,1.559801 -4.737296,4.36486 -5.23858,8.881728 -0.501284,4.516868 2.508904,8.819746 5.132693,12.829082 0.669966,0.210667 -0.142632,-0.006 0.54783,0.143209 0,0 -4.830399,-7.064617 -3.406092,-13.736155 1.213309,-5.683211 5.53111,-6.436498 9.626097,-8.496005 7.176567,-3.609337 10.985289,-9.424678 11.4425,-16.679509 0.19205,-3.226247 -1.020059,-5.693669 -2.028062,-6.14878 z"
+ id="path3112"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sccscczccsscs"
+ transform="translate(0,988.36218)" />
+ <path
+ sodipodi:nodetypes="ccczccsscc"
+ inkscape:connector-curvature="0"
+ id="path4021"
+ d="m 42.985537,999.28252 c 0.436543,5.62048 0.126695,2.81738 -1.199991,8.53948 -1.552718,8.3612 -6.315023,11.7617 -12.471708,14.5904 -3.345171,1.5598 -6.976573,2.6274 -7.477857,7.1442 -0.501284,4.5169 1.758904,9.6635 4.382693,13.6728 0.669966,0.2107 -0.142632,-0.01 0.54783,0.1432 0,0 -4.450497,-6.5927 -3.02619,-13.2642 1.213309,-5.6833 5.46861,-6.3427 9.563597,-8.4022 7.176567,-3.6094 11.032164,-9.3934 11.489375,-16.6483 0.19205,-3.2262 -0.760684,-4.5078 -1.807749,-5.77538 z"
+ style="opacity:1;fill:url(#linearGradient4023);fill-opacity:1;stroke:none;filter:url(#filter4153)" />
+ </g>
+ <g
+ transform="translate(72.5,-1.500004)"
+ id="g4268">
+ <path
+ transform="matrix(1.1666667,0,0,1.1666667,-5.3333344,983.02885)"
+ d="M 56,32 C 56,45.254834 45.254834,56 32,56 18.745166,56 8,45.254834 8,32 8,18.745166 18.745166,8 32,8 45.254834,8 56,18.745166 56,32 z"
+ sodipodi:ry="24"
+ sodipodi:rx="24"
+ sodipodi:cy="32"
+ sodipodi:cx="32"
+ id="path3005"
+ style="fill:#032620;fill-opacity:1;stroke:none;filter:url(#filter3992)"
+ sodipodi:type="arc" />
+ <g
+ transform="matrix(1.0195929,0,0,1.0195936,-0.15674338,-19.992546)"
+ id="g4116">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient4024-7);fill-opacity:1;stroke:none"
+ id="path3014-0"
+ sodipodi:cx="32"
+ sodipodi:cy="32"
+ sodipodi:rx="20"
+ sodipodi:ry="20"
+ d="M 52,32 C 52,43.045695 43.045695,52 32,52 20.954305,52 12,43.045695 12,32 12,20.954305 20.954305,12 32,12 c 11.045695,0 20,8.954305 20,20 z"
+ transform="matrix(1.1769403,0,0,1.1769403,-6.1232836,982.70009)" />
+ <path
+ style="fill:#00ffcc;fill-opacity:1;stroke:none;filter:url(#filter3884)"
+ d="m 28,16 c -6.627417,0 -12,5.372583 -12,12 0,0.20181 0.0214,0.394383 0.03125,0.59375 C 20,20 22,22 28.65625,16.03125 28.436252,16.019242 28.222996,16 28,16 z"
+ transform="matrix(1.1769403,0,0,1.1769403,-5.6620909,982.68843)"
+ id="path3866"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssccs" />
+ <path
+ sodipodi:nodetypes="ssccs"
+ inkscape:connector-curvature="0"
+ id="path3888"
+ d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
+ style="fill:#00ffcc;fill-opacity:1;stroke:none;filter:url(#filter3898)"
+ transform="matrix(1.487885,0,0,1.487885,-10.597031,-493.22036)" />
+ <path
+ transform="matrix(-1.8359746,0,0,-1.8359746,81.432966,2885.3572)"
+ style="fill:#00ffcc;fill-opacity:1;stroke:none;filter:url(#filter3916)"
+ d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
+ id="path3902-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssccs" />
+ <path
+ sodipodi:nodetypes="ssccs"
+ inkscape:connector-curvature="0"
+ id="path3920-6"
+ d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
+ style="fill:#d7f4d7;fill-opacity:1;stroke:none;filter:url(#filter3916)"
+ transform="matrix(-1.1914115,0,0,-1.1914115,69.087304,2235.4229)" />
+ <path
+ transform="matrix(0.58516297,0,0,0.58516297,6.7391969,416.10681)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter4110)"
+ d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 5.570868,-4.4816 8.905966,-4.4575 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
+ id="path3964"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccsc" />
+ <path
+ style="opacity:0.86178864;fill:#000000;fill-opacity:0.86666667;stroke:none;filter:url(#filter4082)"
+ d="M 30,29 30.450431,19.407328 32.447263,28.5316 35,27 l 1,-6 -1,-4 1,-2 0,3 1.125,3.375 -0.07418,2.744617 L 44.0828,21.873859 37,26 l -1,4 2,2 3.375,0 5.0625,-3.0625 -4.3125,4.375 L 36,34 c 0,0 2.686048,7.256632 1.846439,8.096462 -0.326542,0.326628 -1.289256,-3.475594 -2.437243,-4.77335 C 34.192758,35.947974 32.79132,37.0625 32.5625,37.0625 c -0.602669,0 -2.136064,2.519769 -3.25945,4.522134 -0.205342,0.36601 0.728015,9.714733 0.308259,6.715119 C 29.482708,47.380759 28,44 28,44 c 0,0 0,-2 0,-3 0,-1 2,-3 2,-4 0,-1 0,-3 0,-3 0,0 -4.25,-1.125 -5.25,-1.125 -0.47674,0 -1.893857,0.89205 -3.377184,1.040709 C 19.744745,34.078874 18.0625,33.5 18.0625,33.5 L 16.774038,34.754808 17,39 l -2,-4 2,-3 3.8125,-0.0625 1.170423,-6.693425 3.092068,-2.055016 -2.122126,3.038537 -0.913529,5.350612 L 28,31 z"
+ id="path4036-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccccccssssscsscsscccccccccccc"
+ transform="translate(0,988.36218)" />
+ </g>
+ </g>
+ <path
+ style="color:#000000;fill:url(#linearGradient5184-3);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter4462-8);enable-background:accumulate"
+ d="m -44.736544,992.32667 -4,4 0,4.00003 -3,-3.00003 -6,0 -6,6.00003 0,6 3,3 -4,0 -4,4 0,8 4,4 4,0 -3,3 0,6 6,6 6,0 3,-3 0,4 4,4 8,0 4,-4 0,-4 3,3 6,0 6,-6 0,-6 -3,-3 4,0 4,-4 0,-8 -4,-4 -4,0 3,-3 0,-6 -6,-6.00003 -6,0 -3,3.00003 0,-4.00003 -4,-4 z"
+ id="rect4162-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccc" />
+ <path
+ inkscape:connector-curvature="0"
+ style="color:#000000;fill:url(#linearGradient3925-4-8);fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m -44.736544,996.32667 0,4.40623 c -0.222736,0.045 -0.43627,0.1037 -0.65625,0.1563 -0.410499,0.098 -0.818477,0.19 -1.21875,0.3125 -0.0218,0.01 -0.0408,0.024 -0.0625,0.031 -0.59186,0.1833 -1.18309,0.3898 -1.75,0.625 -0.50056,0.2088 -0.98977,0.4401 -1.46875,0.6875 -0.0827,0.043 -0.16797,0.081 -0.25,0.125 -0.55648,0.2973 -1.10149,0.6219 -1.625,0.9687 l -3.125,-3.125 -5.65625,5.6562 3.125,3.125 c -0.34167,0.5158 -0.67512,1.046 -0.96875,1.5938 -0.048,0.09 -0.0783,0.1905 -0.125,0.2812 -0.23239,0.45 -0.45783,0.9059 -0.65625,1.375 -0.0127,0.03 -0.0187,0.063 -0.0312,0.094 -0.23753,0.5694 -0.44005,1.1553 -0.625,1.75 -0.13065,0.4218 -0.24046,0.848 -0.34375,1.2812 -0.0526,0.22 -0.11102,0.4335 -0.15625,0.6563 l -4.40625,0 0,8 4.40625,0 c 0.0452,0.2227 0.10369,0.4363 0.15625,0.6562 0.0979,0.4105 0.19004,0.8185 0.3125,1.2188 0.007,0.022 0.0245,0.041 0.0312,0.062 0.18332,0.5918 0.38983,1.1831 0.625,1.75 0.2088,0.5005 0.44015,0.9897 0.6875,1.4687 0.0467,0.091 0.077,0.1914 0.125,0.2813 0.0175,0.033 0.0448,0.061 0.0625,0.094 0.27878,0.5148 0.58417,1.0139 0.90625,1.5 l -3.125,3.125 5.65625,5.6563 3.125,-3.125 c 0.52351,0.3468 1.06852,0.6714 1.625,0.9687 0.082,0.044 0.16729,0.082 0.25,0.125 0.45001,0.2324 0.90589,0.4579 1.375,0.6563 0.0303,0.013 0.0634,0.019 0.0937,0.031 0.56941,0.2376 1.15536,0.4401 1.75,0.625 0.42179,0.1307 0.848047,0.2405 1.28125,0.3438 0.21027,0.05 0.412209,0.1127 0.625,0.1562 0.01001,0 0.02124,0 0.03125,0 l 0,4.4063 8,0 0,-4.4063 c 0.22283,-0.045 0.436163,-0.1037 0.65625,-0.1562 0.923563,-0.2207 1.81865,-0.4999 2.6875,-0.8438 0.618794,-0.2435 1.225752,-0.5106 1.8125,-0.8125 0.08255,-0.043 0.168126,-0.081 0.25,-0.125 0.558072,-0.2971 1.100165,-0.621 1.625,-0.9687 l 3.125,3.125 5.65625,-5.6563 -3.125,-3.125 c 0.342758,-0.5174 0.6751,-1.044 0.96875,-1.5937 0.04827,-0.09 0.07808,-0.1904 0.125,-0.2813 0.301867,-0.5867 0.568955,-1.1937 0.8125,-1.8125 0.343853,-0.8688 0.623068,-1.7639 0.84375,-2.6875 0.05247,-0.2201 0.111003,-0.4334 0.15625,-0.6562 l 4.40625,0 0,-8 -4.40625,0 c -0.002,-0.01 0.002,-0.021 0,-0.031 -0.04353,-0.2127 -0.106134,-0.4148 -0.15625,-0.625 -0.220682,-0.9235 -0.499897,-1.8186 -0.84375,-2.6875 -0.243545,-0.6188 -0.510633,-1.2257 -0.8125,-1.8125 -0.04692,-0.091 -0.07673,-0.1912 -0.125,-0.2812 -0.29365,-0.5497 -0.625992,-1.0764 -0.96875,-1.5938 l 3.125,-3.125 -5.65625,-5.6562 -3.125,3.125 c -0.484994,-0.3213 -0.986607,-0.6273 -1.5,-0.9062 -0.04094,-0.022 -0.08389,-0.041 -0.125,-0.062 -0.08187,-0.044 -0.167451,-0.082 -0.25,-0.125 -0.586748,-0.3019 -1.193706,-0.569 -1.8125,-0.8125 -0.86885,-0.3439 -1.763937,-0.6231 -2.6875,-0.8438 -0.210195,-0.05 -0.4123,-0.1127 -0.625,-0.1562 -0.0098,0 -0.02142,0 -0.03125,0 l 0,-4.40633 -8,0 z m 4,20.00003 c 2.209139,0 4,1.7908 4,4 0,2.2091 -1.790861,4 -4,4 -0.276142,0 -0.55211,-0.041 -0.8125,-0.094 -1.822733,-0.373 -3.1875,-1.9732 -3.1875,-3.9062 0,-0.2762 0.04047,-0.5521 0.09375,-0.8125 0.372985,-1.8228 1.973253,-3.1875 3.90625,-3.1875 z"
+ id="rect3071-3" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:url(#linearGradient3917-1);fill-opacity:1;stroke:none"
+ d="m -40.736544,1004.3267 c -8.83656,0 -16,7.1634 -16,16 0,8.8365 7.16344,16 16,16 8.836556,0 16,-7.1635 16,-16 0,-8.8366 -7.163444,-16 -16,-16 z m 0,12 c 2.209139,0 4,1.7908 4,4 0,2.2091 -1.790861,4 -4,4 -2.209139,0 -4,-1.7909 -4,-4 0,-2.2092 1.790861,-4 4,-4 z"
+ id="path3874-0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:url(#linearGradient3986-9);fill-opacity:1;stroke:none"
+ d="m -40.736544,1012.3267 c -4.418278,0 -8,3.5817 -8,8 0,4.4183 3.581722,8 8,8 4.418278,0 8,-3.5817 8,-8 0,-4.4183 -3.581722,-8 -8,-8 z m 0,4 c 2.209139,0 4,1.7908 4,4 0,2.2091 -1.790861,4 -4,4 -2.209139,0 -4,-1.7909 -4,-4 0,-2.2092 1.790861,-4 4,-4 z"
+ id="path3876-7" />
+ <path
+ style="fill:#000000;fill-opacity:0.39130435;stroke:none"
+ d="m -40.736544,1004.3267 c -8.83656,0 -16,7.1634 -16,16 0,4.8907 2.19848,9.2526 5.65625,12.1875 -2.28249,-2.7658 -3.65625,-6.3215 -3.65625,-10.1875 0,-8.8366 7.16344,-16 16,-16 3.86599,0 7.42176,1.3737 10.1875,3.6562 -2.93487,-3.4577 -7.29683,-5.6562 -12.1875,-5.6562 z"
+ id="path3927-9"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000000;fill-opacity:0.39130435;stroke:none"
+ d="m -33.174044,1017.7642 c 0.272555,0.8054 0.4375,1.665 0.4375,2.5625 0,4.4183 -3.581722,8 -8,8 -2.720651,0 -5.117207,-1.3623 -6.5625,-3.4375 1.069255,3.1597 4.041685,5.4375 7.5625,5.4375 4.418278,0 8,-3.5817 8,-8 0,-1.6976 -0.535669,-3.2676 -1.4375,-4.5625 z"
+ id="path3970-3"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/application/resources/sources/meat.svg b/application/resources/sources/meat.svg
new file mode 100644
index 00000000..69a20073
--- /dev/null
+++ b/application/resources/sources/meat.svg
@@ -0,0 +1,371 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32px"
+ height="32px"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="meat.svg"
+ inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/meat128.png"
+ inkscape:export-xdpi="360"
+ inkscape:export-ydpi="360">
+ <defs
+ id="defs2987">
+ <filter
+ inkscape:collect="always"
+ id="filter4454"
+ x="-0.16296296"
+ width="1.3259259"
+ y="-0.16296296"
+ height="1.3259259">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.2222222"
+ id="feGaussianBlur4456" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter4863">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.53333333"
+ id="feGaussianBlur4865" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter4974"
+ x="-0.18666667"
+ width="1.3733333"
+ y="-0.18666667"
+ height="1.3733333">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.8666667"
+ id="feGaussianBlur4976" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="9.6045985"
+ inkscape:cy="9.7795413"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1607"
+ inkscape:window-height="1030"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3004"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata2990">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ style="fill:#ffcc00;stroke:none;filter:url(#filter4974)"
+ d="m 4,10 6,-6 4,0 10,10 0,4 2,0 2,2 0,4 -4,4 -6,0 0,-4 -4,0 -2,-2 -2,0 -6,-6 z"
+ id="path4952"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccccc" />
+ <g
+ transform="translate(-68,24)"
+ id="g4869" />
+ <g
+ id="g3473"
+ transform="translate(4,4)">
+ <rect
+ y="2"
+ x="6"
+ height="2"
+ width="4"
+ id="rect3006"
+ style="fill:#0c0d0b;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#0c0d0b;fill-opacity:1;stroke:none"
+ id="rect3014"
+ width="2"
+ height="2"
+ x="4"
+ y="4" />
+ <rect
+ y="6"
+ x="2"
+ height="6"
+ width="2"
+ id="rect3016"
+ style="fill:#0c0d0b;fill-opacity:1;stroke:none" />
+ <rect
+ y="4"
+ x="10"
+ height="2"
+ width="2"
+ id="rect3018"
+ style="fill:#0c0d0b;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#0c0d0b;fill-opacity:1;stroke:none"
+ id="rect3020"
+ width="2"
+ height="2"
+ x="4"
+ y="12" />
+ <rect
+ y="14"
+ x="6"
+ height="2"
+ width="2"
+ id="rect3022"
+ style="fill:#0c0d0b;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#0c0d0b;fill-opacity:1;stroke:none"
+ id="rect3024"
+ width="2"
+ height="2"
+ x="12"
+ y="6" />
+ <rect
+ y="8"
+ x="14"
+ height="2"
+ width="2"
+ id="rect3026"
+ style="fill:#0c0d0b;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#0c0d0b;fill-opacity:1;stroke:none"
+ id="rect3028"
+ width="2"
+ height="2"
+ x="8"
+ y="14" />
+ <rect
+ style="fill:#0c0d0b;fill-opacity:1;stroke:none"
+ id="rect3030"
+ width="4"
+ height="2"
+ x="18"
+ y="16" />
+ <rect
+ style="fill:#0c0d0b;fill-opacity:1;stroke:none"
+ id="rect3034"
+ width="2"
+ height="4"
+ x="16"
+ y="18" />
+ <rect
+ y="18"
+ x="20"
+ height="2"
+ width="2"
+ id="rect3036"
+ style="fill:#0c0d0b;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#0c0d0b;fill-opacity:1;stroke:none"
+ id="rect3038"
+ width="2"
+ height="2"
+ x="18"
+ y="20" />
+ <rect
+ y="18"
+ x="18"
+ height="2"
+ width="2"
+ id="rect3040"
+ style="fill:#fff7dc;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#e2d5aa;fill-opacity:1;stroke:none"
+ id="rect3042"
+ width="2"
+ height="2"
+ x="16"
+ y="16" />
+ <rect
+ y="12"
+ x="10"
+ height="2"
+ width="4"
+ id="rect3044"
+ style="fill:#7b512d;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#613c1b;fill-opacity:1;stroke:none"
+ id="rect3046"
+ width="2"
+ height="2"
+ x="8"
+ y="12" />
+ <rect
+ y="10"
+ x="6"
+ height="2"
+ width="4"
+ id="rect3048"
+ style="fill:#7b512d;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="rect3050"
+ d="m 10,8 2,0 0,2 2,0 0,2 -4,0 z"
+ style="fill:#9d6d43;fill-opacity:1;stroke:none" />
+ <rect
+ y="8"
+ x="8"
+ height="2"
+ width="2"
+ id="rect3053"
+ style="fill:#b88458;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b88458;fill-opacity:1;stroke:none"
+ id="rect3055"
+ width="2"
+ height="2"
+ x="10"
+ y="6" />
+ <rect
+ y="8"
+ x="12"
+ height="2"
+ width="2"
+ id="rect3057"
+ style="fill:#b88458;fill-opacity:1;stroke:none" />
+ <rect
+ y="12"
+ x="6"
+ height="2"
+ width="2"
+ id="rect3059"
+ style="fill:#613c1b;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#dfb18f;fill-opacity:1;stroke:none"
+ id="rect3061"
+ width="2"
+ height="2"
+ x="6"
+ y="6" />
+ <rect
+ y="4"
+ x="8"
+ height="2"
+ width="2"
+ id="rect3063"
+ style="fill:#b21818;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b21818;fill-opacity:1;stroke:none"
+ id="rect3065"
+ width="2"
+ height="2"
+ x="4"
+ y="8" />
+ <rect
+ y="6"
+ x="4"
+ height="2"
+ width="2"
+ id="rect3067"
+ style="fill:#d42a2a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#d42a2a;fill-opacity:1;stroke:none"
+ id="rect3069"
+ width="2"
+ height="2"
+ x="6"
+ y="4" />
+ <rect
+ y="6"
+ x="8"
+ height="2"
+ width="2"
+ id="rect3071"
+ style="fill:#d42a2a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#d42a2a;fill-opacity:1;stroke:none"
+ id="rect3073"
+ width="2"
+ height="2"
+ x="6"
+ y="8" />
+ <rect
+ y="16"
+ x="10"
+ height="2"
+ width="6"
+ id="rect4470"
+ style="fill:#0c0d0b;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#0c0d0b;fill-opacity:1;stroke:none"
+ id="rect4472"
+ width="2"
+ height="6"
+ x="16"
+ y="10" />
+ <rect
+ y="14"
+ x="12"
+ height="2"
+ width="4"
+ id="rect4474"
+ style="fill:#613c1b;fill-opacity:1;stroke:none" />
+ <rect
+ y="12"
+ x="14"
+ height="2"
+ width="2"
+ id="rect4476"
+ style="fill:#9d6d43;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#502d16;fill-opacity:1;stroke:none"
+ id="rect4478"
+ width="2"
+ height="2"
+ x="10"
+ y="14" />
+ <rect
+ style="fill:#b88458;fill-opacity:1;stroke:none"
+ id="rect4480"
+ width="2"
+ height="2"
+ x="14"
+ y="10" />
+ <rect
+ style="fill:#613c1b;fill-opacity:1;stroke:none"
+ id="rect4978"
+ width="2"
+ height="2"
+ x="4"
+ y="10" />
+ </g>
+ </g>
+</svg>
diff --git a/application/resources/sources/netherstar.svg b/application/resources/sources/netherstar.svg
new file mode 100644
index 00000000..4046e4ec
--- /dev/null
+++ b/application/resources/sources/netherstar.svg
@@ -0,0 +1,342 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64"
+ height="64"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="netherstar.svg"
+ inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/netherstar.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4065">
+ <stop
+ id="stop4067"
+ offset="0"
+ style="stop-color:#556b6b;stop-opacity:1" />
+ <stop
+ style="stop-color:#3b8585;stop-opacity:0.49803922;"
+ offset="0.5"
+ id="stop4069" />
+ <stop
+ id="stop4071"
+ offset="1"
+ style="stop-color:#fafbfb;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4053">
+ <stop
+ id="stop4055"
+ offset="0"
+ style="stop-color:#556b6b;stop-opacity:1" />
+ <stop
+ style="stop-color:#3b8585;stop-opacity:0.49803922;"
+ offset="0.5"
+ id="stop4057" />
+ <stop
+ id="stop4059"
+ offset="1"
+ style="stop-color:#fafbfb;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3802">
+ <stop
+ style="stop-color:#cbd6d6;stop-opacity:1;"
+ offset="0"
+ id="stop3804" />
+ <stop
+ style="stop-color:#637e7e;stop-opacity:1"
+ offset="1"
+ id="stop3806" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3006">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3008" />
+ <stop
+ id="stop3955"
+ offset="0.14285807"
+ style="stop-color:#fff656;stop-opacity:1;" />
+ <stop
+ id="stop3949"
+ offset="0.28571615"
+ style="stop-color:#fdd300;stop-opacity:1;" />
+ <stop
+ style="stop-color:#f6d01a;stop-opacity:1;"
+ offset="0.50000137"
+ id="stop3951" />
+ <stop
+ style="stop-color:#fafd00;stop-opacity:0;"
+ offset="1"
+ id="stop3010" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter3893">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.3"
+ id="feGaussianBlur3895" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter3901">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.3"
+ id="feGaussianBlur3903" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter3905">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.3000003"
+ id="feGaussianBlur3907" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter3913">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.3"
+ id="feGaussianBlur3915" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter3945">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.74074074"
+ id="feGaussianBlur3947" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter3967">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.4979424"
+ id="feGaussianBlur3969" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4053"
+ id="linearGradient3985"
+ gradientUnits="userSpaceOnUse"
+ x1="51"
+ y1="1014.3622"
+ x2="35"
+ y2="997.36218" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4065"
+ id="linearGradient3987"
+ gradientUnits="userSpaceOnUse"
+ x1="25"
+ y1="1039.3622"
+ x2="9"
+ y2="1023.3622" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3802"
+ id="linearGradient3989"
+ gradientUnits="userSpaceOnUse"
+ x1="28"
+ y1="28"
+ x2="36"
+ y2="36" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3006"
+ id="radialGradient3991"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1034483,-2.1791858e-6,2.1791909e-6,1.103451,-3.1035149,985.25875)"
+ cx="30"
+ cy="30"
+ fx="30"
+ fy="30"
+ r="14.5" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3802"
+ id="linearGradient3993"
+ gradientUnits="userSpaceOnUse"
+ x1="24"
+ y1="48"
+ x2="36"
+ y2="48" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3802"
+ id="linearGradient3995"
+ gradientUnits="userSpaceOnUse"
+ x1="24"
+ y1="1000.3622"
+ x2="36"
+ y2="1000.3622" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3802"
+ id="linearGradient3997"
+ gradientUnits="userSpaceOnUse"
+ x1="44"
+ y1="1018.3622"
+ x2="52"
+ y2="1018.3622" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3802"
+ id="linearGradient3999"
+ gradientUnits="userSpaceOnUse"
+ x1="8"
+ y1="1018.3622"
+ x2="16"
+ y2="1018.3622" />
+ <filter
+ inkscape:collect="always"
+ id="filter4108">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.39"
+ id="feGaussianBlur4110" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="6"
+ inkscape:cx="32.789148"
+ inkscape:cy="31.233555"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1607"
+ inkscape:window-height="1030"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="4"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingx="1px"
+ spacingy="1px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-988.36218)">
+ <g
+ id="g3971"
+ transform="translate(2,1.99998)">
+ <path
+ style="fill:#cccccc;fill-opacity:1;stroke:none;filter:url(#filter3967)"
+ d="m 57,27.00002 0,6 -8,8 -8,0 0,8 -8,8 -6,0 -8,-8 0,-8 -8,0 -8,-8 0,-6 8,-8 8,0 0,-7 8,-9 6,0 8,8 0,8 8,0 z"
+ id="path3957"
+ inkscape:connector-curvature="0"
+ transform="translate(0,988.36218)"
+ sodipodi:nodetypes="ccccccccccccccccccccc" />
+ <path
+ transform="translate(0,988.36218)"
+ inkscape:connector-curvature="0"
+ id="path3000"
+ d="m 56,28 0,4 -8,8 -8,0 0,8 -8,8 -4,0 -8,-8 0,-8 -8,0 -8,-8 0,-4 8,-8 8,0 0,-8 8,-8 4,0 4,4 4,4 0,8 8,0 z"
+ style="fill:#eff2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3788"
+ d="m 52,1024.3622 0,-8 -4,-4 -8,0 -4,-4 0,-8 -4,-4.00002 -8,0 4,-4 4,0 8,8.00002 0,8 8,0 8,8 0,4 z"
+ style="fill:url(#linearGradient3985);fill-opacity:1;stroke:none" />
+ <path
+ style="fill:url(#linearGradient3987);fill-opacity:1;stroke:none"
+ d="m 8,1012.3622 0,8 4,4 8,0 4,4 0,8 4,4 8.00001,0 -4,4 -4.00001,0 -8,-8 0,-8 -8,0 -8,-8 0,-4 z"
+ id="path3790"
+ inkscape:connector-curvature="0" />
+ <path
+ transform="translate(0,988.36218)"
+ inkscape:connector-curvature="0"
+ id="path3002"
+ d="m 36,8 -8,0 -4,4 0,8 -4,4 -8,0 -4,4 0,8 -4,-4 0,-4 8,-8 8,0 0,-8 8,-8 4,0 z"
+ style="opacity:0.67364017;fill:#ffffff;stroke:none" />
+ <path
+ transform="translate(0,988.36218)"
+ inkscape:connector-curvature="0"
+ id="path3800"
+ d="m 28,20 -8,8 0,4 8,8 4,0 8,-8 0,-4 -8,-8 z"
+ style="fill:url(#linearGradient3989);fill-opacity:1;stroke:none;filter:url(#filter3945)" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3004"
+ d="m 28,1000.3622 0,16 -16,0 0,4 16,0 0,16 4,0 0,-16 16,0 0,-4 -16,0 0,-16 z"
+ style="fill:url(#radialGradient3991);fill-opacity:1;stroke:none"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ style="fill:#556b6b;fill-opacity:1;stroke:none"
+ d="m 23.99998,1040.3622 8,0 4,-4 0,-8 4,-4 8,0 4.00002,-4 0,-8 4,4 0,4 -8.00002,8 -8,0 0,8 -8,8 -4,0 z"
+ id="path3786"
+ inkscape:connector-curvature="0" />
+ <path
+ transform="translate(0,988.36218)"
+ inkscape:connector-curvature="0"
+ id="path3792"
+ d="m 32,48 -4,0 -4,-4 0,4 4,4 4,0 4,-4 0,-4 z"
+ style="fill:url(#linearGradient3993);fill-opacity:1;stroke:none;filter:url(#filter3893)" />
+ <path
+ style="fill:url(#linearGradient3995);fill-opacity:1;stroke:none;filter:url(#filter3905)"
+ d="m 32,1000.3622 -4,0 -4,4 0,-4 4,-4.00002 4,0 4,4.00002 0,4 z"
+ id="path3794"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3796"
+ d="m 48,1020.3622 0,-4 -4,-4 4,0 4,4 0,4 -4,4 -4,0 z"
+ style="fill:url(#linearGradient3997);fill-opacity:1;stroke:none;filter:url(#filter3901)" />
+ <path
+ style="fill:url(#linearGradient3999);fill-opacity:1;stroke:none;filter:url(#filter3913)"
+ d="m 12,1016.3622 0,4 4,4 -4,0 -4,-4 0,-4 4,-4 4,0 z"
+ id="path3798"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#eff2f2;fill-opacity:0.10628019000000000;stroke:none;filter:url(#filter4108)"
+ d="m 28,992.3622 -8,8 0,8 -8,0 -8.0000001,8 0,4 8.0000001,8 8,0 0,8 8,8 4,0 8,-8 0,-8 8,0 8,-8 0,-4 -8,-8 -8,0 0,-8 -4,-4 -4,-4 -4,0 z m 2.90625,2.25 c 1.790052,0.15723 3.5491,1.39991 5.03125,4.1875 5.21676,3.1721 -1.835545,14.0536 7.28125,11.3125 4.64748,-0.9978 13.08236,5.9966 9.65625,10.3437 -2.87943,6.7429 -10.8243,4.9933 -14.84375,6.6563 1.50952,6.5659 -1.74938,11.1566 -6.8125,15 -4.92726,-0.671 -10.654448,-6.4059 -9.1875,-12 1.831567,-8.2895 -10.191583,-0.2312 -12.4375001,-7.2813 -7.428566,-3.9347 -0.557092,-9.4767 3.4375001,-12.7187 7.835946,1.7735 10.684647,-1.4404 9,-9.1875 L 22.5,1000.4559 c 2.310711,-3.39825 5.42283,-6.10574 8.40625,-5.8437 z"
+ id="path4073"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+</svg>
diff --git a/application/resources/sources/pskeleton.svg b/application/resources/sources/pskeleton.svg
new file mode 100644
index 00000000..c2783df8
--- /dev/null
+++ b/application/resources/sources/pskeleton.svg
@@ -0,0 +1,581 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="32"
+ height="32"
+ id="svg2">
+ <defs
+ id="defs4">
+ <filter
+ x="-0.18000001"
+ y="-0.36000001"
+ width="1.36"
+ height="1.72"
+ color-interpolation-filters="sRGB"
+ id="filter5719">
+ <feGaussianBlur
+ id="feGaussianBlur5721"
+ stdDeviation="0.15" />
+ </filter>
+ <filter
+ x="-0.20999999"
+ y="-0.28"
+ width="1.42"
+ height="1.5599999"
+ color-interpolation-filters="sRGB"
+ id="filter5723">
+ <feGaussianBlur
+ id="feGaussianBlur5725"
+ stdDeviation="0.35" />
+ </filter>
+ <filter
+ x="-0.1728"
+ y="-0.34560001"
+ width="1.3456"
+ height="1.6912"
+ color-interpolation-filters="sRGB"
+ id="filter5711">
+ <feGaussianBlur
+ id="feGaussianBlur5713"
+ stdDeviation="0.144" />
+ </filter>
+ <filter
+ x="-0.20999999"
+ y="-0.28"
+ width="1.42"
+ height="1.5599999"
+ color-interpolation-filters="sRGB"
+ id="filter5727">
+ <feGaussianBlur
+ id="feGaussianBlur5729"
+ stdDeviation="0.35" />
+ </filter>
+ <filter
+ x="-0.14708571"
+ y="-0.25740001"
+ width="1.2941715"
+ height="1.5148"
+ color-interpolation-filters="sRGB"
+ id="filter4028-6">
+ <feGaussianBlur
+ id="feGaussianBlur4030-9"
+ stdDeviation="0.429" />
+ </filter>
+ <filter
+ color-interpolation-filters="sRGB"
+ id="filter4056-6">
+ <feGaussianBlur
+ id="feGaussianBlur4058-6"
+ stdDeviation="0.676" />
+ </filter>
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1020.3622)"
+ id="layer1">
+ <rect
+ width="24"
+ height="24"
+ x="3.9999998"
+ y="1024.3622"
+ id="rect4063-2"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <rect
+ width="26"
+ height="26"
+ x="3"
+ y="3"
+ transform="matrix(1.0769231,0,0,1.0769237,-1.2307693,1019.1314)"
+ id="rect4038-2"
+ style="fill:#4d4d4d;fill-opacity:1;stroke:none;filter:url(#filter4056-6)" />
+ <rect
+ width="20"
+ height="5.0000172"
+ x="5.9999995"
+ y="1041.3622"
+ id="rect3189-4"
+ style="fill:#494949;fill-opacity:1;stroke:none" />
+ <path
+ d="m 6.0000007,1041.3622 20.0000003,0 0,2 -18.0000003,0 0,3 -2,0 z"
+ id="path4034-6"
+ style="fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter4028-6)" />
+ <rect
+ width="8"
+ height="5.0000172"
+ x="5.9999995"
+ y="1035.3622"
+ id="rect3155-9"
+ style="fill:#494949;fill-opacity:1;stroke:none" />
+ <rect
+ width="8"
+ height="5.0000172"
+ x="18"
+ y="1035.3622"
+ id="rect3163-4"
+ style="fill:#494949;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="3.9999998"
+ y="1024.3622"
+ id="rect3009-1"
+ style="fill:#a1a1a1;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="6.9999995"
+ y="1024.3622"
+ id="rect3011-9"
+ style="fill:#9b9b9b;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="10"
+ y="1024.3622"
+ id="rect3013-0"
+ style="fill:#a3a3a3;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="13"
+ y="1024.3622"
+ id="rect3017-9"
+ style="fill:#919191;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="16"
+ y="1024.3622"
+ id="rect3019-6"
+ style="fill:#888888;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="19"
+ y="1024.3622"
+ id="rect3021-8"
+ style="fill:#8f8f8f;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="22"
+ y="1024.3622"
+ id="rect3023-6"
+ style="fill:#9b9b9b;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="25"
+ y="1024.3622"
+ id="rect3025-7"
+ style="fill:#989898;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="3.9999998"
+ y="1027.3622"
+ id="rect3027-7"
+ style="fill:#9b9b9b;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="6.9999995"
+ y="1027.3622"
+ id="rect3029-6"
+ style="fill:#9b9b9b;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="10"
+ y="1027.3622"
+ id="rect3031-0"
+ style="fill:#a3a3a3;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="10"
+ y="1027.3622"
+ id="rect3033-4"
+ style="fill:#9b9b9b;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="13"
+ y="1027.3622"
+ id="rect3035-4"
+ style="fill:#aaaaaa;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="16"
+ y="1027.3622"
+ id="rect3037-2"
+ style="fill:#c1c1c1;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="19"
+ y="1027.3622"
+ id="rect3039-4"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="22"
+ y="1027.3622"
+ id="rect3041-2"
+ style="fill:#9b9b9b;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="25"
+ y="1027.3622"
+ id="rect3043-1"
+ style="fill:#919191;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="3.9999998"
+ y="1030.3622"
+ id="rect3045-3"
+ style="fill:#9b9b9b;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="6.9999995"
+ y="1030.3622"
+ id="rect3047-1"
+ style="fill:#c7c7c7;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="10"
+ y="1030.3622"
+ id="rect3049-5"
+ style="fill:#a3a3a3;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="10"
+ y="1030.3622"
+ id="rect3051-9"
+ style="fill:#cacaca;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="13"
+ y="1030.3622"
+ id="rect3053-2"
+ style="fill:#d8d8d8;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="16"
+ y="1030.3622"
+ id="rect3055-9"
+ style="fill:#cfcfcf;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="19"
+ y="1030.3622"
+ id="rect3057-7"
+ style="fill:#cfcfcf;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="22"
+ y="1030.3622"
+ id="rect3059-2"
+ style="fill:#bababa;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="25"
+ y="1030.3622"
+ id="rect3061-7"
+ style="fill:#aaaaaa;fill-opacity:1;stroke:none" />
+ <path
+ d="m 6.0000007,1035.3622 8.0000003,0 0,2 -6.0000003,0 0,3 -2,0 z"
+ id="path4032-3"
+ style="fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter4028-6)" />
+ <rect
+ width="3"
+ height="3"
+ x="3.9999998"
+ y="1033.3622"
+ id="rect3063-8"
+ style="fill:#bababa;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="6.9999995"
+ y="1033.3622"
+ id="rect3065-6"
+ style="fill:#c4c4c4;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="10"
+ y="1033.3622"
+ id="rect3067-1"
+ style="fill:#a3a3a3;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="10"
+ y="1033.3622"
+ id="rect3069-9"
+ style="fill:#bababa;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="13"
+ y="1033.3622"
+ id="rect3071-7"
+ style="fill:#c1c1c1;fill-opacity:1;stroke:none" />
+ <path
+ d="m 18.000001,1035.3622 8,0 0,2 -6,0 0,3 -2,0 z"
+ id="path4036-6"
+ style="fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter4028-6)" />
+ <rect
+ width="3"
+ height="3"
+ x="16"
+ y="1033.3622"
+ id="rect3073-1"
+ style="fill:#afafaf;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="19"
+ y="1033.3622"
+ id="rect3075-8"
+ style="fill:#cacaca;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="22"
+ y="1033.3622"
+ id="rect3077-8"
+ style="fill:#aaaaaa;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="25"
+ y="1033.3622"
+ id="rect3079-2"
+ style="fill:#aaaaaa;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="3.9999998"
+ y="1036.3622"
+ id="rect3153-6"
+ style="fill:#c4c4c4;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="13"
+ y="1036.3622"
+ id="rect3159-7"
+ style="fill:#c4c4c4;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="16"
+ y="1036.3622"
+ id="rect3161-0"
+ style="fill:#cacaca;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="25"
+ y="1036.3622"
+ id="rect3167-3"
+ style="fill:#bababa;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="3.9999998"
+ y="1039.3622"
+ id="rect3169-4"
+ style="fill:#a7a7a7;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="6.9999995"
+ y="1039.3622"
+ id="rect3171-8"
+ style="fill:#c1c1c1;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="10"
+ y="1039.3622"
+ id="rect3173-5"
+ style="fill:#a3a3a3;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="10"
+ y="1039.3622"
+ id="rect3175-0"
+ style="fill:#cacaca;fill-opacity:1;stroke:none" />
+ <rect
+ width="6"
+ height="3"
+ x="13"
+ y="1039.3622"
+ id="rect3177-4"
+ style="fill:#828282;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="19"
+ y="1039.3622"
+ id="rect3181-9"
+ style="fill:#cacaca;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="22"
+ y="1039.3622"
+ id="rect3183-7"
+ style="fill:#aaaaaa;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="25"
+ y="1039.3622"
+ id="rect3185-6"
+ style="fill:#8f8f8f;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="3.9999998"
+ y="1042.3622"
+ id="rect3187-1"
+ style="fill:#9e9e9e;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="25"
+ y="1042.3622"
+ id="rect3203-8"
+ style="fill:#919191;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="3.9999998"
+ y="1045.3622"
+ id="rect3205-4"
+ style="fill:#828282;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="6.9999995"
+ y="1045.3622"
+ id="rect3207-2"
+ style="fill:#7f7f7f;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="10"
+ y="1045.3622"
+ id="rect3209-3"
+ style="fill:#a3a3a3;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="10"
+ y="1045.3622"
+ id="rect3211-3"
+ style="fill:#858585;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="13"
+ y="1045.3622"
+ id="rect3213-9"
+ style="fill:#858585;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="16"
+ y="1045.3622"
+ id="rect3215-7"
+ style="fill:#919191;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="19"
+ y="1045.3622"
+ id="rect3217-0"
+ style="fill:#858585;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="22"
+ y="1045.3622"
+ id="rect3219-4"
+ style="fill:#949494;fill-opacity:1;stroke:none" />
+ <rect
+ width="3"
+ height="3"
+ x="25"
+ y="1045.3622"
+ id="rect3221-5"
+ style="fill:#888888;fill-opacity:1;stroke:none" />
+ <path
+ d="m 4.0000007,1023.3622 -1,1 0,24 1,1 24.0000003,0 1,-1 0,-24 -1,-1 z m 0,1 24.0000003,0 0,24 -24.0000003,0 z"
+ id="rect3223-4"
+ style="fill:#333333;fill-opacity:1;stroke:none" />
+ <rect
+ width="4"
+ height="3"
+ x="7.9999995"
+ y="1036.3622"
+ id="rect4124-4"
+ style="fill:#008080;fill-opacity:1;stroke:none;filter:url(#filter5727)" />
+ <rect
+ width="2"
+ height="1"
+ x="9"
+ y="1037.3622"
+ id="rect4084-3"
+ style="fill:#00ffff;fill-opacity:1;stroke:none;filter:url(#filter5711)" />
+ <rect
+ width="4"
+ height="3"
+ x="20"
+ y="1036.3622"
+ id="rect4124-9-2"
+ style="fill:#008080;fill-opacity:1;stroke:none;filter:url(#filter5723)" />
+ <rect
+ width="2"
+ height="1"
+ x="21"
+ y="1037.3622"
+ id="rect4086-7"
+ style="fill:#00ffff;fill-opacity:1;stroke:none;filter:url(#filter5719)" />
+ </g>
+</svg>
diff --git a/application/resources/sources/skeleton.svg b/application/resources/sources/skeleton.svg
new file mode 100644
index 00000000..5d55f272
--- /dev/null
+++ b/application/resources/sources/skeleton.svg
@@ -0,0 +1,610 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="skeleton.svg"
+ inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/skeleton128.png"
+ inkscape:export-xdpi="360"
+ inkscape:export-ydpi="360">
+ <defs
+ id="defs4">
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter5723"
+ x="-0.20999999"
+ width="1.42"
+ y="-0.28"
+ height="1.5599999">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.35"
+ id="feGaussianBlur5725" />
+ </filter>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter5727"
+ x="-0.20999999"
+ width="1.42"
+ y="-0.28"
+ height="1.5599999">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.35"
+ id="feGaussianBlur5729" />
+ </filter>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter4028-6"
+ x="-0.14708571"
+ width="1.2941715"
+ y="-0.25740001"
+ height="1.5148">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.429"
+ id="feGaussianBlur4030-9" />
+ </filter>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter4056-6">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.676"
+ id="feGaussianBlur4058-6" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.313708"
+ inkscape:cx="-18.309169"
+ inkscape:cy="22.958832"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1614"
+ inkscape:window-height="1030"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2996"
+ empspacing="4"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1020.3622)">
+ <rect
+ style="fill:#999999;fill-opacity:1;stroke:none"
+ id="rect4063-2"
+ width="24"
+ height="24"
+ x="3.9999998"
+ y="1024.3622" />
+ <rect
+ style="fill:#4d4d4d;fill-opacity:1;stroke:none;filter:url(#filter4056-6)"
+ id="rect4038-2"
+ width="26"
+ height="26"
+ x="3"
+ y="3"
+ transform="matrix(1.0769231,0,0,1.0769237,-1.2307693,1019.1314)" />
+ <rect
+ y="1041.3622"
+ x="5.9999995"
+ height="5.0000172"
+ width="20"
+ id="rect3189-4"
+ style="fill:#494949;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter4028-6)"
+ d="m 6.0000007,1041.3622 20.0000003,0 0,2 -18.0000003,0 0,3 -2,0 z"
+ id="path4034-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <rect
+ style="fill:#494949;fill-opacity:1;stroke:none"
+ id="rect3155-9"
+ width="8"
+ height="5.0000172"
+ x="5.9999995"
+ y="1035.3622" />
+ <rect
+ y="1035.3622"
+ x="18"
+ height="5.0000172"
+ width="8"
+ id="rect3163-4"
+ style="fill:#494949;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#a1a1a1;fill-opacity:1;stroke:none"
+ id="rect3009-1"
+ width="3"
+ height="3"
+ x="3.9999998"
+ y="1024.3622" />
+ <rect
+ y="1024.3622"
+ x="6.9999995"
+ height="3"
+ width="3"
+ id="rect3011-9"
+ style="fill:#9b9b9b;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#a3a3a3;fill-opacity:1;stroke:none"
+ id="rect3013-0"
+ width="3"
+ height="3"
+ x="10"
+ y="1024.3622" />
+ <rect
+ style="fill:#919191;fill-opacity:1;stroke:none"
+ id="rect3017-9"
+ width="3"
+ height="3"
+ x="13"
+ y="1024.3622" />
+ <rect
+ y="1024.3622"
+ x="16"
+ height="3"
+ width="3"
+ id="rect3019-6"
+ style="fill:#888888;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#8f8f8f;fill-opacity:1;stroke:none"
+ id="rect3021-8"
+ width="3"
+ height="3"
+ x="19"
+ y="1024.3622" />
+ <rect
+ y="1024.3622"
+ x="22"
+ height="3"
+ width="3"
+ id="rect3023-6"
+ style="fill:#9b9b9b;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#989898;fill-opacity:1;stroke:none"
+ id="rect3025-7"
+ width="3"
+ height="3"
+ x="25"
+ y="1024.3622" />
+ <rect
+ y="1027.3622"
+ x="3.9999998"
+ height="3"
+ width="3"
+ id="rect3027-7"
+ style="fill:#9b9b9b;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#9b9b9b;fill-opacity:1;stroke:none"
+ id="rect3029-6"
+ width="3"
+ height="3"
+ x="6.9999995"
+ y="1027.3622" />
+ <rect
+ y="1027.3622"
+ x="10"
+ height="3"
+ width="3"
+ id="rect3031-0"
+ style="fill:#a3a3a3;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#9b9b9b;fill-opacity:1;stroke:none"
+ id="rect3033-4"
+ width="3"
+ height="3"
+ x="10"
+ y="1027.3622" />
+ <rect
+ y="1027.3622"
+ x="13"
+ height="3"
+ width="3"
+ id="rect3035-4"
+ style="fill:#aaaaaa;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#c1c1c1;fill-opacity:1;stroke:none"
+ id="rect3037-2"
+ width="3"
+ height="3"
+ x="16"
+ y="1027.3622" />
+ <rect
+ y="1027.3622"
+ x="19"
+ height="3"
+ width="3"
+ id="rect3039-4"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#9b9b9b;fill-opacity:1;stroke:none"
+ id="rect3041-2"
+ width="3"
+ height="3"
+ x="22"
+ y="1027.3622" />
+ <rect
+ y="1027.3622"
+ x="25"
+ height="3"
+ width="3"
+ id="rect3043-1"
+ style="fill:#919191;fill-opacity:1;stroke:none" />
+ <rect
+ y="1030.3622"
+ x="3.9999998"
+ height="3"
+ width="3"
+ id="rect3045-3"
+ style="fill:#9b9b9b;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#c7c7c7;fill-opacity:1;stroke:none"
+ id="rect3047-1"
+ width="3"
+ height="3"
+ x="6.9999995"
+ y="1030.3622" />
+ <rect
+ y="1030.3622"
+ x="10"
+ height="3"
+ width="3"
+ id="rect3049-5"
+ style="fill:#a3a3a3;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#cacaca;fill-opacity:1;stroke:none"
+ id="rect3051-9"
+ width="3"
+ height="3"
+ x="10"
+ y="1030.3622" />
+ <rect
+ y="1030.3622"
+ x="13"
+ height="3"
+ width="3"
+ id="rect3053-2"
+ style="fill:#d8d8d8;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#cfcfcf;fill-opacity:1;stroke:none"
+ id="rect3055-9"
+ width="3"
+ height="3"
+ x="16"
+ y="1030.3622" />
+ <rect
+ y="1030.3622"
+ x="19"
+ height="3"
+ width="3"
+ id="rect3057-7"
+ style="fill:#cfcfcf;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bababa;fill-opacity:1;stroke:none"
+ id="rect3059-2"
+ width="3"
+ height="3"
+ x="22"
+ y="1030.3622" />
+ <rect
+ y="1030.3622"
+ x="25"
+ height="3"
+ width="3"
+ id="rect3061-7"
+ style="fill:#aaaaaa;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="path4032-3"
+ d="m 6.0000007,1035.3622 8.0000003,0 0,2 -6.0000003,0 0,3 -2,0 z"
+ style="fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter4028-6)" />
+ <rect
+ style="fill:#bababa;fill-opacity:1;stroke:none"
+ id="rect3063-8"
+ width="3"
+ height="3"
+ x="3.9999998"
+ y="1033.3622" />
+ <rect
+ y="1033.3622"
+ x="6.9999995"
+ height="3"
+ width="3"
+ id="rect3065-6"
+ style="fill:#c4c4c4;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#a3a3a3;fill-opacity:1;stroke:none"
+ id="rect3067-1"
+ width="3"
+ height="3"
+ x="10"
+ y="1033.3622" />
+ <rect
+ y="1033.3622"
+ x="10"
+ height="3"
+ width="3"
+ id="rect3069-9"
+ style="fill:#bababa;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#c1c1c1;fill-opacity:1;stroke:none"
+ id="rect3071-7"
+ width="3"
+ height="3"
+ x="13"
+ y="1033.3622" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter4028-6)"
+ d="m 18.000001,1035.3622 8,0 0,2 -6,0 0,3 -2,0 z"
+ id="path4036-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <rect
+ y="1033.3622"
+ x="16"
+ height="3"
+ width="3"
+ id="rect3073-1"
+ style="fill:#afafaf;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#cacaca;fill-opacity:1;stroke:none"
+ id="rect3075-8"
+ width="3"
+ height="3"
+ x="19"
+ y="1033.3622" />
+ <rect
+ y="1033.3622"
+ x="22"
+ height="3"
+ width="3"
+ id="rect3077-8"
+ style="fill:#aaaaaa;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#aaaaaa;fill-opacity:1;stroke:none"
+ id="rect3079-2"
+ width="3"
+ height="3"
+ x="25"
+ y="1033.3622" />
+ <rect
+ y="1036.3622"
+ x="3.9999998"
+ height="3"
+ width="3"
+ id="rect3153-6"
+ style="fill:#c4c4c4;fill-opacity:1;stroke:none" />
+ <rect
+ y="1036.3622"
+ x="13"
+ height="3"
+ width="3"
+ id="rect3159-7"
+ style="fill:#c4c4c4;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#cacaca;fill-opacity:1;stroke:none"
+ id="rect3161-0"
+ width="3"
+ height="3"
+ x="16"
+ y="1036.3622" />
+ <rect
+ y="1036.3622"
+ x="25"
+ height="3"
+ width="3"
+ id="rect3167-3"
+ style="fill:#bababa;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#a7a7a7;fill-opacity:1;stroke:none"
+ id="rect3169-4"
+ width="3"
+ height="3"
+ x="3.9999998"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="6.9999995"
+ height="3"
+ width="3"
+ id="rect3171-8"
+ style="fill:#c1c1c1;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#a3a3a3;fill-opacity:1;stroke:none"
+ id="rect3173-5"
+ width="3"
+ height="3"
+ x="10"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="10"
+ height="3"
+ width="3"
+ id="rect3175-0"
+ style="fill:#cacaca;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#828282;fill-opacity:1;stroke:none"
+ id="rect3177-4"
+ width="6"
+ height="3"
+ x="13"
+ y="1039.3622" />
+ <rect
+ style="fill:#cacaca;fill-opacity:1;stroke:none"
+ id="rect3181-9"
+ width="3"
+ height="3"
+ x="19"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="22"
+ height="3"
+ width="3"
+ id="rect3183-7"
+ style="fill:#aaaaaa;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#8f8f8f;fill-opacity:1;stroke:none"
+ id="rect3185-6"
+ width="3"
+ height="3"
+ x="25"
+ y="1039.3622" />
+ <rect
+ style="fill:#9e9e9e;fill-opacity:1;stroke:none"
+ id="rect3187-1"
+ width="3"
+ height="3"
+ x="3.9999998"
+ y="1042.3622" />
+ <rect
+ style="fill:#919191;fill-opacity:1;stroke:none"
+ id="rect3203-8"
+ width="3"
+ height="3"
+ x="25"
+ y="1042.3622" />
+ <rect
+ y="1045.3622"
+ x="3.9999998"
+ height="3"
+ width="3"
+ id="rect3205-4"
+ style="fill:#828282;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#7f7f7f;fill-opacity:1;stroke:none"
+ id="rect3207-2"
+ width="3"
+ height="3"
+ x="6.9999995"
+ y="1045.3622" />
+ <rect
+ y="1045.3622"
+ x="10"
+ height="3"
+ width="3"
+ id="rect3209-3"
+ style="fill:#a3a3a3;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#858585;fill-opacity:1;stroke:none"
+ id="rect3211-3"
+ width="3"
+ height="3"
+ x="10"
+ y="1045.3622" />
+ <rect
+ y="1045.3622"
+ x="13"
+ height="3"
+ width="3"
+ id="rect3213-9"
+ style="fill:#858585;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#919191;fill-opacity:1;stroke:none"
+ id="rect3215-7"
+ width="3"
+ height="3"
+ x="16"
+ y="1045.3622" />
+ <rect
+ y="1045.3622"
+ x="19"
+ height="3"
+ width="3"
+ id="rect3217-0"
+ style="fill:#858585;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#949494;fill-opacity:1;stroke:none"
+ id="rect3219-4"
+ width="3"
+ height="3"
+ x="22"
+ y="1045.3622" />
+ <rect
+ y="1045.3622"
+ x="25"
+ height="3"
+ width="3"
+ id="rect3221-5"
+ style="fill:#888888;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#333333;fill-opacity:1;stroke:none"
+ d="m 4.0000007,1023.3622 -1,1 0,24 1,1 24.0000003,0 1,-1 0,-24 -1,-1 z m 0,1 24.0000003,0 0,24 -24.0000003,0 z"
+ id="rect3223-4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccc" />
+ <rect
+ style="fill:#008080;fill-opacity:1;stroke:none;filter:url(#filter5727)"
+ id="rect4124-4"
+ width="4"
+ height="3"
+ x="7.9999995"
+ y="1036.3622" />
+ <rect
+ style="fill:#00ffff;fill-opacity:1;stroke:none;"
+ id="rect4084-3"
+ width="2"
+ height="1"
+ x="9"
+ y="1037.3622" />
+ <rect
+ style="fill:#008080;fill-opacity:1;stroke:none;filter:url(#filter5723)"
+ id="rect4124-9-2"
+ width="4"
+ height="3"
+ x="20"
+ y="1036.3622" />
+ <rect
+ style="fill:#00ffff;fill-opacity:1;stroke:none;"
+ id="rect4086-7"
+ width="2"
+ height="1"
+ x="21"
+ y="1037.3622" />
+ </g>
+</svg>
diff --git a/application/resources/sources/squarecreeper.svg b/application/resources/sources/squarecreeper.svg
new file mode 100644
index 00000000..a1b0f4d1
--- /dev/null
+++ b/application/resources/sources/squarecreeper.svg
@@ -0,0 +1,828 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="squarecreeper.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient3144">
+ <stop
+ style="stop-color:#ffbe01;stop-opacity:1;"
+ offset="0"
+ id="stop3146" />
+ <stop
+ id="stop3922"
+ offset="0.48206061"
+ style="stop-color:#ff0101;stop-opacity:1" />
+ <stop
+ id="stop3920"
+ offset="0.76562566"
+ style="stop-color:#e70000;stop-opacity:0.45098039;" />
+ <stop
+ style="stop-color:#d40000;stop-opacity:0;"
+ offset="1"
+ id="stop3148" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3917">
+ <stop
+ id="stop3919"
+ offset="0"
+ style="stop-color:#115008;stop-opacity:1;" />
+ <stop
+ style="stop-color:#39c228;stop-opacity:1;"
+ offset="0.49999952"
+ id="stop3921" />
+ <stop
+ id="stop3923"
+ offset="1"
+ style="stop-color:#c7f7c2;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3892">
+ <stop
+ style="stop-color:#1a1a1a;stop-opacity:1;"
+ offset="0"
+ id="stop3894" />
+ <stop
+ style="stop-color:#1a1a1a;stop-opacity:0;"
+ offset="1"
+ id="stop3896" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3871">
+ <stop
+ style="stop-color:#115008;stop-opacity:1;"
+ offset="0"
+ id="stop3873" />
+ <stop
+ id="stop3900"
+ offset="0.5"
+ style="stop-color:#39c228;stop-opacity:1;" />
+ <stop
+ style="stop-color:#c7f7c2;stop-opacity:1;"
+ offset="1"
+ id="stop3875" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter3867">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.792"
+ id="feGaussianBlur3869" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3892"
+ id="linearGradient3898"
+ x1="16"
+ y1="31"
+ x2="16"
+ y2="26"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3871"
+ id="linearGradient5605"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,1020.3622)"
+ x1="27"
+ y1="26"
+ x2="5"
+ y2="3" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3871-3"
+ id="linearGradient5605-2"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,1020.3622)"
+ x1="27"
+ y1="26"
+ x2="5"
+ y2="3" />
+ <linearGradient
+ id="linearGradient3871-3">
+ <stop
+ style="stop-color:#115008;stop-opacity:1;"
+ offset="0"
+ id="stop3873-5" />
+ <stop
+ id="stop3900-7"
+ offset="0.5"
+ style="stop-color:#39c228;stop-opacity:1;" />
+ <stop
+ style="stop-color:#c7f7c2;stop-opacity:1;"
+ offset="1"
+ id="stop3875-9" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3917"
+ id="linearGradient3147"
+ x1="31"
+ y1="1052.3622"
+ x2="4"
+ y2="1024.3622"
+ gradientUnits="userSpaceOnUse"
+ spreadMethod="reflect" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3144"
+ id="radialGradient3958"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.98990735,-2.841494e-6,-1.2215289e-6,0.96907996,-6.585324,13.296415)"
+ cx="10"
+ cy="1030.3622"
+ fx="10"
+ fy="1030.3622"
+ r="3.03125" />
+ <filter
+ inkscape:collect="always"
+ id="filter4012"
+ x="-0.37037037"
+ width="1.7407407"
+ y="-0.37037037"
+ height="1.7407407">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.30864198"
+ id="feGaussianBlur4014" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter4206"
+ x="-0.44837625"
+ width="1.8967525"
+ y="-0.44837625"
+ height="1.8967525">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.37364687"
+ id="feGaussianBlur4208" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="218.7892"
+ inkscape:cy="-32.230167"
+ inkscape:document-units="px"
+ inkscape:current-layer="g4186"
+ showgrid="false"
+ inkscape:window-width="1607"
+ inkscape:window-height="1030"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:snap-grids="true"
+ inkscape:snap-to-guides="true"
+ inkscape:snap-nodes="true"
+ inkscape:snap-bbox="false"
+ inkscape:snap-object-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="4"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1020.3622)">
+ <rect
+ style="fill:#2b1100;fill-opacity:1;stroke:none"
+ id="rect3063"
+ width="22"
+ height="22"
+ x="5"
+ y="5"
+ rx="5"
+ ry="5"
+ transform="translate(0,1020.3622)" />
+ <path
+ id="path3065"
+ d="m 6,1026.3622 0,22 22,0 0,-22 z m 2,2 6,0 0,6 6,0 0,-6 6,0 0,6 -6,0 0,3 3,0 0,9 -3,0 0,-3 -6,0 0,3 -3,0 0,-9 3,0 0,-3 -6,0 z"
+ style="fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter3867)"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccccccccccccccc" />
+ <g
+ id="g4186"
+ transform="matrix(7.8663398,0,0,5.253808,-157.10208,-4373.7892)">
+ <rect
+ y="9"
+ x="21"
+ height="2"
+ width="2"
+ id="rect4188"
+ style="opacity:0.25104603;fill:#ff0101;fill-opacity:1;stroke:#4d4d4d;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;filter:url(#filter4206)"
+ transform="matrix(0.74984559,0,0,1.4646069,5.5088131,1015.3024)" />
+ </g>
+ <path
+ style="fill:url(#linearGradient5605);fill-opacity:1;stroke:none"
+ d="m 7,1022.3622 c -2.77,0 -5,0 -5,0 l 0,30 28,0 c 0,-10 0,-20 0,-30 z m 0,5 6,0 0,6 6,0 0,-6 6,0 0,6 -6,0 0,3 3,0 0,9 -3,0 0,-3 -6,0 0,3 -3,0 0,-9 3,0 0,-3 -6,0 z"
+ id="rect3045"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sccccsccccccccccccccccccccc" />
+ <g
+ id="g5466"
+ style="opacity:0.3"
+ transform="translate(0,-1)">
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3902"
+ d="m 3.999974,1022.3622 3,0 0,3 -3,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3904"
+ d="m 6.999974,1022.3622 3,0 0,3 -3,0 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3906"
+ d="m 3.999974,1025.3622 3,0 0,3 -3,0 z"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3908"
+ d="m 0.999974,1025.3622 3,0 0,3 -3,0 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3914"
+ d="m 3.999974,1028.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3916"
+ d="m 0.999974,1028.3622 3,0 0,3 -3,0 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3918"
+ d="m 6.999974,1025.3622 3,0 0,3 -3,0 z"
+ style="fill:#4d4d4d;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3924"
+ d="m 9.999974,1025.3622 3,0 0,3 -3,0 z"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3926"
+ d="m 12.999974,1028.3622 3,0 0,3 -3,0 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3930"
+ d="m 12.999974,1025.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3932"
+ d="m 9.999974,1022.3622 3,0 0,3 -3,0 z"
+ style="fill:#666666;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3936"
+ d="m 12.999974,1022.3622 3,0 0,3 -3,0 z"
+ style="fill:#333333;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect3999"
+ d="m 18.99998,1028.3622 0,-3 3,0 0,3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4007"
+ d="m 15.99998,1031.3622 0,-3 3,0 0,3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4009"
+ d="m 24.99998,1031.3622 0,-3 3,0 0,3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4011"
+ d="m 24.99998,1034.3622 0,-3 3,0 0,3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4013"
+ d="m 21.99998,1028.3622 0,-3 3,0 0,3 z"
+ style="fill:#4d4d4d;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4015"
+ d="m 24.99998,1028.3622 0,-3 3,0 0,3 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4017"
+ d="m 15.99998,1028.3622 0,-3 3,0 0,3 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4019"
+ d="m 21.99998,1025.3622 0,-3 3,0 0,3 z"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4023"
+ d="m 24.99998,1025.3622 0,-3 3,0 0,3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4027"
+ d="m 18.99998,1025.3622 0,-3 3,0 0,3 z"
+ style="fill:#666666;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4029"
+ d="m 15.99998,1025.3622 0,-3 3,0 0,3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4035"
+ d="m 15.99998,1034.3622 0,-3 3,0 0,3 z"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4039"
+ d="m 6.99998,1034.3622 0,3 3,0 0,-3 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4041"
+ d="m 6.99998,1037.3622 0,3 3,0 0,-3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4043"
+ d="m 9.99998,1034.3622 0,3 3,0 0,-3 z"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4049"
+ d="m 3.99998,1034.3622 0,3 3,0 0,-3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4053"
+ d="m 12.99998,1031.3622 0,3 3,0 0,-3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4059"
+ d="m 3.99998,1037.3622 0,3 3,0 0,-3 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4063"
+ d="m 12.99998,1043.3622 0,3 3,0 0,-3 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4069"
+ d="m 6.99998,1040.3622 0,3 3,0 0,-3 z"
+ style="fill:#666666;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4071"
+ d="m 3.99998,1040.3622 0,3 3,0 0,-3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4073"
+ d="m 6.99998,1043.3622 0,3 3,0 0,-3 z"
+ style="fill:#333333;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4075"
+ d="m 3.99998,1043.3622 0,3 3,0 0,-3 z"
+ style="fill:#ececec;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4077"
+ d="m 3.99998,1031.3622 0,3 3,0 0,-3 z"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4133"
+ d="m 28,1028.3622 0,3 3,0 0,-3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4143"
+ d="m 28,1031.3622 0,3 3,0 0,-3 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4155"
+ d="m 28,1034.3622 0,3 3,0 0,-3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4159"
+ d="m 28,1037.3622 0,3 3,0 0,-3 z"
+ style="fill:#ececec;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4161"
+ d="m 28,1025.3622 0,3 3,0 0,-3 z"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4175"
+ d="m 28,1043.3622 0,3 3,0 0,-3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4185"
+ d="m 28,1046.3622 0,3 3,0 0,-3 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4197"
+ d="m 28,1049.3622 0,3 3,0 0,-3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4203"
+ d="m 28,1040.3622 0,3 3,0 0,-3 z"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4207"
+ d="m 6.99998,1049.3622 0,3 3,0 0,-3 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4211"
+ d="m 9.99998,1049.3622 0,3 3,0 0,-3 z"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4213"
+ d="m 9.99998,1046.3622 0,3 3,0 0,-3 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4215"
+ d="m 6.99998,1046.3622 0,3 3,0 0,-3 z"
+ style="fill:#666666;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4217"
+ d="m 3.99998,1049.3622 0,3 3,0 0,-3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4219"
+ d="m 12.99998,1049.3622 0,3 3,0 0,-3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4221"
+ d="m 12.99998,1046.3622 0,3 3,0 0,-3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4245"
+ d="m 3.99998,1046.3622 0,3 3,0 0,-3 z"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4261"
+ d="m 0.99998,1034.3622 0,3 3,0 0,-3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4263"
+ d="m 0.99998,1031.3622 0,3 3,0 0,-3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4267"
+ d="m 0.99998,1037.3622 0,3 3,0 0,-3 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4273"
+ d="m 0.99998,1043.3622 0,3 3,0 0,-3 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4275"
+ d="m 0.99998,1040.3622 0,3 3,0 0,-3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4303"
+ d="m 0.99998,1049.3622 0,3 3,0 0,-3 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4305"
+ d="m 0.99998,1046.3622 0,3 3,0 0,-3 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4093"
+ d="m 12.999974,1043.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4099"
+ d="m 15.999974,1043.3622 3,0 0,3 -3,0 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4105"
+ d="m 21.999974,1043.3622 3,0 0,3 -3,0 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4109"
+ d="m 21.999974,1040.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4113"
+ d="m 18.999974,1034.3622 3,0 0,3 -3,0 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4115"
+ d="m 21.999974,1037.3622 3,0 0,3 -3,0 z"
+ style="fill:#333333;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4117"
+ d="m 21.999974,1034.3622 3,0 0,3 -3,0 z"
+ style="fill:#ececec;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4119"
+ d="m 9.999974,1034.3622 3,0 0,3 -3,0 z"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4377"
+ d="m 21.999974,1043.3622 3,0 0,3 -3,0 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4379"
+ d="m 18.999974,1046.3622 3,0 0,3 -3,0 z"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4381"
+ d="m 15.999974,1046.3622 3,0 0,3 -3,0 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4383"
+ d="m 15.999974,1043.3622 3,0 0,3 -3,0 z"
+ style="fill:#666666;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4387"
+ d="m 18.999974,1049.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4389"
+ d="m 15.999974,1049.3622 3,0 0,3 -3,0 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4391"
+ d="m 21.999974,1046.3622 3,0 0,3 -3,0 z"
+ style="fill:#4d4d4d;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4393"
+ d="m 21.999974,1049.3622 3,0 0,3 -3,0 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4395"
+ d="m 21.999974,1040.3622 3,0 0,3 -3,0 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4397"
+ d="m 24.999974,1046.3622 3,0 0,3 -3,0 z"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4399"
+ d="m 27.999974,1049.3622 3,0 0,3 -3,0 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4401"
+ d="m 24.999974,1049.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4403"
+ d="m 27.999974,1046.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4405"
+ d="m 24.999974,1043.3622 3,0 0,3 -3,0 z"
+ style="fill:#666666;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4407"
+ d="m 24.999974,1040.3622 3,0 0,3 -3,0 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4409"
+ d="m 27.999974,1043.3622 3,0 0,3 -3,0 z"
+ style="fill:#333333;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4411"
+ d="m 27.999974,1040.3622 3,0 0,3 -3,0 z"
+ style="fill:#ececec;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4417"
+ d="m 18.999974,1034.3622 3,0 0,3 -3,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4419"
+ d="m 21.999974,1034.3622 3,0 0,3 -3,0 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4433"
+ d="m 21.999974,1037.3622 3,0 0,3 -3,0 z"
+ style="fill:#4d4d4d;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4435"
+ d="m 21.999974,1040.3622 3,0 0,3 -3,0 z"
+ style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4439"
+ d="m 24.999974,1037.3622 3,0 0,3 -3,0 z"
+ style="fill:#999999;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4441"
+ d="m 27.999974,1040.3622 3,0 0,3 -3,0 z"
+ style="fill:#f2f2f2;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4443"
+ d="m 24.999974,1040.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4445"
+ d="m 27.999974,1037.3622 3,0 0,3 -3,0 z"
+ style="fill:#cccccc;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4447"
+ d="m 24.999974,1034.3622 3,0 0,3 -3,0 z"
+ style="fill:#666666;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4449"
+ d="m 24.999974,1031.3622 3,0 0,3 -3,0 z"
+ style="fill:#b3b3b3;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4451"
+ d="m 27.999974,1034.3622 3,0 0,3 -3,0 z"
+ style="fill:#333333;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4453"
+ d="m 27.999974,1031.3622 3,0 0,3 -3,0 z"
+ style="fill:#ececec;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4455"
+ d="m 15.999974,1031.3622 3,0 0,3 -3,0 z"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ </g>
+ <path
+ style="fill:#000000;stroke:none"
+ d="m 0,1020.3622 c 0,10.0937 0,21.0424 0,32 l 2,0 c 0,-10 0,-20 0,-30 7.6666667,0 28,0 28,0 0,9.4258 0,19.9066 0,30 l 2,0 c 0,-10.6667 0,-21.3333 0,-32 z"
+ id="rect3887"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ style="opacity:0.35;fill:url(#linearGradient3147);fill-opacity:1;stroke:none"
+ d="m 1,1021.3622 c 0,9.7507 0,20.4801 0,31 l 1,0 c 0,-10 0,-20 0,-30 7.6666667,0 28,0 28,0 0,9.4258 0,19.9066 0,30 l 1,0 c 0,-10.3333 0,-20.6667 0,-31 z"
+ id="rect3098"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccc" />
+ <rect
+ style="fill:url(#linearGradient3898);fill-opacity:1;stroke:none"
+ id="rect3890"
+ width="32"
+ height="6"
+ x="0"
+ y="26"
+ transform="translate(0,1020.3622)" />
+ <rect
+ y="1008.7997"
+ x="0.24999999"
+ height="6.0625"
+ width="6.0625"
+ id="rect3931"
+ style="fill:url(#radialGradient3958);fill-opacity:1;stroke:#4d4d4d;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#rect3931"
+ id="use3954"
+ transform="translate(-12.8125,-2.374983)"
+ width="32"
+ height="32" />
+ <g
+ id="g4046"
+ style="opacity:1;">
+ <rect
+ transform="matrix(1.5471436,0,0,1.5471436,-12.037158,1014.8908)"
+ style="fill:#ff0101;fill-opacity:1;stroke:#4d4d4d;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;filter:url(#filter4012)"
+ id="rect4042"
+ width="2"
+ height="2"
+ x="21"
+ y="9" />
+ <rect
+ transform="matrix(0.70378989,0,0,0.70378989,6.5166224,1023.3243)"
+ y="9"
+ x="21"
+ height="2"
+ width="2"
+ id="rect3960"
+ style="fill:#ffc501;fill-opacity:1;stroke:#4d4d4d;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;filter:url(#filter4012)" />
+ <rect
+ style="fill:#fcff01;fill-opacity:1;stroke:#4d4d4d;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;filter:url(#filter4012)"
+ id="rect4044"
+ width="2"
+ height="2"
+ x="21"
+ y="9"
+ transform="matrix(0.16522605,0,0,0.16522605,18.365027,1028.7099)" />
+ </g>
+ <use
+ x="0"
+ y="0"
+ xlink:href="#g4046"
+ id="use4096"
+ transform="translate(-12.000001,0)"
+ width="32"
+ height="32" />
+ </g>
+</svg>
diff --git a/application/resources/sources/steve.svg b/application/resources/sources/steve.svg
new file mode 100644
index 00000000..2233272c
--- /dev/null
+++ b/application/resources/sources/steve.svg
@@ -0,0 +1,534 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="steve.svg"
+ inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/steve128.png"
+ inkscape:export-xdpi="360"
+ inkscape:export-ydpi="360">
+ <defs
+ id="defs4">
+ <filter
+ inkscape:collect="always"
+ id="filter3927"
+ x="-0.10864197"
+ width="1.2172839"
+ y="-0.10864198"
+ height="1.217284">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.1769547"
+ id="feGaussianBlur3929" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#484848"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4"
+ inkscape:cx="-15.767253"
+ inkscape:cy="34.171841"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1607"
+ inkscape:window-height="1030"
+ inkscape:window-x="1676"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2996"
+ empspacing="4"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1020.3622)">
+ <path
+ style="fill:#002020;fill-opacity:1;stroke:none;filter:url(#filter3927)"
+ d="m 5.6875,1024.4872 c -1,0 -2,1 -2,2 l 0,22 c 0,1 1,2 2,2 l 22,0 c 1,0 2,-1 2,-2 l 0,-22 c 0,-1 -1,-2 -2,-2 z"
+ id="rect3223-4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ style="fill:#2b1e0d;fill-opacity:1;stroke:none"
+ d="m 6,1024.3622 20,0 c 1,0 2,1 2,2 l 0,7 -3,0 0,-3 -18,0 0,3 -3,0 0,-7.005 c 0,-0.995 1,-1.995 2,-1.995 z"
+ id="rect3978"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ <path
+ style="fill:#421d0a;fill-opacity:1;stroke:none"
+ d="m 10,22 3,0 0,-3 6,0 0,3 3,0 0,6 -12,0 z"
+ id="rect3981"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccc"
+ transform="translate(0,1020.3622)" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect3080"
+ width="8"
+ height="5.0000172"
+ x="6"
+ y="1035.3622" />
+ <rect
+ y="1035.3622"
+ x="18"
+ height="4.9999957"
+ width="8"
+ id="rect3082"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#9c694c;fill-opacity:1;stroke:none"
+ d="m 7,10 18,0 0,3 3,0 0,13 c 0,1 -1,2 -2,2 l -4,0 0,-6 -3,0 0,-3 6,0 0,-3 -6,0 0,3 -6,0 0,-3 -6,0 0,3 6,0 0,3 -3,0 0,6 -4,0 C 5,28 4,27 4,26 l 0,-10 0,-3 3,0 z"
+ id="rect3941"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccccccccccccccccc"
+ transform="translate(0,1020.3622)" />
+ <rect
+ y="1024.3622"
+ x="6.9999995"
+ height="3"
+ width="3"
+ id="rect3011-9"
+ style="fill:#2b1e0d;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#2f1f0f;fill-opacity:1;stroke:none"
+ id="rect3013-0"
+ width="3"
+ height="3"
+ x="10"
+ y="1024.3622" />
+ <rect
+ style="fill:#281c0b;fill-opacity:1;stroke:none"
+ id="rect3017-9"
+ width="3"
+ height="3"
+ x="13"
+ y="1024.3622" />
+ <rect
+ y="1024.3622"
+ x="16"
+ height="3"
+ width="3"
+ id="rect3019-6"
+ style="fill:#241808;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#261a0a;fill-opacity:1;stroke:none"
+ id="rect3021-8"
+ width="3"
+ height="3"
+ x="19"
+ y="1024.3622" />
+ <rect
+ y="1024.3622"
+ x="22"
+ height="3"
+ width="3"
+ id="rect3023-6"
+ style="fill:#2b1e0d;fill-opacity:1;stroke:none" />
+ <rect
+ y="1027.3622"
+ x="3.9999998"
+ height="3"
+ width="3"
+ id="rect3027-7"
+ style="fill:#2b1e0d;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#2b1e0d;fill-opacity:1;stroke:none"
+ id="rect3029-6"
+ width="3"
+ height="3"
+ x="6.9999995"
+ y="1027.3622" />
+ <rect
+ style="fill:#2b1e0d;fill-opacity:1;stroke:none"
+ id="rect3033-4"
+ width="3"
+ height="3"
+ x="10"
+ y="1027.3622" />
+ <rect
+ y="1027.3622"
+ x="13"
+ height="3"
+ width="3"
+ id="rect3035-4"
+ style="fill:#332411;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#422a12;fill-opacity:1;stroke:none"
+ id="rect3037-2"
+ width="3"
+ height="3"
+ x="16"
+ y="1027.3622" />
+ <rect
+ y="1027.3622"
+ x="19"
+ height="3"
+ width="3"
+ id="rect3039-4"
+ style="fill:#3f2a15;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#2c1e0e;fill-opacity:1;stroke:none"
+ id="rect3041-2"
+ width="3"
+ height="3"
+ x="22"
+ y="1027.3622" />
+ <rect
+ y="1027.3622"
+ x="25"
+ height="3"
+ width="3"
+ id="rect3043-1"
+ style="fill:#281c0b;fill-opacity:1;stroke:none" />
+ <rect
+ y="1030.3622"
+ x="3.9999998"
+ height="3"
+ width="3"
+ id="rect3045-3"
+ style="fill:#2b1e0d;fill-opacity:1;stroke:none" />
+ <rect
+ y="1030.3622"
+ x="25"
+ height="3"
+ width="3"
+ id="rect3061-7"
+ style="fill:#342512;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#8a4c3d;fill-opacity:1;stroke:none"
+ id="rect3089"
+ width="6"
+ height="3"
+ x="13"
+ y="1042.3622" />
+ <g
+ id="g3856"
+ transform="translate(0,1.7382813e-5)">
+ <rect
+ y="1039.3622"
+ x="13"
+ height="3"
+ width="6"
+ id="rect3177-4"
+ style="fill:#6a4030;fill-opacity:1;stroke:none" />
+ <rect
+ y="1042.3622"
+ x="10"
+ height="3"
+ width="3"
+ id="rect3085"
+ style="fill:#41210c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#41210c;fill-opacity:1;stroke:none"
+ id="rect3091"
+ width="3"
+ height="3"
+ x="19"
+ y="1042.3622" />
+ <rect
+ y="1045.3622"
+ x="13"
+ height="3"
+ width="3"
+ id="rect3093"
+ style="fill:#421d0a;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#45220e;fill-opacity:1;stroke:none"
+ id="rect3095"
+ width="3"
+ height="3"
+ x="19"
+ y="1045.3622" />
+ <rect
+ y="1045.3622"
+ x="10"
+ height="3"
+ width="3"
+ id="rect3097"
+ style="fill:#45220e;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#45220e;fill-opacity:1;stroke:none"
+ id="rect3099"
+ width="3"
+ height="3"
+ x="16"
+ y="1045.3622" />
+ </g>
+ <g
+ id="g3944"
+ transform="translate(-28,1.7382813e-5)">
+ <rect
+ y="1030.3622"
+ x="35"
+ height="3"
+ width="3"
+ id="rect3047-1"
+ style="fill:#b6896c;fill-opacity:1;stroke:none" />
+ <rect
+ y="1030.3622"
+ x="38"
+ height="3"
+ width="3"
+ id="rect3051-9"
+ style="fill:#bd8e72;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#c69680;fill-opacity:1;stroke:none"
+ id="rect3053-2"
+ width="3"
+ height="3"
+ x="41"
+ y="1030.3622" />
+ <rect
+ y="1030.3622"
+ x="44"
+ height="3"
+ width="3"
+ id="rect3055-9"
+ style="fill:#bd8b72;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bd8e74;fill-opacity:1;stroke:none"
+ id="rect3057-7"
+ width="3"
+ height="3"
+ x="47"
+ y="1030.3622" />
+ <rect
+ y="1030.3622"
+ x="50"
+ height="3"
+ width="3"
+ id="rect3059-2"
+ style="fill:#ac765a;fill-opacity:1;stroke:none" />
+ <rect
+ y="1033.3622"
+ x="32"
+ height="3"
+ width="3"
+ id="rect3063-8"
+ style="fill:#aa7d66;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b4846d;fill-opacity:1;stroke:none"
+ id="rect3065-6"
+ width="3"
+ height="3"
+ x="35"
+ y="1033.3622" />
+ <rect
+ style="fill:#aa7d66;fill-opacity:1;stroke:none"
+ id="rect3069-9"
+ width="3"
+ height="3"
+ x="38"
+ y="1033.3622" />
+ <rect
+ y="1033.3622"
+ x="41"
+ height="3"
+ width="3"
+ id="rect3071-7"
+ style="fill:#ad806d;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#9c725c;fill-opacity:1;stroke:none"
+ id="rect3073-1"
+ width="3"
+ height="3"
+ x="44"
+ y="1033.3622" />
+ <rect
+ y="1033.3622"
+ x="47"
+ height="3"
+ width="3"
+ id="rect3075-8"
+ style="fill:#bb8972;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#9c694c;fill-opacity:1;stroke:none"
+ id="rect3077-8"
+ width="3"
+ height="3"
+ x="50"
+ y="1033.3622" />
+ <rect
+ y="1033.3622"
+ x="53"
+ height="3"
+ width="3"
+ id="rect3079-2"
+ style="fill:#9c694c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b4846d;fill-opacity:1;stroke:none"
+ id="rect3153-6"
+ width="3"
+ height="3"
+ x="32"
+ y="1036.3622" />
+ <rect
+ style="fill:#b57b67;fill-opacity:1;stroke:none"
+ id="rect3159-7"
+ width="3"
+ height="3"
+ x="41"
+ y="1036.3622" />
+ <rect
+ y="1036.3622"
+ x="44"
+ height="3"
+ width="3"
+ id="rect3161-0"
+ style="fill:#bb8972;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#aa7d66;fill-opacity:1;stroke:none"
+ id="rect3167-3"
+ width="3"
+ height="3"
+ x="53"
+ y="1036.3622" />
+ <rect
+ y="1039.3622"
+ x="32"
+ height="3"
+ width="3"
+ id="rect3169-4"
+ style="fill:#9c6346;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b37b62;fill-opacity:1;stroke:none"
+ id="rect3171-8"
+ width="3"
+ height="3"
+ x="35"
+ y="1039.3622" />
+ <rect
+ style="fill:#b78272;fill-opacity:1;stroke:none"
+ id="rect3175-0"
+ width="3"
+ height="3"
+ x="38"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="47"
+ height="3"
+ width="3"
+ id="rect3181-9"
+ style="fill:#be886c;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#a26a47;fill-opacity:1;stroke:none"
+ id="rect3183-7"
+ width="3"
+ height="3"
+ x="50"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="53"
+ height="3"
+ width="3"
+ id="rect3185-6"
+ style="fill:#805334;fill-opacity:1;stroke:none" />
+ <rect
+ y="1042.3622"
+ x="32"
+ height="3"
+ width="3"
+ id="rect3187-1"
+ style="fill:#905e43;fill-opacity:1;stroke:none" />
+ <rect
+ y="1042.3622"
+ x="53"
+ height="3"
+ width="3"
+ id="rect3203-8"
+ style="fill:#815339;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#6f452c;fill-opacity:1;stroke:none"
+ d="m 32,1045.3622 3,0 0,3 -1,0 c -1,0 -2,-1 -2,-2 z"
+ id="rect3205-4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ <rect
+ y="1045.3622"
+ x="35"
+ height="3"
+ width="3"
+ id="rect3207-2"
+ style="fill:#6d432a;fill-opacity:1;stroke:none" />
+ <rect
+ y="1045.3622"
+ x="50"
+ height="3"
+ width="3"
+ id="rect3219-4"
+ style="fill:#83553b;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#7a4e33;fill-opacity:1;stroke:none"
+ d="m 53,1045.3622 3,0 0,1 c 0,1 -1,2 -2,2 l -1,0 z"
+ id="rect3221-5"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ <rect
+ style="fill:#965f40;fill-opacity:1;stroke:none"
+ id="rect3083"
+ width="3"
+ height="3"
+ x="35"
+ y="1042.3622" />
+ <rect
+ y="1042.3622"
+ x="50"
+ height="3"
+ width="3"
+ id="rect3101"
+ style="fill:#8f5e3e;fill-opacity:1;stroke:none" />
+ </g>
+ <rect
+ style="fill:#523d89;fill-opacity:1;stroke:none"
+ id="rect3084"
+ width="3"
+ height="3"
+ x="10"
+ y="16"
+ transform="translate(0,1020.3622)" />
+ <rect
+ style="fill:#523d89;fill-opacity:1;stroke:none"
+ id="rect3086"
+ width="3"
+ height="3"
+ x="19"
+ y="16"
+ transform="translate(0,1020.3622)" />
+ </g>
+</svg>
diff --git a/application/resources/versions/LWJGL/2.9.0.json b/application/resources/versions/LWJGL/2.9.0.json
new file mode 100644
index 00000000..5dbd624e
--- /dev/null
+++ b/application/resources/versions/LWJGL/2.9.0.json
@@ -0,0 +1,45 @@
+ {
+ "fileId": "org.lwjgl",
+ "name": "LWJGL",
+ "version": "2.9.0",
+ "+libraries": [
+ {
+ "name": "net.java.jinput:jinput:2.0.5"
+ },
+ {
+ "name": "net.java.jinput:jinput-platform:2.0.5",
+ "natives": {
+ "linux": "natives-linux",
+ "windows": "natives-windows",
+ "osx": "natives-osx"
+ },
+ "extract": {
+ "exclude": [
+ "META-INF/"
+ ]
+ }
+ },
+ {
+ "name": "net.java.jutils:jutils:1.0.0"
+ },
+ {
+ "name": "org.lwjgl.lwjgl:lwjgl:2.9.0"
+ },
+ {
+ "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.0"
+ },
+ {
+ "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.0",
+ "natives": {
+ "linux": "natives-linux",
+ "windows": "natives-windows",
+ "osx": "natives-osx"
+ },
+ "extract": {
+ "exclude": [
+ "META-INF/"
+ ]
+ }
+ }
+ ]
+}
diff --git a/application/resources/versions/LWJGL/2.9.1-nightly-20130708-debug3.json b/application/resources/versions/LWJGL/2.9.1-nightly-20130708-debug3.json
new file mode 100644
index 00000000..7265b3b0
--- /dev/null
+++ b/application/resources/versions/LWJGL/2.9.1-nightly-20130708-debug3.json
@@ -0,0 +1,45 @@
+{
+ "fileId": "org.lwjgl",
+ "name": "LWJGL",
+ "version": "2.9.1-nightly-20130708-debug3",
+ "+libraries": [
+ {
+ "name": "net.java.jinput:jinput:2.0.5"
+ },
+ {
+ "name": "net.java.jinput:jinput-platform:2.0.5",
+ "natives": {
+ "linux": "natives-linux",
+ "windows": "natives-windows",
+ "osx": "natives-osx"
+ },
+ "extract": {
+ "exclude": [
+ "META-INF/"
+ ]
+ }
+ },
+ {
+ "name": "net.java.jutils:jutils:1.0.0"
+ },
+ {
+ "name": "org.lwjgl.lwjgl:lwjgl:2.9.1-nightly-20130708-debug3"
+ },
+ {
+ "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.1-nightly-20130708-debug3"
+ },
+ {
+ "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.1-nightly-20130708-debug3",
+ "natives": {
+ "linux": "natives-linux",
+ "windows": "natives-windows",
+ "osx": "natives-osx"
+ },
+ "extract": {
+ "exclude": [
+ "META-INF/"
+ ]
+ }
+ }
+ ]
+}
diff --git a/application/resources/versions/LWJGL/2.9.1.json b/application/resources/versions/LWJGL/2.9.1.json
new file mode 100644
index 00000000..e7f5e947
--- /dev/null
+++ b/application/resources/versions/LWJGL/2.9.1.json
@@ -0,0 +1,45 @@
+ {
+ "fileId": "org.lwjgl",
+ "name": "LWJGL",
+ "version": "2.9.1",
+ "+libraries": [
+ {
+ "name": "net.java.jinput:jinput:2.0.5"
+ },
+ {
+ "name": "net.java.jinput:jinput-platform:2.0.5",
+ "natives": {
+ "linux": "natives-linux",
+ "windows": "natives-windows",
+ "osx": "natives-osx"
+ },
+ "extract": {
+ "exclude": [
+ "META-INF/"
+ ]
+ }
+ },
+ {
+ "name": "net.java.jutils:jutils:1.0.0"
+ },
+ {
+ "name": "org.lwjgl.lwjgl:lwjgl:2.9.1"
+ },
+ {
+ "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.1"
+ },
+ {
+ "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.1",
+ "natives": {
+ "linux": "natives-linux",
+ "windows": "natives-windows",
+ "osx": "natives-osx"
+ },
+ "extract": {
+ "exclude": [
+ "META-INF/"
+ ]
+ }
+ }
+ ]
+}
diff --git a/application/resources/versions/LWJGL/2.9.2-nightly-20140822.json b/application/resources/versions/LWJGL/2.9.2-nightly-20140822.json
new file mode 100644
index 00000000..25b22eb9
--- /dev/null
+++ b/application/resources/versions/LWJGL/2.9.2-nightly-20140822.json
@@ -0,0 +1,45 @@
+{
+ "fileId": "org.lwjgl",
+ "name": "LWJGL",
+ "version": "2.9.2-nightly-20140822",
+ "+libraries": [
+ {
+ "name": "net.java.jinput:jinput:2.0.5"
+ },
+ {
+ "name": "net.java.jinput:jinput-platform:2.0.5",
+ "natives": {
+ "linux": "natives-linux",
+ "windows": "natives-windows",
+ "osx": "natives-osx"
+ },
+ "extract": {
+ "exclude": [
+ "META-INF/"
+ ]
+ }
+ },
+ {
+ "name": "net.java.jutils:jutils:1.0.0"
+ },
+ {
+ "name": "org.lwjgl.lwjgl:lwjgl:2.9.2-nightly-20140822"
+ },
+ {
+ "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.2-nightly-20140822"
+ },
+ {
+ "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.2-nightly-20140822",
+ "natives": {
+ "linux": "natives-linux",
+ "windows": "natives-windows",
+ "osx": "natives-osx"
+ },
+ "extract": {
+ "exclude": [
+ "META-INF/"
+ ]
+ }
+ }
+ ]
+}
diff --git a/application/resources/versions/minecraft.json b/application/resources/versions/minecraft.json
new file mode 100644
index 00000000..58b153c2
--- /dev/null
+++ b/application/resources/versions/minecraft.json
@@ -0,0 +1,668 @@
+{
+"versions": [
+ {
+ "id": "1.5.2",
+ "checksum": "6897c3287fb971c9f362eb3ab20f5ddd",
+ "releaseTime": "2013-04-25T17:45:00+02:00",
+ "type": "release",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.5.1",
+ "checksum": "5c1219d869b87d233de3033688ec7567",
+ "releaseTime": "2013-03-20T12:00:00+02:00",
+ "type": "release",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.5",
+ "checksum": "fd11cbc5b01aae1d62cff0145171f3d9",
+ "releaseTime": "2013-03-07T00:00:00+02:00",
+ "type": "snapshot",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.4.7",
+ "checksum": "8e80fb01b321c6b3c7efca397a3eea35",
+ "releaseTime": "2012-12-28T00:00:00+02:00",
+ "type": "release",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.4.6",
+ "checksum": "48677dc4c2b98c29918722b5ab27b4fd",
+ "releaseTime": "2012-12-20T00:00:00+02:00",
+ "type": "release",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.4.5",
+ "checksum": "b15e2b2b6b4629f0d99a95b6b44412a0",
+ "releaseTime": "2012-11-20T00:00:00+02:00",
+ "type": "release",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.4.4",
+ "checksum": "7aa46c8058cba2f38e9d2ddddcc77c72",
+ "releaseTime": "2012-11-14T00:00:00+02:00",
+ "type": "release",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.4.3",
+ "checksum": "9cc3295931edb6339f22989fe1b612a6",
+ "releaseTime": "2012-11-01T00:00:00+02:00",
+ "type": "snapshot",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.4.2",
+ "checksum": "771175c01778ea67395bc6919a5a9dc5",
+ "releaseTime": "2012-10-25T00:00:00+02:00",
+ "type": "release",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.4.1",
+ "checksum": "542621a5298659dc65f383f35170fc4c",
+ "releaseTime": "2012-10-23T00:00:00+02:00",
+ "type": "snapshot",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.4",
+ "checksum": "32a654388b54d3e4bb29c1a46e7d6a12",
+ "releaseTime": "2012-10-19T00:00:00+02:00",
+ "type": "snapshot",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.3.2",
+ "checksum": "969699f13e5bbe7f12e40ac4f32b7d9a",
+ "releaseTime": "2012-08-16T00:00:00+02:00",
+ "type": "release",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.3.1",
+ "checksum": "266ccbc9798afd2eadf3d6c01b4c562a",
+ "releaseTime": "2012-08-01T00:00:00+02:00",
+ "type": "release",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.3",
+ "checksum": "a6effac1eaccf5d429aae340cf95ed5d",
+ "releaseTime": "2012-07-26T00:00:00+02:00",
+ "type": "snapshot",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.2.5",
+ "checksum": "8e8778078a175a33603a585257f28563",
+ "releaseTime": "2012-03-30T00:00:00+02:00",
+ "type": "release",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.2.4",
+ "checksum": "25423eab6d8707f96cc6ad8a21a7250a",
+ "releaseTime": "2012-03-22T00:00:00+02:00",
+ "type": "release",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.2.3",
+ "checksum": "12f6c4b1bdcc63f029e3c088a364b8e4",
+ "releaseTime": "2012-03-02T00:00:00+02:00",
+ "type": "release",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.2.2",
+ "checksum": "6189e96efaea11e5164b4a4755574324",
+ "releaseTime": "2012-03-01T00:00:01+02:00",
+ "type": "release",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.2.1",
+ "checksum": "97067a603eba2b6eb75d3194f81f6bcd",
+ "releaseTime": "2012-03-01T00:00:00+02:00",
+ "type": "release",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.1",
+ "checksum": "e92302d2acdba7c97e0d8df1e10d2006",
+ "releaseTime": "2012-01-12T00:00:00+02:00",
+ "type": "release",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "1.0",
+ "checksum": "3820d222b95d0b8c520d9596a756a6e6",
+ "releaseTime": "2011-11-18T00:00:00+02:00",
+ "type": "release",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.8.1",
+ "checksum": "f8c5a2ccd3bc996792bbe436d8cc08bc",
+ "releaseTime": "2011-09-19T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.8",
+ "checksum": "a59a9fd4c726a573b0a2bdd10d857f59",
+ "releaseTime": "2011-09-15T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.7.3",
+ "checksum": "eae3353fdaa7e10a59b4cb5b45bfa10d",
+ "releaseTime": "2011-07-08T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.7.2",
+ "checksum": "dd9215ab1141170d4871f42bff4ab302",
+ "releaseTime": "2011-07-01T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.7",
+ "checksum": "682419e9ed1a236c3067822d53cda1e4",
+ "releaseTime": "2011-06-30T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.6.6",
+ "checksum": "ce80072464433cd5b05d505aa8ff29d1",
+ "releaseTime": "2011-05-31T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.6.5",
+ "checksum": "2aba888864b32038c8d22ee5df71b7c8",
+ "releaseTime": "2011-05-28T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.6.4",
+ "checksum": "5c4df6f120336f113180698613853dba",
+ "releaseTime": "2011-05-26T00:00:04+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.6.3",
+ "checksum": "efc2becca965e4f8feb5b4210c6a4fd1",
+ "releaseTime": "2011-05-26T00:00:03+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.6.2",
+ "checksum": "01330b1c930102a683a4dd8d792e632e",
+ "releaseTime": "2011-05-26T00:00:02+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.6.1",
+ "checksum": "a7e82c441a57ef4068c533f4d777336a",
+ "releaseTime": "2011-05-26T00:00:01+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.6",
+ "checksum": "d531e221227a65392259d3141893280d",
+ "releaseTime": "2011-05-26T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.5_01",
+ "checksum": "d02fa9998e30693d8d989d5f88cf0040",
+ "releaseTime": "2011-04-20T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.5",
+ "checksum": "24289130902822d73f8722b52bc07cdb",
+ "releaseTime": "2011-04-19T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.4_01",
+ "checksum": "9379e54b581ba4ef3acc3e326e87db91",
+ "releaseTime": "2011-04-05T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.4",
+ "checksum": "71e64b61175b371ed148b385f2d14ebf",
+ "releaseTime": "2011-03-31T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.3_01",
+ "checksum": "4203826f35e1036f089919032c3d19d1",
+ "releaseTime": "2011-02-23T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.3b",
+ "checksum": "de2164df461d028229ed2e101181bbd4",
+ "releaseTime": "2011-02-22T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.2_02",
+ "checksum": "1736c5ba4f63a981220c2a18a4120180",
+ "releaseTime": "2011-01-21T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.2_01",
+ "checksum": "486d83ec00554b45ffa21af2faa0116a",
+ "releaseTime": "2011-01-14T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.2",
+ "checksum": "6426223efe23c3931a4ef89685be3349",
+ "releaseTime": "2011-01-13T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.1_02",
+ "checksum": "7d547e495a770c62054ef136add43034",
+ "releaseTime": "2010-12-22T00:00:01+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.1_01",
+ "checksum": "1f9331f2bfca81b6ce2acdfc1f105837",
+ "releaseTime": "2010-12-22T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.0.2",
+ "checksum": "d200c465b8c167cc8df6537531fc9a48",
+ "releaseTime": "2010-12-21T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.0_01",
+ "checksum": "03bd20b870dbbd121de5dca98af4e1ce",
+ "releaseTime": "2010-12-20T00:00:01+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "b1.0",
+ "checksum": "5f8733dbbf09b4e7c874661a3c29c239",
+ "releaseTime": "2010-12-20T00:00:00+02:00",
+ "type": "old_beta",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "a1.2.6",
+ "checksum": "ddd5e39467f28d1ea1a03b4d9e790867",
+ "releaseTime": "2010-12-03T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "a1.2.5",
+ "checksum": "7d3a43037190970ff2e11153b5718b74",
+ "releaseTime": "2010-12-01T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "a1.2.4_01",
+ "checksum": "0a1cc8c668faa6dc93fc418e8b4b097a",
+ "releaseTime": "2010-11-30T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "a1.2.3_04",
+ "checksum": "b2c25a753c82a1cd228ce71469829dc1",
+ "releaseTime": "2010-11-26T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "a1.2.3_02",
+ "checksum": "3ad4808ef2ac3b65d10305315260da03",
+ "releaseTime": "2010-11-25T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "a1.2.3_01",
+ "checksum": "70cbab762b17c5b11fefea9b12564119",
+ "releaseTime": "2010-11-24T00:00:01+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "a1.2.3",
+ "checksum": "25f053114e34b915e675f82d58f08711",
+ "releaseTime": "2010-11-24T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "a1.2.2b",
+ "checksum": "6250fb17f8898c4d970d6bd03c229177",
+ "releaseTime": "2010-11-10T00:00:01+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "a1.2.2a",
+ "checksum": "0f9fe018b344fd9dd849005f9bdca803",
+ "releaseTime": "2010-11-10T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "texturepacks"]
+ },
+ {
+ "id": "a1.2.1_01",
+ "checksum": "0a496e44a7b4e2f493b5893d8e5845bd",
+ "releaseTime": "2010-11-05T00:00:01+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "a1.2.1",
+ "checksum": "0a496e44a7b4e2f493b5893d8e5845bd",
+ "releaseTime": "2010-11-05T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "a1.2.0_02",
+ "checksum": "f5bcb4d0c0e78bc220f164b89ae9bd60",
+ "releaseTime": "2010-11-04T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "a1.2.0_01",
+ "checksum": "b2e9333e967cb89488884c2e5c715d4f",
+ "releaseTime": "2010-10-31T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "a1.2.0",
+ "checksum": "44c384dae02390f700458b95d82c3e2a",
+ "releaseTime": "2010-10-30T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "a1.1.2_01",
+ "checksum": "94346e1b8f6ad0e4a284314f0e29207b",
+ "releaseTime": "2010-09-23T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "a1.1.2",
+ "checksum": "72ba1f834327805cb44164a42b331522",
+ "releaseTime": "2010-09-20T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "a1.1.0",
+ "checksum": "891fd93e04f5daaf35d73c58e45c01b1",
+ "releaseTime": "2010-09-13T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "a1.0.17_04",
+ "checksum": "16ed7dc58244772847991e504afcf02f",
+ "releaseTime": "2010-08-23T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "a1.0.17_02",
+ "checksum": "d89760b0871ef61a55c9f336c0439d58",
+ "releaseTime": "2010-08-20T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "a1.0.16",
+ "checksum": "6bbde02c13aed5766275f4398ede6aae",
+ "releaseTime": "2010-08-12T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "a1.0.15",
+ "checksum": "ade257d2080d56fa983763f9c701fa14",
+ "releaseTime": "2010-08-04T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "a1.0.14",
+ "checksum": "227d0c6fa896a231de6269a074c9a458",
+ "releaseTime": "2010-07-30T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "a1.0.11",
+ "checksum": "6f1b1dd157fa0df39760f5be3eab01b0",
+ "releaseTime": "2010-07-23T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "a1.0.5_01",
+ "checksum": "ae5f606caa18222e7568819c910ee423",
+ "releaseTime": "2010-07-13T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "mainClass": "y",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "a1.0.4",
+ "checksum": "13ce7935c3670e7494e26b2704bfa3e9",
+ "releaseTime": "2010-07-09T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "mainClass": "ax",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "inf-20100618",
+ "checksum": "f5f5aa34760facc10486e906a7c60196",
+ "releaseTime": "2010-06-16T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "mainClass": "net.minecraft.client.d",
+ "appletClass": "net.minecraft.client.MinecraftApplet",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "c0.30_01c",
+ "checksum": "fcfd7f83a6b27503cf48202381a5adf2",
+ "releaseTime": "2009-12-22T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "mainClass": "com.mojang.minecraft.l",
+ "appletClass": "com.mojang.minecraft.MinecraftApplet",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "c0.0.13a_03",
+ "checksum": "a9527cb5aef198e0f53e235ebe13dc75",
+ "releaseTime": "2009-05-22T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "mainClass": "com.mojang.minecraft.c",
+ "appletClass": "com.mojang.minecraft.MinecraftApplet",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "c0.0.13a",
+ "checksum": "3617fbf5fbfd2b837ebf5ceb63584908",
+ "releaseTime": "2009-05-31T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "mainClass": "com.mojang.minecraft.Minecraft",
+ "appletClass": "com.mojang.minecraft.MinecraftApplet",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "c0.0.11a",
+ "checksum": "a6e03c2eaf74709facc0d2477648e999",
+ "releaseTime": "2009-05-17T00:00:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "mainClass": "com.mojang.minecraft.Minecraft",
+ "appletClass": "com.mojang.minecraft.MinecraftApplet",
+ "+traits": ["legacyLaunch", "no-texturepacks"]
+ },
+ {
+ "id": "rd-161348",
+ "checksum": "80882b8936a5c8d91500838a6660b504",
+ "releaseTime": "2009-05-16T13:48:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "mainClass": "com.mojang.minecraft.RubyDung",
+ "+traits": ["no-texturepacks"]
+ },
+ {
+ "id": "rd-160052",
+ "checksum": "24c5cc99a2a612697ed2f7d5d04242fe",
+ "releaseTime": "2009-05-16T00:52:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "mainClass": "com.mojang.rubydung.RubyDung",
+ "+traits": ["no-texturepacks"]
+ },
+ {
+ "id": "rd-132328",
+ "checksum": "70e33a81c541b13a477e68c1207124eb",
+ "releaseTime": "2009-05-13T23:28:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "mainClass": "com.mojang.rubydung.RubyDung",
+ "+traits": ["no-texturepacks"]
+ },
+ {
+ "id": "rd-132211",
+ "checksum": "99fdaea10c494b9c3c3254636b98b799",
+ "releaseTime": "2009-05-13T22:11:00+02:00",
+ "type": "old_alpha",
+ "processArguments": "legacy",
+ "mainClass": "com.mojang.rubydung.RubyDung",
+ "+traits": ["no-texturepacks"]
+ }
+]
+}
diff --git a/application/resources/versions/versions.qrc b/application/resources/versions/versions.qrc
new file mode 100644
index 00000000..e9621e97
--- /dev/null
+++ b/application/resources/versions/versions.qrc
@@ -0,0 +1,12 @@
+<!DOCTYPE RCC>
+<RCC version="1.0">
+ <qresource prefix="/versions">
+ <!-- builtin legacy versions -->
+ <file>minecraft.json</file>
+ <!-- LWJGL -->
+ <file>LWJGL/2.9.0.json</file>
+ <file>LWJGL/2.9.1-nightly-20130708-debug3.json</file>
+ <file>LWJGL/2.9.1.json</file>
+ <file>LWJGL/2.9.2-nightly-20140822.json</file>
+ </qresource>
+</RCC>
diff --git a/application/widgets/Common.cpp b/application/widgets/Common.cpp
new file mode 100644
index 00000000..9b730d6c
--- /dev/null
+++ b/application/widgets/Common.cpp
@@ -0,0 +1,27 @@
+#include "Common.h"
+
+// Origin: Qt
+QStringList viewItemTextLayout(QTextLayout &textLayout, int lineWidth, qreal &height,
+ qreal &widthUsed)
+{
+ QStringList lines;
+ height = 0;
+ widthUsed = 0;
+ textLayout.beginLayout();
+ QString str = textLayout.text();
+ while (true)
+ {
+ QTextLine line = textLayout.createLine();
+ if (!line.isValid())
+ break;
+ if (line.textLength() == 0)
+ break;
+ line.setLineWidth(lineWidth);
+ line.setPosition(QPointF(0, height));
+ height += line.height();
+ lines.append(str.mid(line.textStart(), line.textLength()));
+ widthUsed = qMax(widthUsed, line.naturalTextWidth());
+ }
+ textLayout.endLayout();
+ return lines;
+}
diff --git a/application/widgets/Common.h b/application/widgets/Common.h
new file mode 100644
index 00000000..fc46e08f
--- /dev/null
+++ b/application/widgets/Common.h
@@ -0,0 +1,6 @@
+#pragma once
+#include <QStringList>
+#include <QTextLayout>
+
+QStringList viewItemTextLayout(QTextLayout &textLayout, int lineWidth, qreal &height,
+ qreal &widthUsed); \ No newline at end of file
diff --git a/application/widgets/IconLabel.cpp b/application/widgets/IconLabel.cpp
new file mode 100644
index 00000000..86c8a431
--- /dev/null
+++ b/application/widgets/IconLabel.cpp
@@ -0,0 +1,43 @@
+#include "IconLabel.h"
+
+#include <QStyle>
+#include <QStyleOption>
+#include <QLayout>
+#include <QPainter>
+#include <QRect>
+
+IconLabel::IconLabel(QWidget *parent, QIcon icon, QSize size)
+ : QWidget(parent), m_size(size), m_icon(icon)
+{
+ setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+}
+
+QSize IconLabel::sizeHint() const
+{
+ return m_size;
+}
+
+void IconLabel::setIcon(QIcon icon)
+{
+ m_icon = icon;
+ update();
+}
+
+void IconLabel::paintEvent(QPaintEvent *)
+{
+ QPainter p(this);
+ QRect rect = contentsRect();
+ int width = rect.width();
+ int height = rect.height();
+ if(width < height)
+ {
+ rect.setHeight(width);
+ rect.translate(0, (height - width) / 2);
+ }
+ else if (width > height)
+ {
+ rect.setWidth(height);
+ rect.translate((width - height) / 2, 0);
+ }
+ m_icon.paint(&p, rect);
+}
diff --git a/application/widgets/IconLabel.h b/application/widgets/IconLabel.h
new file mode 100644
index 00000000..a2f1eef3
--- /dev/null
+++ b/application/widgets/IconLabel.h
@@ -0,0 +1,26 @@
+#pragma once
+#include <QWidget>
+#include <QIcon>
+
+class QStyleOption;
+
+/**
+ * This is a trivial widget that paints a QIcon of the specified size.
+ */
+class IconLabel : public QWidget
+{
+ Q_OBJECT
+
+public:
+ /// Create a line separator. orientation is the orientation of the line.
+ explicit IconLabel(QWidget *parent, QIcon icon, QSize size);
+
+ virtual QSize sizeHint() const;
+ virtual void paintEvent(QPaintEvent *);
+
+ void setIcon(QIcon icon);
+
+private:
+ QSize m_size;
+ QIcon m_icon;
+};
diff --git a/application/widgets/LabeledToolButton.cpp b/application/widgets/LabeledToolButton.cpp
new file mode 100644
index 00000000..dfdde1bc
--- /dev/null
+++ b/application/widgets/LabeledToolButton.cpp
@@ -0,0 +1,86 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <QLabel>
+#include <QVBoxLayout>
+#include <QResizeEvent>
+#include <QStyleOption>
+#include "LabeledToolButton.h"
+#include <QApplication>
+
+/*
+ *
+ * Tool Button with a label on it, instead of the normal text rendering
+ *
+ */
+
+LabeledToolButton::LabeledToolButton(QWidget * parent)
+ : QToolButton(parent)
+ , m_label(new QLabel(this))
+{
+ //QToolButton::setText(" ");
+ m_label->setWordWrap(true);
+ m_label->setMouseTracking(false);
+ m_label->setAlignment(Qt::AlignCenter);
+ m_label->setTextInteractionFlags(Qt::NoTextInteraction);
+ // somehow, this makes word wrap work in the QLabel. yay.
+ m_label->setMinimumWidth(100);
+}
+
+QString LabeledToolButton::text() const
+{
+ return m_label->text();
+}
+
+void LabeledToolButton::setText(const QString & text)
+{
+ m_label->setText(text);
+}
+
+/*!
+ \reimp
+*/
+QSize LabeledToolButton::sizeHint() const
+{
+ /*
+ Q_D(const QToolButton);
+ if (d->sizeHint.isValid())
+ return d->sizeHint;
+ */
+ ensurePolished();
+
+ int w = 0, h = 0;
+ QStyleOptionToolButton opt;
+ initStyleOption(&opt);
+ QSize sz =m_label->sizeHint();
+ w = sz.width();
+ h = sz.height();
+
+ opt.rect.setSize(QSize(w, h)); // PM_MenuButtonIndicator depends on the height
+ if (popupMode() == MenuButtonPopup)
+ w += style()->pixelMetric(QStyle::PM_MenuButtonIndicator, &opt, this);
+
+ QSize rawSize = style()->sizeFromContents(QStyle::CT_ToolButton, &opt, QSize(w, h), this);
+ QSize sizeHint = rawSize.expandedTo(QApplication::globalStrut());
+ return sizeHint;
+}
+
+
+
+void LabeledToolButton::resizeEvent(QResizeEvent * event)
+{
+ m_label->setGeometry(QRect(4, 4, width()-8, height()-8));
+ QWidget::resizeEvent(event);
+}
diff --git a/application/widgets/LabeledToolButton.h b/application/widgets/LabeledToolButton.h
new file mode 100644
index 00000000..1b74c4ee
--- /dev/null
+++ b/application/widgets/LabeledToolButton.h
@@ -0,0 +1,37 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QPushButton>
+#include <QToolButton>
+
+class QLabel;
+
+class LabeledToolButton : public QToolButton
+{
+ Q_OBJECT
+
+ QLabel * m_label;
+
+public:
+ LabeledToolButton(QWidget * parent = 0);
+
+ QString text() const;
+ void setText(const QString & text);
+ virtual QSize sizeHint() const;
+protected:
+ void resizeEvent(QResizeEvent * event);
+};
diff --git a/application/widgets/LineSeparator.cpp b/application/widgets/LineSeparator.cpp
new file mode 100644
index 00000000..f4ee173d
--- /dev/null
+++ b/application/widgets/LineSeparator.cpp
@@ -0,0 +1,37 @@
+#include "LineSeparator.h"
+
+#include <QStyle>
+#include <QStyleOption>
+#include <QLayout>
+#include <QPainter>
+
+void LineSeparator::initStyleOption(QStyleOption *option) const
+{
+ option->initFrom(this);
+ // in a horizontal layout, the line is vertical (and vice versa)
+ if (m_orientation == Qt::Vertical)
+ option->state |= QStyle::State_Horizontal;
+}
+
+LineSeparator::LineSeparator(QWidget *parent, Qt::Orientation orientation)
+ : QWidget(parent), m_orientation(orientation)
+{
+ setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+}
+
+QSize LineSeparator::sizeHint() const
+{
+ QStyleOption opt;
+ initStyleOption(&opt);
+ const int extent =
+ style()->pixelMetric(QStyle::PM_ToolBarSeparatorExtent, &opt, parentWidget());
+ return QSize(extent, extent);
+}
+
+void LineSeparator::paintEvent(QPaintEvent *)
+{
+ QPainter p(this);
+ QStyleOption opt;
+ initStyleOption(&opt);
+ style()->drawPrimitive(QStyle::PE_IndicatorToolBarSeparator, &opt, &p, parentWidget());
+}
diff --git a/application/widgets/LineSeparator.h b/application/widgets/LineSeparator.h
new file mode 100644
index 00000000..9546e747
--- /dev/null
+++ b/application/widgets/LineSeparator.h
@@ -0,0 +1,18 @@
+#pragma once
+#include <QWidget>
+
+class QStyleOption;
+
+class LineSeparator : public QWidget
+{
+ Q_OBJECT
+
+public:
+ /// Create a line separator. orientation is the orientation of the line.
+ explicit LineSeparator(QWidget *parent, Qt::Orientation orientation = Qt::Horizontal);
+ QSize sizeHint() const;
+ void paintEvent(QPaintEvent *);
+ void initStyleOption(QStyleOption *option) const;
+private:
+ Qt::Orientation m_orientation = Qt::Horizontal;
+};
diff --git a/application/widgets/MCModInfoFrame.cpp b/application/widgets/MCModInfoFrame.cpp
new file mode 100644
index 00000000..2f859ed3
--- /dev/null
+++ b/application/widgets/MCModInfoFrame.cpp
@@ -0,0 +1,111 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <QMessageBox>
+#include <QtGui>
+
+#include "MCModInfoFrame.h"
+#include "ui_MCModInfoFrame.h"
+#include "dialogs/CustomMessageBox.h"
+
+void MCModInfoFrame::updateWithMod(Mod &m)
+{
+ if(m.type() == m.MOD_FOLDER)
+ {
+ clear();
+ return;
+ }
+
+ QString text = "";
+ QString name = "";
+ if(m.name().isEmpty()) name = m.mmc_id();
+ else name = m.name();
+
+ if(m.homeurl().isEmpty()) text = name;
+ else text = "<a href=\"" + m.homeurl() + "\">" + name + "</a>";
+ if(!m.authors().isEmpty()) text += " by " + m.authors();
+
+ setModText(text);
+
+ if(m.description().isEmpty())
+ {
+ setModDescription(tr("No description provided in mcmod.info"));
+ }
+ else
+ {
+ setModDescription(m.description());
+ }
+}
+
+void MCModInfoFrame::clear()
+{
+ setModText(tr("Select a mod to view title and authors..."));
+ setModDescription(tr("Select a mod to view description..."));
+}
+
+MCModInfoFrame::MCModInfoFrame(QWidget *parent) :
+ QFrame(parent),
+ ui(new Ui::MCModInfoFrame)
+{
+ ui->setupUi(this);
+}
+
+MCModInfoFrame::~MCModInfoFrame()
+{
+ delete ui;
+}
+
+void MCModInfoFrame::setModText(QString text)
+{
+ ui->label_ModText->setText(text);
+}
+
+void MCModInfoFrame::setModDescription(QString text)
+{
+ ui->label_ModDescription->setToolTip("");
+ QString intermediatetext = text.trimmed();
+ bool prev(false);
+ QChar rem('\n');
+ QString finaltext;
+ finaltext.reserve(intermediatetext.size());
+ foreach(const QChar& c, intermediatetext)
+ {
+ if(c == rem && prev){
+ continue;
+ }
+ prev = c == rem;
+ finaltext += c;
+ }
+ QString labeltext;
+ labeltext.reserve(300);
+ if(finaltext.length() > 290)
+ {
+ ui->label_ModDescription->setOpenExternalLinks(false);
+ ui->label_ModDescription->setTextFormat(Qt::TextFormat::RichText);
+ desc = text;
+ labeltext.append("<html><body>" + finaltext.left(287) + "<a href=\"#mod_desc\">...</a></body></html>");
+ QObject::connect(ui->label_ModDescription, &QLabel::linkActivated, this, &MCModInfoFrame::modDescEllipsisHandler);
+ }
+ else
+ {
+ ui->label_ModDescription->setTextFormat(Qt::TextFormat::PlainText);
+ labeltext.append(finaltext);
+ }
+ ui->label_ModDescription->setText(labeltext);
+}
+void MCModInfoFrame::modDescEllipsisHandler(const QString &link)
+{
+ CustomMessageBox::selectable(this, tr(""), desc)->show();
+}
diff --git a/application/widgets/MCModInfoFrame.h b/application/widgets/MCModInfoFrame.h
new file mode 100644
index 00000000..3f75279c
--- /dev/null
+++ b/application/widgets/MCModInfoFrame.h
@@ -0,0 +1,46 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QFrame>
+#include "minecraft/Mod.h"
+
+namespace Ui
+{
+class MCModInfoFrame;
+}
+
+class MCModInfoFrame : public QFrame
+{
+ Q_OBJECT
+
+public:
+ explicit MCModInfoFrame(QWidget *parent = 0);
+ ~MCModInfoFrame();
+
+ void setModText(QString text);
+ void setModDescription(QString text);
+
+ void updateWithMod(Mod &m);
+ void clear();
+
+public slots:
+ void modDescEllipsisHandler(const QString& link );
+
+private:
+ Ui::MCModInfoFrame *ui;
+ QString desc;
+};
diff --git a/application/widgets/MCModInfoFrame.ui b/application/widgets/MCModInfoFrame.ui
new file mode 100644
index 00000000..60e0a65c
--- /dev/null
+++ b/application/widgets/MCModInfoFrame.ui
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MCModInfoFrame</class>
+ <widget class="QFrame" name="MCModInfoFrame">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>527</width>
+ <height>113</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>120</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>Frame</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QLabel" name="label_ModText">
+ <property name="text">
+ <string>Select a mod to view title and authors...</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_ModDescription">
+ <property name="text">
+ <string>Select a mod to view description...</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/application/widgets/ModListView.cpp b/application/widgets/ModListView.cpp
new file mode 100644
index 00000000..aa16ad05
--- /dev/null
+++ b/application/widgets/ModListView.cpp
@@ -0,0 +1,62 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ModListView.h"
+#include <QHeaderView>
+#include <QMouseEvent>
+#include <QPainter>
+#include <QDrag>
+#include <QRect>
+
+ModListView::ModListView ( QWidget* parent )
+ :QTreeView ( parent )
+{
+ setAllColumnsShowFocus ( true );
+ setExpandsOnDoubleClick ( false );
+ setRootIsDecorated ( false );
+ setSortingEnabled ( false );
+ setAlternatingRowColors ( true );
+ setSelectionMode ( QAbstractItemView::ContiguousSelection );
+ setHeaderHidden ( false );
+ setSelectionBehavior(QAbstractItemView::SelectRows);
+ setVerticalScrollBarPolicy ( Qt::ScrollBarAlwaysOn );
+ setHorizontalScrollBarPolicy ( Qt::ScrollBarAsNeeded );
+ setDropIndicatorShown(true);
+ setDragEnabled(true);
+ setDragDropMode(QAbstractItemView::DropOnly);
+ viewport()->setAcceptDrops(true);
+}
+
+void ModListView::setModel ( QAbstractItemModel* model )
+{
+ QTreeView::setModel ( model );
+ auto head = header();
+ head->setStretchLastSection(false);
+ // HACK: this is true for the checkbox column of mod lists
+ auto string = model->headerData(0,head->orientation()).toString();
+ if(!string.size())
+ {
+ head->setSectionResizeMode(0, QHeaderView::ResizeToContents);
+ head->setSectionResizeMode(1, QHeaderView::Stretch);
+ for(int i = 2; i < head->count(); i++)
+ head->setSectionResizeMode(i, QHeaderView::ResizeToContents);
+ }
+ else
+ {
+ head->setSectionResizeMode(0, QHeaderView::Stretch);
+ for(int i = 1; i < head->count(); i++)
+ head->setSectionResizeMode(i, QHeaderView::ResizeToContents);
+ }
+}
diff --git a/application/widgets/ModListView.h b/application/widgets/ModListView.h
new file mode 100644
index 00000000..43de9811
--- /dev/null
+++ b/application/widgets/ModListView.h
@@ -0,0 +1,27 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+#include <QTreeView>
+
+class Mod;
+
+class ModListView: public QTreeView
+{
+ Q_OBJECT
+public:
+ explicit ModListView ( QWidget* parent = 0 );
+ virtual void setModel ( QAbstractItemModel* model );
+};
diff --git a/application/widgets/PageContainer.cpp b/application/widgets/PageContainer.cpp
new file mode 100644
index 00000000..679039a7
--- /dev/null
+++ b/application/widgets/PageContainer.cpp
@@ -0,0 +1,210 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "PageContainer.h"
+
+#include <QStackedLayout>
+#include <QPushButton>
+#include <QSortFilterProxyModel>
+#include <QUrl>
+#include <QStyledItemDelegate>
+#include <QListView>
+#include <QLineEdit>
+#include <QLabel>
+#include <QDialogButtonBox>
+#include <QGridLayout>
+#include <QDesktopServices>
+
+#include "MultiMC.h"
+#include "settings/SettingsObject.h"
+#include "widgets/IconLabel.h"
+#include "Platform.h"
+#include "PageContainer_p.h"
+#include <MultiMC.h>
+
+class PageEntryFilterModel : public QSortFilterProxyModel
+{
+public:
+ explicit PageEntryFilterModel(QObject *parent = 0) : QSortFilterProxyModel(parent)
+ {
+ }
+
+protected:
+ bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
+ {
+ const QString pattern = filterRegExp().pattern();
+ const auto model = static_cast<PageModel *>(sourceModel());
+ const auto page = model->pages().at(sourceRow);
+ if (!page->shouldDisplay())
+ return false;
+ // Regular contents check, then check page-filter.
+ return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent);
+ }
+};
+
+PageContainer::PageContainer(BasePageProviderPtr pageProvider, QString defaultId,
+ QWidget *parent)
+ : QWidget(parent)
+{
+ createUI();
+ m_model = new PageModel(this);
+ m_proxyModel = new PageEntryFilterModel(this);
+ int firstIndex = -1;
+ int counter = 0;
+ auto pages = pageProvider->getPages();
+ for (auto page : pages)
+ {
+ page->stackIndex = m_pageStack->addWidget(dynamic_cast<QWidget *>(page));
+ page->listIndex = counter;
+ counter++;
+ if (firstIndex == -1)
+ {
+ firstIndex = page->stackIndex;
+ }
+ }
+ m_model->setPages(pages);
+
+ m_proxyModel->setSourceModel(m_model);
+ m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
+
+ m_pageList->setIconSize(QSize(pageIconSize, pageIconSize));
+ m_pageList->setSelectionMode(QAbstractItemView::SingleSelection);
+ m_pageList->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
+ m_pageList->setModel(m_proxyModel);
+ connect(m_pageList->selectionModel(), SIGNAL(currentRowChanged(QModelIndex, QModelIndex)),
+ this, SLOT(currentChanged(QModelIndex)));
+ m_pageStack->setStackingMode(QStackedLayout::StackOne);
+ m_pageList->setFocus();
+ // now find what we want to have selected...
+ auto page = m_model->findPageEntryById(defaultId);
+ QModelIndex index;
+ if (page)
+ {
+ index = m_proxyModel->mapFromSource(m_model->index(page->listIndex));
+ }
+ else
+ {
+ index = m_proxyModel->index(0, 0);
+ }
+ if (index.isValid())
+ m_pageList->setCurrentIndex(index);
+}
+
+void PageContainer::createUI()
+{
+ m_pageStack = new QStackedLayout;
+ m_filter = new QLineEdit;
+ m_pageList = new PageView;
+ m_header = new QLabel();
+ m_iconHeader = new IconLabel(this, QIcon(), QSize(24, 24));
+
+ QFont headerLabelFont = m_header->font();
+ headerLabelFont.setBold(true);
+ const int pointSize = headerLabelFont.pointSize();
+ if (pointSize > 0)
+ headerLabelFont.setPointSize(pointSize + 2);
+ m_header->setFont(headerLabelFont);
+
+ QHBoxLayout *headerHLayout = new QHBoxLayout;
+ const int leftMargin = MMC->style()->pixelMetric(QStyle::PM_LayoutLeftMargin);
+ headerHLayout->addSpacerItem(
+ new QSpacerItem(leftMargin, 0, QSizePolicy::Fixed, QSizePolicy::Ignored));
+ headerHLayout->addWidget(m_header);
+ headerHLayout->addSpacerItem(
+ new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Ignored));
+ headerHLayout->addWidget(m_iconHeader);
+ const int rightMargin = MMC->style()->pixelMetric(QStyle::PM_LayoutRightMargin);
+ headerHLayout->addSpacerItem(
+ new QSpacerItem(rightMargin, 0, QSizePolicy::Fixed, QSizePolicy::Ignored));
+
+ m_pageStack->setMargin(0);
+ m_pageStack->addWidget(new QWidget(this));
+
+ m_layout = new QGridLayout;
+ m_layout->addLayout(headerHLayout, 0, 1, 1, 1);
+ m_layout->addWidget(m_pageList, 0, 0, 2, 1);
+ m_layout->addLayout(m_pageStack, 1, 1, 1, 1);
+ m_layout->setColumnStretch(1, 4);
+ setLayout(m_layout);
+}
+
+void PageContainer::addButtons(QWidget *buttons)
+{
+ m_layout->addWidget(buttons, 2, 0, 1, 2);
+}
+
+void PageContainer::addButtons(QLayout *buttons)
+{
+ m_layout->addLayout(buttons, 2, 0, 1, 2);
+}
+
+void PageContainer::showPage(int row)
+{
+ if (m_currentPage)
+ {
+ m_currentPage->closed();
+ }
+ if (row != -1)
+ {
+ m_currentPage = m_model->pages().at(row);
+ }
+ else
+ {
+ m_currentPage = nullptr;
+ }
+ if (m_currentPage)
+ {
+ m_pageStack->setCurrentIndex(m_currentPage->stackIndex);
+ m_header->setText(m_currentPage->displayName());
+ m_iconHeader->setIcon(m_currentPage->icon());
+ m_currentPage->opened();
+ }
+ else
+ {
+ m_pageStack->setCurrentIndex(0);
+ m_header->setText(QString());
+ m_iconHeader->setIcon(MMC->getThemedIcon("bug"));
+ }
+}
+
+void PageContainer::help()
+{
+ if (m_currentPage)
+ {
+ QString pageId = m_currentPage->helpPage();
+ if (pageId.isEmpty())
+ return;
+ QDesktopServices::openUrl(QUrl("https://github.com/MultiMC/MultiMC5/wiki/" + pageId));
+ }
+}
+
+void PageContainer::currentChanged(const QModelIndex &current)
+{
+ showPage(current.isValid() ? m_proxyModel->mapToSource(current).row() : -1);
+}
+
+bool PageContainer::requestClose(QCloseEvent *event)
+{
+ for (auto page : m_model->pages())
+ {
+ if (!page->apply())
+ return false;
+ }
+ if (m_currentPage)
+ {
+ m_currentPage->closed();
+ }
+ return true;
+}
diff --git a/application/widgets/PageContainer.h b/application/widgets/PageContainer.h
new file mode 100644
index 00000000..3027af36
--- /dev/null
+++ b/application/widgets/PageContainer.h
@@ -0,0 +1,63 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QWidget>
+#include <QModelIndex>
+
+#include "pages/BasePageProvider.h"
+
+class QLayout;
+class IconLabel;
+class QSortFilterProxyModel;
+class PageModel;
+class QLabel;
+class QListView;
+class QLineEdit;
+class QStackedLayout;
+class QGridLayout;
+
+class PageContainer : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit PageContainer(BasePageProviderPtr pageProvider, QString defaultId = QString(),
+ QWidget *parent = 0);
+ virtual ~PageContainer() {}
+
+ void addButtons(QWidget * buttons);
+ void addButtons(QLayout * buttons);
+ bool requestClose(QCloseEvent *event);
+
+private:
+ void createUI();
+private
+slots:
+ void currentChanged(const QModelIndex &current);
+ void showPage(int row);
+ void help();
+
+private:
+ BasePage * m_currentPage = 0;
+ QSortFilterProxyModel *m_proxyModel;
+ PageModel *m_model;
+ QStackedLayout *m_pageStack;
+ QLineEdit *m_filter;
+ QListView *m_pageList;
+ QLabel *m_header;
+ IconLabel *m_iconHeader;
+ QGridLayout *m_layout;
+};
diff --git a/application/widgets/PageContainer_p.h b/application/widgets/PageContainer_p.h
new file mode 100644
index 00000000..4c720e4c
--- /dev/null
+++ b/application/widgets/PageContainer_p.h
@@ -0,0 +1,123 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QListView>
+#include <QStyledItemDelegate>
+#include <QEvent>
+#include <QScrollBar>
+
+class BasePage;
+const int pageIconSize = 24;
+
+class PageViewDelegate : public QStyledItemDelegate
+{
+public:
+ PageViewDelegate(QObject *parent) : QStyledItemDelegate(parent)
+ {
+ }
+ QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
+ {
+ QSize size = QStyledItemDelegate::sizeHint(option, index);
+ size.setHeight(qMax(size.height(), 32));
+ return size;
+ }
+};
+
+class PageModel : public QAbstractListModel
+{
+public:
+ PageModel(QObject *parent = 0) : QAbstractListModel(parent)
+ {
+ QPixmap empty(pageIconSize, pageIconSize);
+ empty.fill(Qt::transparent);
+ m_emptyIcon = QIcon(empty);
+ }
+ virtual ~PageModel() {}
+
+ int rowCount(const QModelIndex &parent = QModelIndex()) const
+ {
+ return parent.isValid() ? 0 : m_pages.size();
+ }
+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
+ {
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ return m_pages.at(index.row())->displayName();
+ case Qt::DecorationRole:
+ {
+ QIcon icon = m_pages.at(index.row())->icon();
+ if (icon.isNull())
+ icon = m_emptyIcon;
+ // HACK: fixes icon stretching on windows. TODO: report Qt bug for this
+ return QIcon(icon.pixmap(QSize(48,48)));
+ }
+ }
+ return QVariant();
+ }
+
+ void setPages(const QList<BasePage *> &pages)
+ {
+ beginResetModel();
+ m_pages = pages;
+ endResetModel();
+ }
+ const QList<BasePage *> &pages() const
+ {
+ return m_pages;
+ }
+
+ BasePage * findPageEntryById(QString id)
+ {
+ for(auto page: m_pages)
+ {
+ if (page->id() == id)
+ return page;
+ }
+ return nullptr;
+ }
+
+ QList<BasePage *> m_pages;
+ QIcon m_emptyIcon;
+};
+
+class PageView : public QListView
+{
+public:
+ PageView(QWidget *parent = 0) : QListView(parent)
+ {
+ setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding);
+ setItemDelegate(new PageViewDelegate(this));
+ setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ }
+
+ virtual QSize sizeHint() const
+ {
+ int width = sizeHintForColumn(0) + frameWidth() * 2 + 5;
+ if (verticalScrollBar()->isVisible())
+ width += verticalScrollBar()->width();
+ return QSize(width, 100);
+ }
+
+ virtual bool eventFilter(QObject *obj, QEvent *event)
+ {
+ if (obj == verticalScrollBar() &&
+ (event->type() == QEvent::Show || event->type() == QEvent::Hide))
+ updateGeometry();
+ return QListView::eventFilter(obj, event);
+ }
+};
diff --git a/application/widgets/ServerStatus.cpp b/application/widgets/ServerStatus.cpp
new file mode 100644
index 00000000..0c11b9bf
--- /dev/null
+++ b/application/widgets/ServerStatus.cpp
@@ -0,0 +1,129 @@
+#include "ServerStatus.h"
+#include "LineSeparator.h"
+#include "IconLabel.h"
+#include "status/StatusChecker.h"
+
+#include "MultiMC.h"
+
+#include <QHBoxLayout>
+#include <QFrame>
+#include <QLabel>
+#include <QMap>
+#include <QToolButton>
+#include <QAction>
+
+ServerStatus::ServerStatus(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f)
+{
+ layout = new QHBoxLayout(this);
+ layout->setContentsMargins(0, 0, 0, 0);
+ goodIcon = MMC->getThemedIcon("status-good");
+ yellowIcon = MMC->getThemedIcon("status-yellow");
+ badIcon = MMC->getThemedIcon("status-bad");
+
+ addStatus("minecraft.net", tr("Web"));
+ addLine();
+ addStatus("account.mojang.com", tr("Account"));
+ addLine();
+ addStatus("skins.minecraft.net", tr("Skins"));
+ addLine();
+ addStatus("authserver.mojang.com", tr("Auth"));
+ addLine();
+ addStatus("sessionserver.mojang.com", tr("Session"));
+
+ m_statusRefresh = new QToolButton(this);
+ m_statusRefresh->setCheckable(true);
+ m_statusRefresh->setToolButtonStyle(Qt::ToolButtonIconOnly);
+ m_statusRefresh->setIcon(MMC->getThemedIcon("refresh"));
+ layout->addWidget(m_statusRefresh);
+
+ setLayout(layout);
+
+ // Start status checker
+ m_statusChecker.reset(new StatusChecker());
+ {
+ auto reloader = m_statusChecker.get();
+ connect(reloader, &StatusChecker::statusChanged, this, &ServerStatus::StatusChanged);
+ connect(reloader, &StatusChecker::statusLoading, this, &ServerStatus::StatusReloading);
+ connect(m_statusRefresh, &QAbstractButton::clicked, this, &ServerStatus::reloadStatus);
+ m_statusChecker->startTimer(60000);
+ reloadStatus();
+ }
+}
+
+ServerStatus::~ServerStatus()
+{
+}
+
+void ServerStatus::reloadStatus()
+{
+ m_statusChecker->reloadStatus();
+}
+
+void ServerStatus::addLine()
+{
+ layout->addWidget(new LineSeparator(this, Qt::Vertical));
+}
+
+void ServerStatus::addStatus(QString key, QString name)
+{
+ {
+ auto label = new IconLabel(this, badIcon, QSize(16, 16));
+ label->setToolTip(key);
+ serverLabels[key] = label;
+ layout->addWidget(label);
+ }
+ {
+ auto label = new QLabel(this);
+ label->setText(name);
+ label->setToolTip(key);
+ layout->addWidget(label);
+ }
+}
+
+void ServerStatus::setStatus(QString key, int value)
+{
+ if (!serverLabels.contains(key))
+ return;
+ IconLabel *label = serverLabels[key];
+ switch(value)
+ {
+ case 0:
+ label->setIcon(goodIcon);
+ break;
+ case 1:
+ label->setIcon(yellowIcon);
+ break;
+ default:
+ case 2:
+ label->setIcon(badIcon);
+ break;
+ }
+}
+
+void ServerStatus::StatusChanged(const QMap<QString, QString> statusEntries)
+{
+ auto convertStatus = [&](QString status)->int
+ {
+ if (status == "green")
+ return 0;
+ else if (status == "yellow")
+ return 1;
+ else if (status == "red")
+ return 2;
+ return 2;
+ }
+ ;
+ auto iter = statusEntries.begin();
+ while (iter != statusEntries.end())
+ {
+ QString key = iter.key();
+ auto value = convertStatus(iter.value());
+ setStatus(key, value);
+ iter++;
+ }
+}
+
+void ServerStatus::StatusReloading(bool is_reloading)
+{
+ m_statusRefresh->setChecked(is_reloading);
+}
diff --git a/application/widgets/ServerStatus.h b/application/widgets/ServerStatus.h
new file mode 100644
index 00000000..fdd43677
--- /dev/null
+++ b/application/widgets/ServerStatus.h
@@ -0,0 +1,37 @@
+#pragma once
+#include <QString>
+#include <QWidget>
+#include <QMap>
+#include <QIcon>
+#include <memory>
+
+class IconLabel;
+class QToolButton;
+class QHBoxLayout;
+class StatusChecker;
+
+class ServerStatus: public QWidget
+{
+ Q_OBJECT
+public:
+ explicit ServerStatus(QWidget *parent = nullptr, Qt::WindowFlags f = 0);
+ virtual ~ServerStatus();
+ ;
+public slots:
+ void reloadStatus();
+ void StatusChanged(const QMap<QString, QString> statuses);
+ void StatusReloading(bool is_reloading);
+
+private: /* methods */
+ void addLine();
+ void addStatus(QString key, QString name);
+ void setStatus(QString key, int value);
+private: /* data */
+ QHBoxLayout * layout = nullptr;
+ QToolButton *m_statusRefresh = nullptr;
+ QMap<QString, IconLabel *> serverLabels;
+ QIcon goodIcon;
+ QIcon yellowIcon;
+ QIcon badIcon;
+ std::shared_ptr<StatusChecker> m_statusChecker;
+};
diff --git a/application/widgets/VersionListView.cpp b/application/widgets/VersionListView.cpp
new file mode 100644
index 00000000..fc0bcd0a
--- /dev/null
+++ b/application/widgets/VersionListView.cpp
@@ -0,0 +1,147 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <QHeaderView>
+#include <QApplication>
+#include <QMouseEvent>
+#include <QDrag>
+#include <QPainter>
+#include "VersionListView.h"
+#include "Common.h"
+
+VersionListView::VersionListView(QWidget *parent)
+ :QTreeView ( parent )
+{
+ m_emptyString = tr("No versions are currently available.");
+}
+
+void VersionListView::rowsInserted(const QModelIndex &parent, int start, int end)
+{
+ if(!m_itemCount)
+ viewport()->update();
+ m_itemCount += end-start+1;
+ QTreeView::rowsInserted(parent, start, end);
+}
+
+
+void VersionListView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
+{
+ m_itemCount -= end-start+1;
+ if(!m_itemCount)
+ viewport()->update();
+ QTreeView::rowsInserted(parent, start, end);
+}
+
+void VersionListView::setModel(QAbstractItemModel *model)
+{
+ m_itemCount = model->rowCount();
+ if(!m_itemCount)
+ viewport()->update();
+ QTreeView::setModel(model);
+}
+
+void VersionListView::reset()
+{
+ if(model())
+ {
+ m_itemCount = model()->rowCount();
+ }
+ viewport()->update();
+ QTreeView::reset();
+}
+
+void VersionListView::setEmptyString(QString emptyString)
+{
+ m_emptyString = emptyString;
+ if(!m_itemCount)
+ {
+ viewport()->update();
+ }
+}
+
+void VersionListView::paintEvent(QPaintEvent *event)
+{
+ if(m_itemCount)
+ {
+ QTreeView::paintEvent(event);
+ }
+ else
+ {
+ paintInfoLabel(event);
+ }
+}
+
+void VersionListView::paintInfoLabel(QPaintEvent *event)
+{
+ //calculate the rect for the overlay
+ QPainter painter(viewport());
+ painter.setRenderHint(QPainter::Antialiasing, true);
+ QFont font("sans", 20);
+ font.setBold(true);
+
+ QRect bounds = viewport()->geometry();
+ bounds.moveTop(0);
+ QTextLayout layout(m_emptyString, font);
+ qreal height = 0.0;
+ qreal widthUsed = 0.0;
+ QStringList lines = viewItemTextLayout(layout, bounds.width() - 20, height, widthUsed);
+ QRect rect (0,0, widthUsed, height);
+ rect.setWidth(rect.width()+20);
+ rect.setHeight(rect.height()+20);
+ rect.moveCenter(bounds.center());
+ //check if we are allowed to draw in our area
+ if (!event->rect().intersects(rect)) {
+ return;
+ }
+ //draw the letter of the topmost item semitransparent in the middle
+ QColor background = QApplication::palette().color(QPalette::Foreground);
+ QColor foreground = QApplication::palette().color(QPalette::Base);
+ /*
+ background.setAlpha(128 - scrollFade);
+ foreground.setAlpha(128 - scrollFade);
+ */
+ painter.setBrush(QBrush(background));
+ painter.setPen(foreground);
+ painter.drawRoundedRect(rect, 5.0, 5.0);
+ foreground.setAlpha(190);
+ painter.setPen(foreground);
+ painter.setFont(font);
+ painter.drawText(rect, Qt::AlignCenter, lines.join("\n"));
+
+}
+
+/*
+void ModListView::setModel ( QAbstractItemModel* model )
+{
+ QTreeView::setModel ( model );
+ auto head = header();
+ head->setStretchLastSection(false);
+ // HACK: this is true for the checkbox column of mod lists
+ auto string = model->headerData(0,head->orientation()).toString();
+ if(!string.size())
+ {
+ head->setSectionResizeMode(0, QHeaderView::ResizeToContents);
+ head->setSectionResizeMode(1, QHeaderView::Stretch);
+ for(int i = 2; i < head->count(); i++)
+ head->setSectionResizeMode(i, QHeaderView::ResizeToContents);
+ }
+ else
+ {
+ head->setSectionResizeMode(0, QHeaderView::Stretch);
+ for(int i = 1; i < head->count(); i++)
+ head->setSectionResizeMode(i, QHeaderView::ResizeToContents);
+ }
+}
+*/
diff --git a/application/widgets/VersionListView.h b/application/widgets/VersionListView.h
new file mode 100644
index 00000000..f33a6fdb
--- /dev/null
+++ b/application/widgets/VersionListView.h
@@ -0,0 +1,43 @@
+/* Copyright 2013-2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+#include <QTreeView>
+
+class Mod;
+
+class VersionListView : public QTreeView
+{
+ Q_OBJECT
+public:
+ explicit VersionListView(QWidget *parent = 0);
+ virtual void paintEvent(QPaintEvent *event) override;
+ void setEmptyString(QString emptyString);
+ virtual void setModel ( QAbstractItemModel* model );
+
+public slots:
+ virtual void reset() override;
+
+protected slots:
+ virtual void rowsAboutToBeRemoved(const QModelIndex & parent, int start, int end) override;
+ virtual void rowsInserted(const QModelIndex &parent, int start, int end) override;
+
+private: /* methods */
+ void paintInfoLabel(QPaintEvent *event);
+
+private: /* variables */
+ int m_itemCount = 0;
+ QString m_emptyString;
+};