diff --git a/resources/skins/base/blau.xml b/resources/skins/base/blau.xml
new file mode 100644
index 000000000..c2c9d6083
--- /dev/null
+++ b/resources/skins/base/blau.xml
@@ -0,0 +1,12 @@
+
+
+ blau
+
+ Martin Rotter
+ rotter.martinos@gmail.com
+
+
+ PGh0bWw+DQogIDxoZWFkPg0KICAgIDxzdHlsZT4NCiAgICAgIGJvZHkgew0KICAgICAgICBtYXJnaW46IDBweDsNCiAgICAgICAgcGFkZGluZzogMHB4Ow0KICAgICAgfQ0KICAgIA0KICAgICAgcHJlIHsNCiAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOw0KICAgICAgfQ0KDQogICAgICAuaGVhZGVydGV4dCB7DQogICAgICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsNCiAgICAgIH0NCg0KICAgICAgLmhlYWRlciB7DQogICAgICAgIGZvbnQtc2l6ZTogMTdweDsNCiAgICAgICAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgY29sb3Itc3RvcCgwJSxyZ2JhKDk5LDEzNSwyMjksMSkpLCBjb2xvci1zdG9wKDEwMCUscmdiYSg2NCwxMDksMjM2LDEpKSk7DQogICAgICAgIHBhZGRpbmc6IDZweDsNCiAgICAgICAgbWFyZ2luOiAwcHggYXV0bzsNCiAgICAgICAgY29sb3I6IHdoaXRlOw0KICAgICAgICBib3JkZXI6IDAuNXB4IHNvbGlkIGJsYWNrOw0KICAgICAgfQ0KDQogICAgICAuaGVhZGVyIGEgew0KICAgICAgICBjb2xvcjogd2hpdGU7DQogICAgICB9DQoNCiAgICAgIC5jb250ZW50IHsNCiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGdyYXk7DQogICAgICAgIGZvbnQtc2l6ZTogMTZweDsNCgkJY29sb3I6ICNlZWVlZWU7DQogICAgICAgIG1hcmdpbjogMHB4IGF1dG87DQogICAgICAgIHBhZGRpbmc6IDZweDsNCiAgICAgICAgcGFkZGluZy10b3A6IDEycHg7DQogICAgICB9DQogICAgICANCiAgICAgIC5jb250YWluZXIgew0KCQlmb250LWZhbWlseTogIlRyZWJ1Y2hldCBNUyIsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgZ3JheTsNCiAgICAgICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHg7DQogICAgICAgIG1hcmdpbjogMTBweDsNCiAgICAgICAgLXdlYmtpdC1ib3gtc2hhZG93OiAycHggMnB4IDE2cHggMHB4IHJnYmEoNTAsIDUwLCA1MCwgMC42Mik7DQogICAgICB9DQogICAgPC9zdHlsZT4NCiAgICA8dGl0bGU+DQogICAgICAlMQ0KICAgIDwvdGl0bGU+DQogIDwvaGVhZD4NCiAgPGJvZHk+DQogICAgJTINCiAgPC9ib2R5Pg0KPC9odG1sPg==
+ ICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+DQogICAgICA8ZGl2IGNsYXNzPSJoZWFkZXIiPg0KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXJ0ZXh0Ij4NCiAgICAgICAgICAlMQ0KICAgICAgICA8L2Rpdj4NCiAgICAgICAgJTIgKCU1KQ0KICAgICAgICA8YnI+DQogICAgICAgIDxhIGhyZWY9IiUzIj4NCiAgICAgICAgICAlMw0KICAgICAgICA8L2E+DQogICAgICA8L2Rpdj4NCiAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KICAgICAgICAlNCANCiAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg==
+ LyogUVdpZGdldCAqLw0KUVdpZGdldCB7DQogIGNvbG9yOiAjY2NjY2NjOw0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzIzMjMyOw0KfQ0KDQpRV2lkZ2V0OjppdGVtOmhvdmVyIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogUUxpbmVhckdyYWRpZW50KCB4MTogMCwgeTE6IDAsIHgyOiAwLCB5MjogMSwgc3RvcDogMCAjNTY5ZGU1LCBzdG9wOiAxICM0YjhhYzkpOw0KICBjb2xvcjogIzAwMDAwMDsNCn0NCg0KUVdpZGdldDpkaXNhYmxlZCB7DQogIGNvbG9yOiAjNzc3Nzc3Ow0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzIzMjMyOw0KfQ0KDQovKiBRVG9vbEJ1dHRvbiAqLw0KUVRvb2xCdXR0b24gLCBRVG9vbEJ1dHRvbjpkaXNhYmxlZCB7DQogIGJvcmRlcjogbm9uZTsNCiAgcGFkZGluZzogMHB4Ow0KICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsNCn0NCg0KUVRvb2xCdXR0b246aG92ZXIgew0KICBib3JkZXItcmFkaXVzOiAycHg7DQogIGJvcmRlcjogMXB4IHNvbGlkIGdyYXk7DQp9DQoNCi8qIFFTdGF0dXNCYXIgKi8NClFTdGF0dXNCYXIgUVRvb2xCdXR0b24gew0KICBtYXJnaW4tbGVmdDogNXB4Ow0KICBtYXJnaW4tcmlnaHQ6IDVweDsNCn0NCg0KUVN0YXR1c0Jhcjo6aXRlbSB7DQogIGJvcmRlcjogdHJhbnNwYXJlbnQ7DQp9DQoNCi8qIFFUb29sQmFyICovDQpRVG9vbEJhcjo6c2VwYXJhdG9yIHsNCiAgd2lkdGg6IDFweDsNCiAgYmFja2dyb3VuZC1jb2xvcjogIzU5NTk1OTsNCg0KICBtYXJnaW4tbGVmdDogNXB4Ow0KICBtYXJnaW4tcmlnaHQ6IDVweDsNCn0NCg0KUVRvb2xCYXIgew0KICBwYWRkaW5nLWxlZnQ6IDVweDsNCiAgcGFkZGluZy1yaWdodDogNXB4Ow0KfQ0KDQovKiBRVG9vbFRpcCAqLw0KUVRvb2xUaXAgew0KICBib3JkZXI6IDFweCBzb2xpZCBibGFjazsNCiAgYmFja2dyb3VuZC1jb2xvcjogIzU2OWRlNTsNCiAgY29sb3I6IGJsYWNrOw0KICBib3JkZXItcmFkaXVzOiAxcHg7DQogIG9wYWNpdHk6IDIyMDsNCn0NCg0KLyogUU1lbnVCYXIgKi8NClFNZW51QmFyOjppdGVtIHsNCiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQNCn0NCg0KUU1lbnVCYXI6Oml0ZW06c2VsZWN0ZWQgew0KICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsNCiAgYm9yZGVyOiAxcHggc29saWQgIzU2OWRlNTsNCn0NCg0KUU1lbnVCYXI6Oml0ZW06cHJlc3NlZCB7DQogIGJhY2tncm91bmQ6ICM0NDQ7DQogIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7DQogIGJhY2tncm91bmQtY29sb3I6IFFMaW5lYXJHcmFkaWVudCggeDE6MCwgeTE6MCwgeDI6MCwgeTI6MSwgc3RvcDoxICMyMTIxMjEsIHN0b3A6MC40ICMzNDM0MzQgKTsNCiAgbWFyZ2luLWJvdHRvbTogLTFweDsNCiAgcGFkZGluZy1ib3R0b206IDFweDsNCn0NCg0KLyogUU1lbnUgKi8NClFNZW51IHsNCiAgYm9yZGVyOiAxcHggc29saWQgIzAwMDsNCn0NCg0KUU1lbnU6Oml0ZW0gew0KICBwYWRkaW5nOiAycHggMTBweCAycHggMjNweDsNCn0NCg0KUU1lbnU6Omljb24gew0KICBwYWRkaW5nLWxlZnQ6IDRweDsNCn0NCg0KUU1lbnU6Oml0ZW06c2VsZWN0ZWQgew0KICBjb2xvcjogIzAwMDAwMDsNCiAgYmFja2dyb3VuZC1jb2xvcjogUUxpbmVhckdyYWRpZW50KCB4MTogMCwgeTE6IDAsIHgyOiAwLCB5MjogMSwgc3RvcDogMCAjNTY5ZGU1LCBzdG9wOiAxICM0NDdjYjUpOw0KfQ0KDQpRTWVudTo6c2VwYXJhdG9yIHsNCiAgaGVpZ2h0OiAxcHg7DQogIGJhY2tncm91bmQtY29sb3I6ICM1OTU5NTk7DQogIGNvbG9yOiB3aGl0ZTsNCiAgbWFyZ2luLXRvcDogM3B4Ow0KICBtYXJnaW4tYm90dG9tOiAzcHg7DQogIG1hcmdpbi1sZWZ0OiA1cHg7DQogIG1hcmdpbi1yaWdodDogNXB4Ow0KfQ0KDQovKiBRUHVzaEJ1dHRvbiAqLw0KUVB1c2hCdXR0b24gew0KICBjb2xvcjogI2IxYjFiMTsNCiAgYmFja2dyb3VuZC1jb2xvcjogUUxpbmVhckdyYWRpZW50KCB4MTogMCwgeTE6IDAsIHgyOiAwLCB5MjogMSwgc3RvcDogMCAjNTY1NjU2LCBzdG9wOiAwLjEgIzUyNTI1Miwgc3RvcDogMC41ICM0ZTRlNGUsIHN0b3A6IDAuOSAjNGE0YTRhLCBzdG9wOiAxICM0NjQ2NDYpOw0KICBib3JkZXI6IDFweCBzb2xpZCAjMWUxZTFlOw0KICBib3JkZXItcmFkaXVzOiAxcHg7DQogIHBhZGRpbmc6IDNweDsNCiAgZm9udC1zaXplOiAxMnB4Ow0KICBwYWRkaW5nLWxlZnQ6IDZweDsNCiAgcGFkZGluZy1yaWdodDogNnB4Ow0KICBtaW4td2lkdGg6IDMwcHg7DQp9DQoNClFQdXNoQnV0dG9uOnByZXNzZWQgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiBRTGluZWFyR3JhZGllbnQoIHgxOiAwLCB5MTogMCwgeDI6IDAsIHkyOiAxLCBzdG9wOiAwICMyZDJkMmQsIHN0b3A6IDAuMSAjMmIyYjJiLCBzdG9wOiAwLjUgIzI5MjkyOSwgc3RvcDogMC45ICMyODI4MjgsIHN0b3A6IDEgIzI1MjUyNSkNCn0NCg0KLyogUUNvbWJvQm94ICovDQpRQ29tYm9Cb3ggew0KICBzZWxlY3Rpb24tYmFja2dyb3VuZC1jb2xvcjogIzU2OWRlNTsNCiAgYmFja2dyb3VuZC1jb2xvcjogUUxpbmVhckdyYWRpZW50KCB4MTogMCwgeTE6IDAsIHgyOiAwLCB5MjogMSwgc3RvcDogMCAjNTY1NjU2LCBzdG9wOiAwLjEgIzUyNTI1Miwgc3RvcDogMC41ICM0ZTRlNGUsIHN0b3A6IDAuOSAjNGE0YTRhLCBzdG9wOiAxICM0NjQ2NDYpOw0KICBib3JkZXI6IDFweCBzb2xpZCAjMWUxZTFlOw0KICBib3JkZXItcmFkaXVzOiAxcHg7DQogIHBhZGRpbmc6IDJweDsNCiAgcGFkZGluZy10b3A6IDFweDsNCiAgcGFkZGluZy1ib3R0b206IDFweDsNCiAgcGFkZGluZy1sZWZ0OiA0cHg7DQp9DQoNClFDb21ib0JveDpob3ZlciwgUVB1c2hCdXR0b246aG92ZXIgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiBRTGluZWFyR3JhZGllbnQoIHgxOiAwLCB5MTogMCwgeDI6IDAsIHkyOiAxLCBzdG9wOiAwICM1NjlkZTUsIHN0b3A6IDEgIzQ0N2NiNSk7DQogIGNvbG9yOiBibGFjazsNCn0NCg0KUUNvbWJvQm94Om9uIHsNCiAgcGFkZGluZzogMXB4Ow0KICBiYWNrZ3JvdW5kLWNvbG9yOiBRTGluZWFyR3JhZGllbnQoIHgxOiAwLCB5MTogMCwgeDI6IDAsIHkyOiAxLCBzdG9wOiAwICMyZDJkMmQsIHN0b3A6IDAuMSAjMmIyYjJiLCBzdG9wOiAwLjUgIzI5MjkyOSwgc3RvcDogMC45ICMyODI4MjgsIHN0b3A6IDEgIzI1MjUyNSk7DQp9DQoNClFDb21ib0JveCBRQWJzdHJhY3RJdGVtVmlldyB7DQogIGJvcmRlcjogMXB4IHNvbGlkIFFMaW5lYXJHcmFkaWVudCggeDE6IDAsIHkxOiAwLCB4MjogMCwgeTI6IDEsIHN0b3A6IDAgIzU2OWRlNSwgc3RvcDogMSAjNDQ3Y2I1KTsNCiAgc2VsZWN0aW9uLWJhY2tncm91bmQtY29sb3I6IFFMaW5lYXJHcmFkaWVudCggeDE6IDAsIHkxOiAwLCB4MjogMCwgeTI6IDEsIHN0b3A6IDAgIzU2OWRlNSwgc3RvcDogMSAjNDQ3Y2I1KTsNCn0NCg0KUUNvbWJvQm94Ojpkcm9wLWRvd24gew0KICBzdWJjb250cm9sLW9yaWdpbjogcGFkZGluZzsNCiAgc3ViY29udHJvbC1wb3NpdGlvbjogdG9wIHJpZ2h0Ow0KICB3aWR0aDogMTVweDsNCiAgYm9yZGVyLWxlZnQtd2lkdGg6IDBweDsNCiAgYm9yZGVyLWxlZnQtY29sb3I6IGRhcmtncmF5Ow0KICBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7DQogIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxcHg7DQogIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAxcHg7DQp9DQoNClFDb21ib0JveDo6ZG93bi1hcnJvdyB7DQogIGltYWdlOiB1cmwoIyMvaW1hZ2VzL2Rvd25fYXJyb3cucG5nKQ0KfQ0KDQovKiBRU2Nyb2xsQmFyICovDQpRU2Nyb2xsQmFyOmhvcml6b250YWwgew0KICBib3JkZXI6IDFweCBzb2xpZCAjMjIyMjIyOw0KICBiYWNrZ3JvdW5kOiBRTGluZWFyR3JhZGllbnQoIHgxOiAwLCB5MTogMCwgeDI6IDAsIHkyOiAxLCBzdG9wOiAwLjAgIzEyMTIxMiwgc3RvcDogMC4yICMyODI4MjgsIHN0b3A6IDEgIzQ4NDg0OCk7DQogIGhlaWdodDogMTNweDsNCiAgbWFyZ2luOiAwcHggMTZweCAwIDE2cHg7DQp9DQoNClFTY3JvbGxCYXI6OmhhbmRsZTpob3Jpem9udGFsIHsNCiAgYmFja2dyb3VuZDogUUxpbmVhckdyYWRpZW50KCB4MTogMCwgeTE6IDAsIHgyOiAxLCB5MjogMCwgc3RvcDogMCAjNTY5ZGU1LCBzdG9wOiAwLjUgIzQ0N2NiNSwgc3RvcDogMSAjNTY5ZGU1KTsNCiAgbWluLWhlaWdodDogMjBweDsNCiAgYm9yZGVyLXJhZGl1czogMXB4Ow0KfQ0KDQpRU2Nyb2xsQmFyOjphZGQtbGluZTpob3Jpem9udGFsIHsNCiAgYm9yZGVyOiAxcHggc29saWQgIzFiMWIxOTsNCiAgYm9yZGVyLXJhZGl1czogMXB4Ow0KICBiYWNrZ3JvdW5kOiBRTGluZWFyR3JhZGllbnQoIHgxOiAwLCB5MTogMCwgeDI6IDEsIHkyOiAwLCBzdG9wOiAwICM1NjlkZTUsIHN0b3A6IDEgIzQ0N2NiNSk7DQogIHdpZHRoOiAxM3B4Ow0KICBzdWJjb250cm9sLXBvc2l0aW9uOiByaWdodDsNCiAgc3ViY29udHJvbC1vcmlnaW46IG1hcmdpbjsNCn0NCg0KUVNjcm9sbEJhcjo6c3ViLWxpbmU6aG9yaXpvbnRhbCB7DQogIGJvcmRlcjogMXB4IHNvbGlkICMxYjFiMTk7DQogIGJvcmRlci1yYWRpdXM6IDFweDsNCiAgYmFja2dyb3VuZDogUUxpbmVhckdyYWRpZW50KCB4MTogMCwgeTE6IDAsIHgyOiAxLCB5MjogMCwgc3RvcDogMCAjNTY5ZGU1LCBzdG9wOiAxICM0NDdjYjUpOw0KICB3aWR0aDogMTNweDsNCiAgc3ViY29udHJvbC1wb3NpdGlvbjogbGVmdDsNCiAgc3ViY29udHJvbC1vcmlnaW46IG1hcmdpbjsNCn0NCg0KUVNjcm9sbEJhcjo6cmlnaHQtYXJyb3c6aG9yaXpvbnRhbCwgUVNjcm9sbEJhcjo6bGVmdC1hcnJvdzpob3Jpem9udGFsIHsNCiAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7DQogIHdpZHRoOiAxcHg7DQogIGhlaWdodDogMXB4Ow0KICBiYWNrZ3JvdW5kOiB3aGl0ZTsNCn0NCg0KUVNjcm9sbEJhcjo6YWRkLXBhZ2U6aG9yaXpvbnRhbCwgUVNjcm9sbEJhcjo6c3ViLXBhZ2U6aG9yaXpvbnRhbCB7DQogIGJhY2tncm91bmQ6IG5vbmUNCn0NCg0KUVNjcm9sbEJhcjp2ZXJ0aWNhbCB7DQogIGJhY2tncm91bmQ6IFFMaW5lYXJHcmFkaWVudCggeDE6IDAsIHkxOiAwLCB4MjogMSwgeTI6IDAsIHN0b3A6IDAuMCAjMTIxMjEyLCBzdG9wOiAwLjIgIzI4MjgyOCwgc3RvcDogMSAjNDg0ODQ4KTsNCiAgd2lkdGg6IDEzcHg7DQogIG1hcmdpbjogMTZweCAwIDE2cHggMDsNCiAgYm9yZGVyOiAxcHggc29saWQgIzIyMjIyMjsNCn0NCg0KUVNjcm9sbEJhcjo6aGFuZGxlOnZlcnRpY2FsIHsNCiAgYmFja2dyb3VuZDogUUxpbmVhckdyYWRpZW50KCB4MTogMCwgeTE6IDAsIHgyOiAwLCB5MjogMSwgc3RvcDogMCAjNTY5ZGU1LCBzdG9wOiAwLjUgIzQ0N2NiNSwgc3RvcDogMSAjNTY5ZGU1KTsNCiAgbWluLWhlaWdodDogMjBweDsNCiAgYm9yZGVyLXJhZGl1czogMXB4Ow0KfQ0KUVNjcm9sbEJhcjo6YWRkLWxpbmU6dmVydGljYWwgew0KICBib3JkZXI6IDFweCBzb2xpZCAjMWIxYjE5Ow0KICBib3JkZXItcmFkaXVzOiAxcHg7DQogIGJhY2tncm91bmQ6IFFMaW5lYXJHcmFkaWVudCggeDE6IDAsIHkxOiAwLCB4MjogMCwgeTI6IDEsIHN0b3A6IDAgIzU2OWRlNSwgc3RvcDogMSAjNDQ3Y2I1KTsNCiAgaGVpZ2h0OiAxM3B4Ow0KICBzdWJjb250cm9sLXBvc2l0aW9uOiBib3R0b207DQogIHN1YmNvbnRyb2wtb3JpZ2luOiBtYXJnaW47DQp9DQoNClFTY3JvbGxCYXI6OnN1Yi1saW5lOnZlcnRpY2FsIHsNCiAgYm9yZGVyOiAxcHggc29saWQgIzFiMWIxOTsNCiAgYm9yZGVyLXJhZGl1czogMXB4Ow0KICBiYWNrZ3JvdW5kOiBRTGluZWFyR3JhZGllbnQoIHgxOiAwLCB5MTogMCwgeDI6IDAsIHkyOiAxLCBzdG9wOiAwICM1NjlkZTUsIHN0b3A6IDEgIzQ0N2NiNSk7DQogIGhlaWdodDogMTNweDsNCiAgc3ViY29udHJvbC1wb3NpdGlvbjogdG9wOw0KICBzdWJjb250cm9sLW9yaWdpbjogbWFyZ2luOw0KfQ0KDQpRU2Nyb2xsQmFyOjp1cC1hcnJvdzp2ZXJ0aWNhbCwgUVNjcm9sbEJhcjo6ZG93bi1hcnJvdzp2ZXJ0aWNhbCB7DQogIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOw0KICB3aWR0aDogMXB4Ow0KICBoZWlnaHQ6IDFweDsNCiAgYmFja2dyb3VuZDogd2hpdGU7DQp9DQoNClFTY3JvbGxCYXI6OmFkZC1wYWdlOnZlcnRpY2FsLCBRU2Nyb2xsQmFyOjpzdWItcGFnZTp2ZXJ0aWNhbCB7DQogIGJhY2tncm91bmQ6IG5vbmU7DQp9DQoNCi8qIFFTcGxpdHRlciAqLw0KUVNwbGl0dGVyOjpoYW5kbGUgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjNGU0ZTRlOw0KfQ0KDQovKiBRSGVhZGVyVmlldyAqLw0KUUhlYWRlclZpZXcgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsNCiAgY29sb3I6ICNjY2NjY2M7DQp9DQoNClFIZWFkZXJWaWV3OjpzZWN0aW9uIHsNCiAgbWluLWhlaWdodDogMjBweDsNCiAgYm9yZGVyOiAwLjUgcHggc29saWQgIzU5NTk1OTsNCiAgYm9yZGVyLXJpZ2h0OiAwLjUgc29saWQgIzcwNzA3MDsNCiAgYmFja2dyb3VuZC1jb2xvcjogUUxpbmVhckdyYWRpZW50KCB4MTogMCwgeTE6IDAsIHgyOiAwLCB5MjogMSwgc3RvcDogMCAjNTY1NjU2LCBzdG9wOiAwLjEgIzUyNTI1Miwgc3RvcDogMC41ICM0ZTRlNGUsIHN0b3A6IDAuOSAjNGE0YTRhLCBzdG9wOiAxICM0NjQ2NDYpOw0KfQ0KDQpRSGVhZGVyVmlldzo6c2VjdGlvbjpmaXJzdCB7DQogIHBhZGRpbmctbGVmdDogNHB4Ow0KICBwYWRkaW5nLXJpZ2h0OiAycHg7DQp9DQoNClFIZWFkZXJWaWV3OjpzZWN0aW9uOiFmaXJzdCB7DQogIHBhZGRpbmctbGVmdDogMnB4Ow0KICBwYWRkaW5nLXJpZ2h0OiAycHg7DQp9DQoNClFIZWFkZXJWaWV3OjpzZWN0aW9uOmhvdmVyIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogUUxpbmVhckdyYWRpZW50KCB4MTogMCwgeTE6IDAsIHgyOiAwLCB5MjogMSwgc3RvcDogMCAjNTY1NjU2LCBzdG9wOiAwLjEgIzUwNTA1MCwgc3RvcDogMC41ICM0ZTRlNGUsIHN0b3A6IDAuOSAjNDA0MDQwLCBzdG9wOiAxICM0MDQwNDApOw0KfQ0KDQovKiBRVHJlZVZpZXcgKi8NClFUcmVlVmlldzo6YnJhbmNoOmhhcy1zaWJsaW5nczohYWRqb2lucy1pdGVtICB7DQogIGJvcmRlci1pbWFnZTogdXJsKHFzcy9kdW1teS5wbmcpIDA7DQp9DQoNClFUcmVlVmlldzo6YnJhbmNoOmhhcy1zaWJsaW5nczphZGpvaW5zLWl0ZW0gew0KICBib3JkZXItaW1hZ2U6IHVybChxc3MvZHVtbXkucG5nKSAwOw0KfQ0KDQpRVHJlZVZpZXc6OmJyYW5jaDohaGFzLWNoaWxkcmVuOiFoYXMtc2libGluZ3M6YWRqb2lucy1pdGVtICB7DQogIGJvcmRlci1pbWFnZTogdXJsKHFzcy9kdW1teS5wbmcpIDA7DQp9DQoNClFUcmVlVmlldzo6YnJhbmNoOmhhcy1jaGlsZHJlbjohaGFzLXNpYmxpbmdzOmNsb3NlZCwNClFUcmVlVmlldzo6YnJhbmNoOmNsb3NlZDpoYXMtY2hpbGRyZW46aGFzLXNpYmxpbmdzICB7DQogIGJvcmRlci1pbWFnZTogbm9uZTsNCiAgaW1hZ2U6IHVybChxc3MvYnJhbmNoLWNsb3NlZC5wbmcpOw0KfQ0KDQpRVHJlZVZpZXc6OmJyYW5jaDpvcGVuOmhhcy1jaGlsZHJlbjohaGFzLXNpYmxpbmdzLA0KUVRyZWVWaWV3OjpicmFuY2g6b3BlbjpoYXMtY2hpbGRyZW46aGFzLXNpYmxpbmdzICB7DQogIGJvcmRlci1pbWFnZTogbm9uZTsNCiAgaW1hZ2U6IHVybChxc3MvYnJhbmNoLW9wZW4ucG5nKTsNCn0NCg0KUVRyZWVWaWV3OjppdGVtIHsNCiAgcGFkZGluZzogMXB4Ow0KfSANCg0KUVRyZWVWaWV3W2hpZGVUcmVlPSJ0cnVlIl06OmJyYW5jaDohaGFzLWNobGlkcmVuOmhhc1NpYmxpbmdzIHsNCiAgYm9yZGVyLWltYWdlOiBub25lOw0KICBpbWFnZTogbm9uZTsNCn0NCg0KUVRyZWVWaWV3OjppdGVtOnNlbGVjdGVkLCBRVHJlZVZpZXc6OmJyYW5jaDpzZWxlY3RlZCwgUVRyZWVWaWV3OjppdGVtOnNlbGVjdGVkOmFjdGl2ZSwgUVRyZWVWaWV3OjppdGVtOnNlbGVjdGVkOiFhY3RpdmUsIFFUcmVlVmlldzo6aXRlbTpob3ZlciB7DQogIGJhY2tncm91bmQtY29sb3I6IFFMaW5lYXJHcmFkaWVudCggeDE6IDAsIHkxOiAwLCB4MjogMCwgeTI6IDEsIHN0b3A6IDAgIzU2OWRlNSwgc3RvcDogMSAjNGI4YWM5KTsNCiAgY29sb3I6ICMwMDAwMDA7DQp9DQoNCi8qIFFMaXN0VmlldyAqLw0KUUxpc3RWaWV3ICB7DQogIHNob3ctZGVjb3JhdGlvbi1zZWxlY3RlZDogMTsNCn0NCiANClFMaXN0Vmlldzo6aXRlbTpzZWxlY3RlZCwgUUxpc3RWaWV3OjppdGVtOnNlbGVjdGVkOiFhY3RpdmUsIFFMaXN0Vmlldzo6aXRlbTpzZWxlY3RlZDphY3RpdmUsIFFMaXN0Vmlldzo6aXRlbTpob3ZlciB7DQogIGJhY2tncm91bmQtY29sb3I6IFFMaW5lYXJHcmFkaWVudCggeDE6IDAsIHkxOiAwLCB4MjogMCwgeTI6IDEsIHN0b3A6IDAgIzU2OWRlNSwgc3RvcDogMSAjNGI4YWM5KTsNCiAgY29sb3I6ICMwMDAwMDA7DQp9DQoNCi8qIFFUZXh0RWRpdCwgUVBsYWluVGV4dEVkaXQgKi8NClFUZXh0RWRpdDpmb2N1cywgUVBsYWluVGV4dEVkaXQ6Zm9jdXMsIFFMaW5lRWRpdDpmb2N1cyB7DQogIGJvcmRlcjogMXB4IHNvbGlkIFFMaW5lYXJHcmFkaWVudCggeDE6IDAsIHkxOiAwLCB4MjogMCwgeTI6IDEsIHN0b3A6IDAgIzU2OWRlNSwgc3RvcDogMSAjNDQ3Y2I1KQ0KfQ0KDQpRVGV4dEVkaXQsIFFQbGFpblRleHRFZGl0IHsNCiAgYmFja2dyb3VuZC1jb2xvcjogUUxpbmVhckdyYWRpZW50KCB4MTogMCwgeTE6IDAsIHgyOiAwLCB5MjogMSwgc3RvcDogMCAjNGQ0ZDRkLCBzdG9wOiAwICM2NDY0NjQsIHN0b3A6IDEgIzVkNWQ1ZCkNCn0NCg0KLyogUUxpbmVFZGl0ICovDQpRTGluZUVkaXQgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiBRTGluZWFyR3JhZGllbnQoIHgxOiAwLCB5MTogMCwgeDI6IDAsIHkyOiAxLCBzdG9wOiAwICM0ZDRkNGQsIHN0b3A6IDAgIzY0NjQ2NCwgc3RvcDogMSAjNWQ1ZDVkKTsNCiAgcGFkZGluZzogMXB4Ow0KICBib3JkZXItc3R5bGU6IHNvbGlkOw0KICBib3JkZXI6IDFweCBzb2xpZCAjNTk1OTU5Ow0KICBib3JkZXItcmFkaXVzOiAwcHg7DQp9DQoNCi8qIFFQcm9ncmVzc0JhciAqLw0KUVByb2dyZXNzQmFyIHsNCiAgYm9yZGVyOiB0cmFuc3BhcmVudDsNCiAgYm9yZGVyLXJhZGl1czogMXB4Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpRUHJvZ3Jlc3NCYXI6OmNodW5rIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogUUxpbmVhckdyYWRpZW50KCB4MTogMCwgeTE6IDAsIHgyOiAwLCB5MjogMSwgc3RvcDogMCAjNTY5ZGU1LCBzdG9wOiAxICM0YjhhYzkpOw0KICB3aWR0aDogM3B4Ow0KICBtYXJnaW46IDAuNXB4Ow0KfQ0KDQovKiBRQ2hlY2tCb3ggKi8NClFDaGVja0JveDo6aW5kaWNhdG9yIHsNCiAgY29sb3I6ICNiMWIxYjE7DQogIGJhY2tncm91bmQtY29sb3I6ICMzMjMyMzI7DQogIGJvcmRlcjogMXB4IHNvbGlkICNiMWIxYjE7DQogIHdpZHRoOiA5cHg7DQogIGhlaWdodDogOXB4Ow0KfQ0KDQpRQ2hlY2tCb3g6OmluZGljYXRvcjpjaGVja2VkIHsNCiAgaW1hZ2U6IHVybCgjIy9pbWFnZXMvY2hlY2tib3gucG5nKQ0KfQ0KDQpRQ2hlY2tCb3g6OmluZGljYXRvcjpkaXNhYmxlZCB7DQogIGJvcmRlcjogMXB4IHNvbGlkICM0NDQNCn0NCg0KLyogUVJhZGlvQnV0dG9uICovDQpRUmFkaW9CdXR0b246OmluZGljYXRvcjpkaXNhYmxlZCB7DQogIGJvcmRlcjogMXB4IHNvbGlkICM0NDQNCn0NCg0KUVJhZGlvQnV0dG9uOjppbmRpY2F0b3Igew0KICBib3JkZXItcmFkaXVzOiA2cHgNCn0NCg0KUVJhZGlvQnV0dG9uOjppbmRpY2F0b3I6Y2hlY2tlZCwgUVJhZGlvQnV0dG9uOjppbmRpY2F0b3I6dW5jaGVja2VkIHsNCiAgY29sb3I6ICNiMWIxYjE7DQogIGJhY2tncm91bmQtY29sb3I6ICMzMjMyMzI7DQogIGJvcmRlcjogMXB4IHNvbGlkICNiMWIxYjE7DQp9DQoNClFSYWRpb0J1dHRvbjo6aW5kaWNhdG9yOmNoZWNrZWQgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiBxcmFkaWFsZ3JhZGllbnQoIGN4OiAwLjUsIGN5OiAwLjUsIGZ4OiAwLjUsIGZ5OiAwLjUsIHJhZGl1czogMS4wLCBzdG9wOiAwLjI1ICM1NjlkZTUsIHN0b3A6IDAuMyAjMzIzMjMyICkNCn0NCg0KUVJhZGlvQnV0dG9uOjppbmRpY2F0b3I6aG92ZXIsIFFDaGVja0JveDo6aW5kaWNhdG9yOmhvdmVyIHsNCiAgYm9yZGVyOiAxcHggc29saWQgIzU2OWRlNQ0KfQ==
+
\ No newline at end of file
diff --git a/resources/skins/base/images/checkbox.png b/resources/skins/base/images/checkbox.png
new file mode 100644
index 000000000..b4a9aa3b5
Binary files /dev/null and b/resources/skins/base/images/checkbox.png differ
diff --git a/resources/skins/base/images/down_arrow.png b/resources/skins/base/images/down_arrow.png
new file mode 100644
index 000000000..db581cb78
Binary files /dev/null and b/resources/skins/base/images/down_arrow.png differ
diff --git a/resources/text/CHANGELOG b/resources/text/CHANGELOG
index f081808a3..5401918a9 100644
--- a/resources/text/CHANGELOG
+++ b/resources/text/CHANGELOG
@@ -13,6 +13,7 @@ Fixed:
Added:
+- Re-introduced "blau" (dark) skin.
- Import/export dialog now offers "Check/uncheck all items" button.
diff --git a/src/gui/formmain.cpp b/src/gui/formmain.cpp
index 72fdcc556..c6d45e188 100755
--- a/src/gui/formmain.cpp
+++ b/src/gui/formmain.cpp
@@ -215,52 +215,6 @@ void FormMain::display() {
Application::alert(this);
}
-void FormMain::onCommitData(QSessionManager &manager) {
- qDebug("OS asked application to commit its data.");
-
- manager.setRestartHint(QSessionManager::RestartNever);
- manager.release();
-}
-
-void FormMain::onSaveState(QSessionManager &manager) {
- qDebug("OS asked application to save its state.");
-
- manager.setRestartHint(QSessionManager::RestartNever);
- manager.release();
-}
-
-void FormMain::onAboutToQuit() {
- // Make sure that we obtain close lock
- // BEFORE even trying to quit the application.
- bool locked_safely = qApp->closeLock()->tryLock(CLOSE_LOCK_TIMEOUT);
-
- qApp->processEvents();
-
- qDebug("Cleaning up resources and saving application state.");
- m_ui->m_tabWidget->feedMessageViewer()->quit();
-
- if (qApp->settings()->value(APP_CFG_MESSAGES, "clear_read_on_exit", false).toBool()) {
- m_ui->m_tabWidget->feedMessageViewer()->feedsView()->clearAllReadMessages();
- }
-
- qApp->database()->saveDatabase();
- saveSize();
-
- if (locked_safely) {
- // Application obtained permission to close
- // in a safety way.
- qDebug("Close lock was obtained safely.");
-
- // We locked the lock to exit peacefully, unlock it to avoid warnings.
- qApp->closeLock()->unlock();
- }
- else {
- // Request for write lock timed-out. This means
- // that some critical action can be processed right now.
- qDebug("Close lock timed-out.");
- }
-}
-
void FormMain::setupIcons() {
IconFactory *icon_theme_factory = qApp->icons();
@@ -375,10 +329,6 @@ void FormMain::createConnections() {
connect(m_statusBar->fullscreenSwitcher(), SIGNAL(toggled(bool)), m_ui->m_actionFullscreen, SLOT(setChecked(bool)));
connect(m_ui->m_actionFullscreen, SIGNAL(toggled(bool)), m_statusBar->fullscreenSwitcher(), SLOT(setChecked(bool)));
- // Core connections.
- connect(qApp, SIGNAL(commitDataRequest(QSessionManager&)), this, SLOT(onCommitData(QSessionManager&)));
- connect(qApp, SIGNAL(saveStateRequest(QSessionManager&)), this, SLOT(onSaveState(QSessionManager&)));
-
// Menu "File" connections.
connect(m_ui->m_actionExportFeeds, SIGNAL(triggered()), this, SLOT(exportFeeds()));
connect(m_ui->m_actionImportFeeds, SIGNAL(triggered()), this, SLOT(importFeeds()));
@@ -398,9 +348,6 @@ void FormMain::createConnections() {
connect(m_ui->m_actionReportBugGitHub, SIGNAL(triggered()), this, SLOT(reportABugOnGitHub()));
connect(m_ui->m_actionReportBugBitBucket, SIGNAL(triggered()), this, SLOT(reportABugOnBitBucket()));
- // General connections.
- connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(onAboutToQuit()));
-
// Menu "Web browser" connections.
connect(m_ui->m_tabWidget, SIGNAL(currentChanged(int)),
this, SLOT(loadWebBrowserMenu(int)));
diff --git a/src/gui/formmain.h b/src/gui/formmain.h
index b4ee7f9a1..23ddd33c0 100755
--- a/src/gui/formmain.h
+++ b/src/gui/formmain.h
@@ -60,6 +60,10 @@ class FormMain : public QMainWindow {
// for given actions.
QList allActions();
+ // Loads/saves visual state of the application.
+ void loadSize();
+ void saveSize();
+
protected:
// Creates all needed menus and sets them up.
void prepareMenus();
@@ -73,10 +77,6 @@ class FormMain : public QMainWindow {
// Sets up proper icons for this widget.
void setupIcons();
- // Loads/saves visual state of the application.
- void loadSize();
- void saveSize();
-
public slots:
// Processes incoming message from another RSS Guard instance.
void processExecutionMessage(const QString &message);
@@ -97,13 +97,6 @@ class FormMain : public QMainWindow {
void switchMainMenu();
protected slots:
- // Last-minute reactors.
- void onCommitData(QSessionManager &manager);
- void onSaveState(QSessionManager &manager);
-
- // Used for last-minute actions.
- void onAboutToQuit();
-
// Loads web browser menu if user selects to change tabs.
void loadWebBrowserMenu(int index);
diff --git a/src/miscellaneous/application.cpp b/src/miscellaneous/application.cpp
index 4bf4f4fba..acb2c07fb 100755
--- a/src/miscellaneous/application.cpp
+++ b/src/miscellaneous/application.cpp
@@ -23,6 +23,7 @@
#include "gui/messagebox.h"
#include "gui/formmain.h"
+#include
#include
@@ -31,6 +32,9 @@ Application::Application(const QString &id, int &argc, char **argv)
m_closeLock(NULL), m_userActions(QList()), m_mainForm(NULL),
m_trayIcon(NULL), m_settings(NULL), m_system(NULL), m_skins(NULL),
m_localization(NULL), m_icons(NULL), m_database(NULL) {
+ connect(this, SIGNAL(aboutToQuit()), this, SLOT(onAboutToQuit()));
+ connect(this, SIGNAL(commitDataRequest(QSessionManager&)), this, SLOT(onCommitData(QSessionManager&)));
+ connect(this, SIGNAL(saveStateRequest(QSessionManager&)), this, SLOT(onSaveState(QSessionManager&)));
}
Application::~Application() {
@@ -87,8 +91,7 @@ void Application::showGuiMessage(const QString& title, const QString& message,
QSystemTrayIcon::MessageIcon message_type,
QWidget *parent, int duration) {
if (SystemTrayIcon::isSystemTrayActivated()) {
- // TODO: Maybe show OSD instead if tray icon bubble,
- // depending on settings.
+ // TODO: Maybe show OSD instead if tray icon bubble, depending on settings.
trayIcon()->showMessage(title, message, message_type, duration);
}
else {
@@ -96,3 +99,49 @@ void Application::showGuiMessage(const QString& title, const QString& message,
MessageBox::show(parent, (QMessageBox::Icon) message_type, title, message);
}
}
+
+void Application::onCommitData(QSessionManager &manager) {
+ qDebug("OS asked application to commit its data.");
+
+ manager.setRestartHint(QSessionManager::RestartNever);
+ manager.release();
+}
+
+void Application::onSaveState(QSessionManager &manager) {
+ qDebug("OS asked application to save its state.");
+
+ manager.setRestartHint(QSessionManager::RestartNever);
+ manager.release();
+}
+
+void Application::onAboutToQuit() {
+ // Make sure that we obtain close lock
+ // BEFORE even trying to quit the application.
+ bool locked_safely = closeLock()->tryLock(CLOSE_LOCK_TIMEOUT);
+
+ processEvents();
+
+ qDebug("Cleaning up resources and saving application state.");
+ mainForm()->tabWidget()->feedMessageViewer()->quit();
+
+ if (settings()->value(APP_CFG_MESSAGES, "clear_read_on_exit", false).toBool()) {
+ mainForm()->tabWidget()->feedMessageViewer()->feedsView()->clearAllReadMessages();
+ }
+
+ database()->saveDatabase();
+ mainForm()->saveSize();
+
+ if (locked_safely) {
+ // Application obtained permission to close
+ // in a safety way.
+ qDebug("Close lock was obtained safely.");
+
+ // We locked the lock to exit peacefully, unlock it to avoid warnings.
+ closeLock()->unlock();
+ }
+ else {
+ // Request for write lock timed-out. This means
+ // that some critical action can be processed right now.
+ qDebug("Close lock timed-out.");
+ }
+}
diff --git a/src/miscellaneous/application.h b/src/miscellaneous/application.h
index aac70f744..400a9dccc 100755
--- a/src/miscellaneous/application.h
+++ b/src/miscellaneous/application.h
@@ -125,8 +125,7 @@ class Application : public QtSingleApplication {
#else
QString temp_directory = QDesktopServices::storageLocation(QDesktopServices::TempLocation);
#endif
-
- return temp_directory;
+ return temp_directory;
}
// Access to application tray icon. Always use this in cooperation with
@@ -146,6 +145,12 @@ class Application : public QtSingleApplication {
return static_cast(QCoreApplication::instance());
}
+ private slots:
+ // Last-minute reactors.
+ void onCommitData(QSessionManager &manager);
+ void onSaveState(QSessionManager &manager);
+ void onAboutToQuit();
+
private:
// This read-write lock is used by application on its close.
// Application locks this lock for WRITING.