Page 1 of 2
Notifications bar
Posted: Sat Oct 07, 2017 4:51 pm
by Toonz
Hi all,
many are annoyed by the continuous display of messages in the Notification bar in version 4.7 and higher that there is no connection with the SC.
This simple modification will delete each message after being read once.
All future messages will be displayed as normal but also deleted after being read.
Make the following change in the file /qmf/qml/qb/notifications/NotificationsBar.qml:
Replace:
Code: Select all
onAction: {
if (canvas.dimState)
screenStateController.wakeup();
if (actionUrl.toString().length)
notificationBar.hide();
else if (model.uuid)
notifications.remove(model.uuid);
else if (model.type)
notifications.removeByType(model.type);
}
with
Code: Select all
onAction: {
if (canvas.dimState)
screenStateController.wakeup();
if (model.uuid)
notifications.remove(model.uuid);
else if (model.type)
notifications.removeByType(model.type);
}
The messages will show up again after a reboot but can be removed again by clicking on it.
This workaround should be acceptable for now.
I expect quby to make improvements to this functionality in future releases.
Kind regardz,
Toonz
Re: Notifications bar
Posted: Sat Oct 07, 2017 8:13 pm
by michel30
@Toonz
Super, this works thanks for your TIP.
Regards,
Michel
Re: Notifications bar
Posted: Tue Oct 10, 2017 9:31 pm
by FunFair
Ì seem to have screwed up something... only getting a white screen without any information.
Ofcourse I forgot to make a backup of the file.... can someone please make a copy for me?
Re: Notifications bar
Posted: Tue Oct 10, 2017 10:43 pm
by FunFair
Michel was kind enough to supply me with his file. But still I get a white screen. As if I deleted some file by accident or something...
Now I've got a white screen. A hard reset doesn't work, but everything in the background seems to work fine. I can still change things through domoticz.
Also the screen doesn't go into a dimmed state. I hope someone can help me with this. I am going to make a dump of the files.
Re: Notifications bar
Posted: Tue Oct 10, 2017 11:22 pm
by marcelr
Looks like your qt-gui doesn't start properly anymore.
Please try to run the qt-gui from within a secure shell with this command:
killall qt-gui; /HCBv2/sbin/qt-gui -platform linuxfb -plugin Tslib --daemon 2>&1
... and check the (awful lot of) output for error messages. This should give you some hints as to where things go wrong.
Re: Notifications bar
Posted: Wed Oct 11, 2017 6:59 am
by FunFair
Code: Select all
file:///HCBv2/qml/Canvas.qml:359:2: Type NotificationBar unavailable
NotificationBar {
^
file:///qmf/qml/qb/notifications/NotificationBar.qml:6:1: Expected token `}'
� � � � id: notificationBar
^
De hoeveelheid output valt gelukkig mee.
Dit staat er in mijn NotificationBar.qml
Code: Select all
import QtQuick 1.1
import QueuedConnection 1.0
import ScreenStateController 1.0
Item {
id: notificationBar
anchors {
left: parent.left
right: parent.right
top: parent.top
topMargin: -height
}
height: childrenRect.height
visible: false
signal queuedSignal();
signal itemAdded();
QtObject {
id: p
property bool expandOnDim: false
property Timer hideTimer: null
property Timer blackModeTimer: null
}
function show(expanded) {
cancelHideTimer();
if (!expanded)
collapse();
if (state === "hidden") {
notificationColumn.animateAddItem = false;
if (notifications.count === 1)
addNextItem();
else if (expanded)
expand();
state = "shown";
}
}
function hide(timeout) {
if (state === "shown") {
if (timeout) {
cancelHideTimer();
p.hideTimer = util.delayedCall(timeout, hideImpl);
} else {
hideImpl();
}
}
}
function hideImpl() {
notificationColumn.animateAddItem = false;
notificationBar.state = "hidden";
}
function collapse() {
underlay.clicked.disconnect(collapse);
underlay.visible = false;
if (notificationColumn.headerItem !== null) {
notificationColumn.animateRemoveItem = true;
model.clear();
notificationColumn.headerItem.state = "collapsed";
}
}
function expand() {
if (notifications.count < 2)
return;
if (canvas.dimState) {
p.expandOnDim = true;
screenStateController.wakeup();
}
underlay.clicked.connect(collapse);
underlay.visible= true;
cancelHideTimer();
if (notificationColumn.headerItem !== null)
notificationColumn.headerItem.state = "expanded";
notificationColumn.animateAddItem = true;
notificationBar.populate();
}
function populate() {
if (globals.notificationAnimationsEnabled) {
itemAddedQueuedConn.signalEmitted.connect(addNextItem);
addNextItem();
} else {
while(addNextItem());
}
}
function addNextItem() {
if (model.count < notifications.count) {
model.append(notifications.dataModel[model.count]);
return true;
} else {
itemAddedQueuedConn.signalEmitted.disconnect(addNextItem);
return false;
}
}
function cancelHideTimer() {
if (p.hideTimer) {
p.hideTimer.destroy();
p.hideTimer = null;
}
}
function setBlackMode(enable) {
if (enable) {
screenStateController.screenOffBlackMode = true;
scheduleBlackModeTimer(true);
} else {
screenStateController.screenOffBlackMode = false;
cancelBlackModeTimer();
}
}
function scheduleBlackModeTimer(show) {
if (screenStateController.screenState === ScreenStateController.ScreenOff) {
screenStateController.screenOffBlackMode = show;
var timeout = (show ? notifications.conf_SHOW_TIME_SCREENOFF : notifications.conf_HIDE_TIME_SCREENOFF) * 1000;
cancelBlackModeTimer();
p.blackModeTimer = util.delayedCall(timeout, scheduleBlackModeTimer, !show);
} else {
cancelBlackModeTimer();
}
}
function cancelBlackModeTimer() {
if (p.blackModeTimer) {
p.blackModeTimer.destroy();
p.blackModeTimer = null;
}
}
state: "hidden"
states: [
State {
name: "hidden"
PropertyChanges { target: notificationBar; anchors.topMargin: -notificationBar.height }
},
State {
name: "shown"
PropertyChanges { target: notificationBar; anchors.topMargin: 0 }
}
]
transitions: [
Transition {
from: "hidden"; to: "shown"
SequentialAnimation {
PropertyAction { target: notificationBar; property: "visible"; value: true }
NumberAnimation { target: notificationBar; easing.type: Easing.OutQuad; properties: "anchors.topMargin"; duration: 300 }
}
},
Transition {
from: "shown"; to: "hidden"
SequentialAnimation {
NumberAnimation { target: notificationBar; easing.type: Easing.InQuad; properties: "anchors.topMargin"; duration: 300 }
PropertyAction { target: notificationBar; property: "visible"; value: false }
ScriptAction {
script: {
collapse();
}
}
}
}
]
Connections {
target: screenStateController
onScreenStateChanged: {
if ((screenStateController.screenState === ScreenStateController.ScreenColorDimmed ||
screenStateController.screenState === ScreenStateController.ScreenOff) &&
notifications.count) {
setBlackMode(true);
notificationBar.show();
} else if (screenStateController.screenState === ScreenStateController.ScreenActive) {
if (!p.expandOnDim)
notificationBar.hide(notifications.conf_HIDE_TIMEOUT);
p.expandOnDim = false;
setBlackMode(false);
}
}
}
Connections {
target: stage
onOnRootScreenChanged: {
if (!stage.onRootScreen)
notificationBar.hide();
}
}
Connections {
target: notifications
onDataModelChanged: {
if (notifications.count === 0) {
notificationBar.hide();
setBlackMode(false);
return;
}
notificationColumn.animateRemoveItem = false;
model.clear();
if (notificationColumn.headerItem !== null &&
notificationColumn.headerItem.state === "expanded" && notifications.count > 1) {
// TODO: add only the new items?
notificationColumn.animateAddItem = false;
notificationBar.populate();
} else if (notifications.count === 1) {
collapse();
notificationColumn.animateAddItem = false;
notificationBar.addNextItem();
}
}
onNotificationsAddedOrUpdated: {
if (p.hideTimer) {
cancelHideTimer();
p.hideTimer = util.delayedCall(notifications.conf_HIDE_TIMEOUT, hideImpl);
}
setBlackMode(true);
if (notificationBar.state === "hidden" && canvas.firstLoadingDone) {
notificationBar.show();
if (screenStateController.screenState === ScreenStateController.ScreenActive)
notificationBar.hide(notifications.conf_HIDE_TIMEOUT);
}
}
}
QueuedConnection {
id: itemAddedQueuedConn
target: notificationBar
}
Component.onCompleted: {
itemAdded.connect(queuedSignal);
}
ListModel {
id: model
}
Rectangle {
id: notificationBarBg
width: parent.width
color: colors.notificationsBackground
height: notificationColumn.childrenHeight + (notificationColumn.anchors.topMargin * 2)
clip: true
MouseArea {
anchors.fill: parent
}
Behavior on height {
enabled: globals.notificationAnimationsEnabled
SmoothedAnimation { easing.type: Easing.InQuad; duration: 300 }
}
Component {
id: notificationHeader
NotificationElement {
id: headerElement
header: true
iconSource: "drawables/notifications-icon.svg"
title: qsTr("notification-header-text")
.arg(i18n.capitalizeFirstChar(i18n.greetingText))
.arg(colors.notificationsTextHighlight.toString())
.arg(notifications.dataset.length)
activeInDim: true
onAction: {
if (state === "collapsed") {
notificationBar.expand();
} else {
notificationBar.collapse();
}
}
onClose: {
notificationBar.hide();
}
Component.onCompleted: notificationColumn.headerItem = headerElement
state: "collapsed"
states: [
State {
name: "collapsed"
PropertyChanges { target: headerElement; actionButtonIconRotation: 0; actionButtonRotationAnim.direction: RotationAnimation.Counterclockwise; bgColor: "#ffffff" }
},
State {
name: "expanded"
PropertyChanges { target: headerElement; actionButtonIconRotation: 180; actionButtonRotationAnim.direction: RotationAnimation.Clockwise; bgColor: colors.notificationsHeader }
}
]
transitions: [
Transition {
// duration conditional workaround for QtQuick1, on QQ2 it's possible to disable transition
from: "collapsed"; to: "expanded"
ColorAnimation { target: headerElement; property: "bgColor"; duration: globals.notificationAnimationsEnabled ? 200 : 0 }
},
Transition {
from: "expanded"; to: "collapsed"
SequentialAnimation {
PauseAnimation { duration: globals.notificationAnimationsEnabled ? 200 : 0 }
ColorAnimation { target: headerElement; property: "bgColor"; duration: globals.notificationAnimationsEnabled ? 200 : 0 }
}
}
]
}
}
ListView {
id: notificationColumn
anchors {
left: parent.left
right: parent.right
top: parent.top
margins: 16
}
height: canvas.height
spacing: 4
interactive: false
property real childrenHeight: (header !== null && headerItem !== null ? headerItem.height : 0) + (count > 0 ? contentHeight : 0)
header: notifications.count > 1 ? notificationHeader : null
onHeaderChanged: {
if (header === null)
headerItem = null;
}
property Item headerItem: null // already exists on QQ2
property bool animateAddItem: false
property bool animateRemoveItem: false
model: model
delegate: NotificationElement {
id: notificationElement
iconSource: notifications.getIconUrl(model.type, model.subType)
title: model.subType === "_grouped" ? model.text.arg(colors.notificationsTextHighlight.toString()) : model.text
actionUrl: notifications.getActionUrl(model.type, model.subType)
actionArgs: notifications.formatActionArgs(notifications.getActionArgsFormat(model.type, model.subType), model.args)
activeInDim: notifications.count === 1
showClose: notifications.count === 1
onAction: {
if (canvas.dimState)
screenStateController.wakeup();
else if (model.uuid)
notifications.remove(model.uuid);
else if (model.type)
notifications.removeByType(model.type);
}
onClose: {
notificationBar.hide();
}
ListView.onAdd: {
if (notificationColumn.animateAddItem && globals.notificationAnimationsEnabled)
addAnimation.restart()
else
itemAdded();
}
ListView.onRemove: {
if (notificationColumn.animateRemoveItem && globals.notificationAnimationsEnabled)
removeAnimation.restart()
}
SequentialAnimation {
id: addAnimation
PropertyAction { target: notificationElement; property: "height"; value: 0 }
NumberAnimation { target: notificationElement; property: "height"; to: notificationElement.itemHeight; easing.type: Easing.InOutQuad; duration: 200 }
ScriptAction { script: itemAdded() }
}
SequentialAnimation {
id: removeAnimation
PropertyAction { target: notificationElement; property: "ListView.delayRemove"; value: true }
NumberAnimation { target: notificationElement; property: "height"; to: 0; easing.type: Easing.InQuad; duration: 200 }
PropertyAction { target: notificationElement; property: "ListView.delayRemove"; value: false }
}
}
}
}
Image {
id: shadow
width: parent.width
anchors.top: notificationBarBg.bottom
source: "./drawables/bar-shadow.png"
fillMode: Image.TileHorizontally
visible: !canvas.dimState
}
}
Re: Notifications bar
Posted: Wed Oct 11, 2017 9:21 am
by FunFair
It's working again! It turned out the text editor I used (included in WinSCP) turned all tabs into gibberish. When I opened the file with 'vi' I noticed it.
Copy pasted Michel's file in it trough vi and rebooted without a problem.
Thanks Marcelr and michel30 for the support!!!
Re: Notifications bar
Posted: Wed Oct 11, 2017 3:45 pm
by Toonz
Hi all,
I have another idea to suppress the notifications, this one is a bit more intrusive because you will never see any notifications again
In the file NotificationsBar.qml replace all occurrences of ' notificationBar.show()' by 'notificationBar.hide()'
I cannot test this myself as I don't get these notifications anymore.
If someone is willing to try just give your feedback here. Much appreciated.
Thanks in advance.
Toonz
Re: Notifications bar
Posted: Wed Oct 11, 2017 7:40 pm
by marcelr
Slightly different approach:
(excerpt from NotificationBar.qml:)
Code: Select all
function show(expanded) {
cancelHideTimer();
if (!expanded)
collapse();
if (state === "hidden") {
notificationColumn.animateAddItem = false;
if (notifications.count === 1)
addNextItem();
else if (expanded)
//MR expand();
state = "shown";
}
// added MR
collapse();
state = "hidden";
// end add
}
This removes notifications altogether, just need to get rid of the systray icon as well, this is easily handled by setting the number of notifications required for display to an insane amount, in NotificationSystray.qml.
Re: Notifications bar
Posted: Fri Oct 13, 2017 7:59 pm
by FunFair
marcelr wrote:Slightly different approach:
(excerpt from NotificationBar.qml:)
Code: Select all
function show(expanded) {
cancelHideTimer();
if (!expanded)
collapse();
if (state === "hidden") {
notificationColumn.animateAddItem = false;
if (notifications.count === 1)
addNextItem();
else if (expanded)
//MR expand();
state = "shown";
}
// added MR
collapse();
state = "hidden";
// end add
}
This removes notifications altogether, just need to get rid of the systray icon as well, this is easily handled by setting the number of notifications required for display to an insane amount, in NotificationSystray.qml.
works perfectly!
Re: Notifications bar
Posted: Sat Oct 14, 2017 10:49 am
by ams123
Toonz wrote:Hi all,
I have another idea to suppress the notifications, this one is a bit more intrusive because you will never see any notifications again
In the file NotificationsBar.qml replace all occurrences of ' notificationBar.show()' by 'notificationBar.hide()'
I cannot test this myself as I don't get these notifications anymore.
If someone is willing to try just give your feedback here. Much appreciated.
Thanks in advance.
Toonz
yes work for me bar is gone
Re: Notifications bar
Posted: Sat Oct 14, 2017 2:33 pm
by Toonz
Thanks for the feedback. Nobody needs to worry anymore about notifications
Re: Notifications bar
Posted: Sun Oct 15, 2017 2:43 pm
by Wunser
Different approach is to turn off the notifications alltogether:
in /HCBv2/qml/Canvas.qml
Code: Select all
notifications = notificationsComponent.createObject(canvas);
// notifications.init();
Comment out the init part
Re: Notifications bar
Posted: Mon Dec 04, 2017 7:49 pm
by michel30
Hello,
I updated my Toon yesterday to version 4.9.23 but this notification icon stays on the upper right ( image below ).
This is because it can not connect to the service center error d03 no internet.
Does somebody know how hide this icon?
It is only the icon, there is no notification white balk.
Re: Notifications bar
Posted: Mon Dec 04, 2017 8:54 pm
by Toonz
This is not a Notification icon, it is your internetsettings icon.
Two options here:
1. In the topic manuals is described how to get rid of this error caused by the fact that you have no VPN open to Eneco.
2. Another option, more convenient in my humble opinion, is to completely disable this icon. Saves space in your systray for other more useful icons.
To get rid of the icon comment out the following line in /HCBv2/qml/apps/internetSettings/InternetSettingsApp.qml:
registry.registerWidget("systrayIcon", p.internetSystrayUrl, this);
In this case no Wifi icon is shown ever........
Either option will work.....
Kind regardz,
Toonz