mirror of
https://github.com/arcan1s/awesome-widgets.git
synced 2025-06-28 14:51:39 +00:00
start
This commit is contained in:
@ -21,7 +21,7 @@ from PyQt4.QtCore import *
|
||||
from PyQt4.QtGui import *
|
||||
from PyKDE4.kdecore import *
|
||||
from PyKDE4.kdeui import *
|
||||
import commands, os
|
||||
import commands
|
||||
import config
|
||||
|
||||
|
||||
@ -38,52 +38,37 @@ class ConfigDefinition:
|
||||
settings = config.Config(self.parent)
|
||||
|
||||
# update local variables
|
||||
self.parent.interval = self.configpage.ui.spinBox_interval.value()
|
||||
settings.set('interval', self.parent.interval)
|
||||
self.parent.font_family = str(self.configpage.ui.fontComboBox.currentFont().family())
|
||||
settings.set('font_family', self.parent.font_family)
|
||||
self.parent.font_size = self.configpage.ui.spinBox_fontSize.value()
|
||||
settings.set('font_size', self.parent.font_size)
|
||||
self.parent.font_color = str(self.configpage.ui.kcolorcombo.color().name())
|
||||
settings.set('font_color', self.parent.font_color)
|
||||
if (self.configpage.ui.comboBox_style.currentIndex() == 0):
|
||||
self.parent.font_style = 'normal'
|
||||
else:
|
||||
self.parent.font_style = 'italic'
|
||||
settings.set('font_style', self.parent.font_style)
|
||||
self.parent.font_weight = self.configpage.ui.spinBox_weight.value()
|
||||
settings.set('font_weight', self.parent.font_weight)
|
||||
settings.set('interval', self.configpage.ui.spinBox_interval.value())
|
||||
settings.set('font_family', str(self.configpage.ui.fontComboBox.currentFont().family()))
|
||||
settings.set('font_size', self.configpage.ui.spinBox_fontSize.value())
|
||||
settings.set('font_color', str(self.configpage.ui.kcolorcombo.color().name()))
|
||||
settings.set('font_style', str(self.configpage.ui.comboBox_style.currentText()))
|
||||
settings.set('font_weight', self.configpage.ui.spinBox_weight.value())
|
||||
|
||||
self.parent.custom_time = str(self.configpage.ui.lineEdit_timeFormat.text())
|
||||
settings.set('custom_time', self.parent.custom_time)
|
||||
self.parent.custom_uptime = str(self.configpage.ui.lineEdit_uptimeFormat.text())
|
||||
settings.set('custom_uptime', self.parent.custom_uptime)
|
||||
# temp and mount below
|
||||
self.parent.hddNames = []
|
||||
self.parent.hdd = {}
|
||||
settings.set('custom_time', str(self.configpage.ui.lineEdit_timeFormat.text()))
|
||||
settings.set('custom_uptime', str(self.configpage.ui.lineEdit_uptimeFormat.text()))
|
||||
item = QStringList()
|
||||
for i in range(self.configpage.ui.listWidget_tempDevice.count()):
|
||||
item.append(self.configpage.ui.listWidget_tempDevice.item(i).text())
|
||||
settings.set('temp_device', str(item.join(QString('@@'))))
|
||||
item = QStringList()
|
||||
for i in range(self.configpage.ui.listWidget_mount.count()):
|
||||
item.append(self.configpage.ui.listWidget_mount.item(i).text())
|
||||
settings.set('mount', str(item.join(QString('@@'))))
|
||||
item = QStringList()
|
||||
for i in range(self.configpage.ui.listWidget_hddDevice.count()):
|
||||
item = self.configpage.ui.listWidget_hddDevice.item(i).text()
|
||||
self.parent.hddNames.append(str(item))
|
||||
self.parent.hdd[str(item)] =" 0.0"
|
||||
settings.set('hdd', '@@'.join(self.parent.hddNames))
|
||||
self.parent.netdir = str(self.configpage.ui.lineEdit_netdir.text())
|
||||
settings.set('netdir', self.parent.netdir)
|
||||
self.parent.netdevBool = str(self.configpage.ui.checkBox_netdev.checkState())
|
||||
settings.set('netdevBool', self.parent.netdevBool)
|
||||
self.parent.custom_netdev = str(self.configpage.ui.comboBox_netdev.currentText())
|
||||
settings.set('custom_netdev', self.parent.custom_netdev)
|
||||
self.parent.battery_device = str(self.configpage.ui.lineEdit_batdev.text())
|
||||
settings.set('battery_device', self.parent.battery_device)
|
||||
self.parent.ac_device = str(self.configpage.ui.lineEdit_acdev.text())
|
||||
settings.set('ac_device', self.parent.ac_device)
|
||||
self.parent.player_name = self.configpage.ui.comboBox_playerSelect.currentIndex()
|
||||
settings.set('player_name', self.parent.player_name)
|
||||
item.append(self.configpage.ui.listWidget_hddDevice.item(i).text())
|
||||
settings.set('hdd', str(item.join(QString('@@'))))
|
||||
settings.set('netdir', str(self.configpage.ui.lineEdit_netdir.text()))
|
||||
settings.set('netdevBool', self.configpage.ui.checkBox_netdev.checkState())
|
||||
settings.set('custom_netdev', str(self.configpage.ui.comboBox_netdev.currentText()))
|
||||
settings.set('battery_device', str(self.configpage.ui.lineEdit_batdev.text()))
|
||||
settings.set('ac_device', str(self.configpage.ui.lineEdit_acdev.text()))
|
||||
settings.set('player_name', self.configpage.ui.comboBox_playerSelect.currentIndex())
|
||||
|
||||
self.parent.tooltipNum = self.configpage.ui.spinBox_tooltipNum.value()
|
||||
settings.set('tooltip_num', self.parent.tooltipNum)
|
||||
settings.set('tooltip_num', self.configpage.ui.spinBox_tooltipNum.value())
|
||||
for label in ['cpu', 'cpuclock', 'mem', 'swap', 'down', 'up']:
|
||||
exec ('self.parent.tooltipColors["' + label + '"] = str(self.configpage.kcolorcombo_' + label + '.color().name())')
|
||||
exec ('settings.set("' + label + '_color", self.parent.tooltipColors["' + label + '"])')
|
||||
exec('settings.set("' + label + '_color", str(self.configpage.kcolorcombo_' + label + '.color().name()))')
|
||||
|
||||
dataengineConfig = unicode(KGlobal.dirs().localkdedir()) + "/share/config/extsysmon.conf"
|
||||
try:
|
||||
@ -97,6 +82,7 @@ class ConfigDefinition:
|
||||
pass
|
||||
|
||||
# disconnecting from source and clear layout
|
||||
self.parent.disconnectFromSource()
|
||||
if (self.parent.uptimeBool > 0):
|
||||
self.parent.systemmonitor.disconnectSource("system/uptime", self.parent)
|
||||
self.parent.label_uptime.setText('')
|
||||
@ -118,13 +104,6 @@ class ConfigDefinition:
|
||||
self.parent.systemmonitor.disconnectSource(item, self.parent)
|
||||
self.parent.label_temp.setText('')
|
||||
self.parent.layout.removeItem(self.parent.label_temp)
|
||||
self.parent.tempNames = []
|
||||
self.parent.temp = {}
|
||||
for i in range(self.configpage.ui.listWidget_tempDevice.count()):
|
||||
item = self.configpage.ui.listWidget_tempDevice.item(i).text()
|
||||
self.parent.tempNames.append(str(item))
|
||||
self.parent.temp[str(item)] =" 0.0"
|
||||
settings.set('temp_device', '@@'.join(self.parent.tempNames))
|
||||
if (self.parent.gpuBool > 0):
|
||||
self.parent.extsysmon.disconnectSource("gpu", self.parent)
|
||||
self.parent.label_gpu.setText('')
|
||||
@ -149,13 +128,6 @@ class ConfigDefinition:
|
||||
self.parent.systemmonitor.disconnectSource("partitions" + item + "/filllevel", self.parent)
|
||||
self.parent.label_hdd.setText('')
|
||||
self.parent.layout.removeItem(self.parent.label_hdd)
|
||||
self.parent.mountNames = []
|
||||
self.parent.mount = {}
|
||||
for i in range(self.configpage.ui.listWidget_mount.count()):
|
||||
item = self.configpage.ui.listWidget_mount.item(i).text()
|
||||
self.parent.mountNames.append(str(item))
|
||||
self.parent.mount[str(item)] =" 0.0"
|
||||
settings.set('mount', '@@'.join(self.parent.mountNames))
|
||||
if (self.parent.hddtempBool > 0):
|
||||
self.parent.extsysmon.disconnectSource("hddtemp", self.parent)
|
||||
self.parent.label_hddtemp.setText('')
|
||||
|
@ -21,7 +21,6 @@ from PyQt4.QtCore import *
|
||||
from PyQt4.QtGui import *
|
||||
from PyKDE4.plasma import *
|
||||
from PyQt4 import uic
|
||||
from PyKDE4 import plasmascript
|
||||
|
||||
|
||||
|
||||
|
@ -19,8 +19,6 @@
|
||||
|
||||
from PyQt4.QtCore import *
|
||||
from PyQt4.QtGui import *
|
||||
from PyKDE4.plasma import Plasma
|
||||
from PyKDE4 import plasmascript
|
||||
|
||||
import datetime
|
||||
|
||||
@ -36,54 +34,48 @@ class DataEngine:
|
||||
self.parent = parent
|
||||
|
||||
|
||||
def connectToEngine(self):
|
||||
def connectToEngine(self, bools=None, dataEngines=None, interval=1000, names=None):
|
||||
"""function to initializate engine"""
|
||||
self.parent.systemmonitor = self.parent.dataEngine("systemmonitor")
|
||||
self.parent.extsysmon = self.parent.dataEngine("ext-sysmon")
|
||||
|
||||
if (self.parent.timeBool > 0):
|
||||
self.parent.timemon = self.parent.dataEngine("time")
|
||||
self.parent.timemon.connectSource("Local", self.parent, 1000)
|
||||
|
||||
if (self.parent.uptimeBool > 0):
|
||||
self.parent.systemmonitor.connectSource("system/uptime", self.parent, self.parent.interval)
|
||||
if (self.parent.cpuBool > 0):
|
||||
self.parent.systemmonitor.connectSource("cpu/system/TotalLoad", self.parent, self.parent.interval)
|
||||
for core in self.parent.cpuCore.keys():
|
||||
if (core > -1):
|
||||
self.parent.systemmonitor.connectSource("cpu/cpu"+str(core)+"/TotalLoad", self.parent, self.parent.interval)
|
||||
if (self.parent.cpuclockBool > 0):
|
||||
self.parent.systemmonitor.connectSource("cpu/system/AverageClock", self.parent, self.parent.interval)
|
||||
for core in self.parent.cpuClockCore.keys():
|
||||
if (core > -1):
|
||||
self.parent.systemmonitor.connectSource("cpu/cpu"+str(core)+"/clock", self.parent, self.parent.interval)
|
||||
if (self.parent.tempBool > 0):
|
||||
for item in self.parent.tempNames:
|
||||
self.parent.systemmonitor.connectSource(item, self.parent, self.parent.interval)
|
||||
if (self.parent.gpuBool > 0):
|
||||
self.parent.extsysmon.connectSource("gpu", self.parent, self.parent.interval)
|
||||
if (self.parent.gputempBool > 0):
|
||||
self.parent.extsysmon.connectSource("gputemp", self.parent, self.parent.interval)
|
||||
if (self.parent.memBool > 0):
|
||||
self.parent.systemmonitor.connectSource("mem/physical/free", self.parent, int(self.parent.interval*0.5))
|
||||
self.parent.systemmonitor.connectSource("mem/physical/used", self.parent, int(self.parent.interval*0.5))
|
||||
self.parent.systemmonitor.connectSource("mem/physical/application", self.parent, int(self.parent.interval*0.5))
|
||||
if (self.parent.swapBool > 0):
|
||||
self.parent.systemmonitor.connectSource("mem/swap/free", self.parent, int(self.parent.interval*0.5))
|
||||
self.parent.systemmonitor.connectSource("mem/swap/used", self.parent, int(self.parent.interval*0.5))
|
||||
if (self.parent.hddBool > 0):
|
||||
for item in self.parent.mountNames:
|
||||
self.parent.systemmonitor.connectSource("partitions" + item + "/filllevel", self.parent, self.parent.interval)
|
||||
if (self.parent.hddtempBool > 0):
|
||||
self.parent.extsysmon.connectSource("hddtemp", self.parent, self.parent.interval)
|
||||
if (self.parent.netBool > 0):
|
||||
self.parent.updateNetdev = 0
|
||||
self.parent.systemmonitor.connectSource("network/interfaces/"+self.parent.netdev+"/transmitter/data", self.parent, self.parent.interval)
|
||||
self.parent.systemmonitor.connectSource("network/interfaces/"+self.parent.netdev+"/receiver/data", self.parent, self.parent.interval)
|
||||
if (self.parent.playerBool > 0):
|
||||
self.parent.extsysmon.connectSource("player", self.parent, self.parent.interval)
|
||||
if (self.parent.customBool > 0):
|
||||
self.parent.extsysmon.connectSource("custom", self.parent, self.parent.interval)
|
||||
if (bools['cpu'] > 0):
|
||||
dataEngines['system'].connectSource("cpu/system/TotalLoad", self.parent, interval)
|
||||
for core in range(8):
|
||||
dataEngines['system'].connectSource("cpu/cpu" + str(core) + "/TotalLoad", self.parent, interval)
|
||||
if (bools['cpuclock'] > 0):
|
||||
dataEngines['system'].connectSource("cpu/system/AverageClock", self.parent, interval)
|
||||
for core in range(8):
|
||||
dataEngines['system'].connectSource("cpu/cpu" + str(core) + "/clock", self.parent, interval)
|
||||
if (bools['custom'] > 0):
|
||||
dataEngines['ext'].connectSource("custom", self.parent, interval)
|
||||
if (bools['gpu'] > 0):
|
||||
dataEngines['ext'].connectSource("gpu", self.parent, interval)
|
||||
if (bools['gputemp'] > 0):
|
||||
dataEngines['ext'].connectSource("gputemp", self.parent, interval)
|
||||
if (bools['hdd'] > 0):
|
||||
for item in names['hdd']:
|
||||
dataEngines['system'].connectSource("partitions" + item + "/filllevel", self.parent, interval)
|
||||
if (bools['hddtemp'] > 0):
|
||||
dataEngines['ext'].connectSource("hddtemp", self.parent, interval)
|
||||
if (bools['mem'] > 0):
|
||||
dataEngines['system'].connectSource("mem/physical/free", self.parent, interval)
|
||||
dataEngines['system'].connectSource("mem/physical/used", self.parent, interval)
|
||||
dataEngines['system'].connectSource("mem/physical/application", self.parent, interval)
|
||||
if (bools['net'] > 0):
|
||||
self.updateNetdev = 0
|
||||
dataEngines['system'].connectSource("network/interfaces/" + names['net'] + "/transmitter/data", self.parent, interval)
|
||||
dataEngines['system'].connectSource("network/interfaces/" + names['net'] + "/receiver/data", self.parent, interval)
|
||||
if (bools['player'] > 0):
|
||||
dataEngines['ext'].connectSource("player", self.parent, interval)
|
||||
if (bools['swap'] > 0):
|
||||
dataEngines['system'].connectSource("mem/swap/free", self.parent, interval)
|
||||
dataEngines['system'].connectSource("mem/swap/used", self.parent, interval)
|
||||
if (bools['temp'] > 0):
|
||||
for item in names['temp']:
|
||||
dataEngines['system'].connectSource(item, self.parent, interval)
|
||||
if (bools['time'] > 0):
|
||||
dataEngines['time'].connectSource("Local", self.parent, 1000)
|
||||
if (bools['uptime'] > 0):
|
||||
dataEngines['system'].connectSource("system/uptime", self.parent, interval)
|
||||
|
||||
|
||||
def dataUpdated(self, sourceName, data):
|
||||
"""function to update data"""
|
||||
@ -145,11 +137,11 @@ class DataEngine:
|
||||
if (self.parent.updateNetdev == 100):
|
||||
self.parent.updateNetdev = 0
|
||||
if (self.parent.netNonFormat.split('@@')[0] == self.parent.netNonFormat):
|
||||
self.parent.systemmonitor.disconnectSource("network/interfaces/"+self.parent.netdev+"/transmitter/data", self.parent)
|
||||
self.parent.systemmonitor.disconnectSource("network/interfaces/"+self.parent.netdev+"/receiver/data", self.parent)
|
||||
dataEngines['system'].disconnectSource("network/interfaces/"+self.parent.netdev+"/transmitter/data", self.parent)
|
||||
dataEngines['system'].disconnectSource("network/interfaces/"+self.parent.netdev+"/receiver/data", self.parent)
|
||||
self.parent.netdev = self.parent.setupNetdev()
|
||||
self.parent.systemmonitor.connectSource("network/interfaces/"+self.parent.netdev+"/transmitter/data", self.parent, self.parent.interval)
|
||||
self.parent.systemmonitor.connectSource("network/interfaces/"+self.parent.netdev+"/receiver/data", self.parent, self.parent.interval)
|
||||
dataEngines['system'].connectSource("network/interfaces/"+self.parent.netdev+"/transmitter/data", self.parent, self.parent.interval)
|
||||
dataEngines['system'].connectSource("network/interfaces/"+self.parent.netdev+"/receiver/data", self.parent, self.parent.interval)
|
||||
if (self.parent.netNonFormat.split('$netdev')[0] != self.parent.netNonFormat):
|
||||
self.parent.netFormat = self.parent.netNonFormat.split('$netdev')[0] + self.parent.netdev + self.parent.netNonFormat.split('$netdev')[1]
|
||||
else:
|
||||
@ -247,7 +239,7 @@ class DataEngine:
|
||||
line = line.split('$artist')[0] + artist + line.split('$artist')[1]
|
||||
if (line.split('$progress')[0] != line):
|
||||
timeText = '%02i:%02i' % (int(time)/60, int(time)%60)
|
||||
line = line.split('$progress')[0] + timeText + line.split('$progress')[1]
|
||||
line = line.split('$progress')[0] + progress + line.split('$progress')[1]
|
||||
if (line.split('$time')[0] != line):
|
||||
timeText = '%02i:%02i' % (int(time)/60, int(time)%60)
|
||||
line = line.split('$time')[0] + timeText + line.split('$time')[1]
|
||||
@ -273,9 +265,7 @@ class DataEngine:
|
||||
value = self.parent.custom_time
|
||||
for letters in timeLetters:
|
||||
if (value.split('$'+letters)[0] != value):
|
||||
value = value.split('$'+letters)[0] + \
|
||||
str(data[QString(u'DateTime')].toString(letters).toUtf8()).decode("utf-8") + \
|
||||
value.split('$'+letters)[1]
|
||||
value = value.split('$'+letters)[0] + str(rawDate.toString(letters).toUtf8()).decode("utf-8") + value.split('$'+letters)[1]
|
||||
line = self.parent.timeFormat.split('$custom')[0] + value + self.parent.timeFormat.split('$custom')[1]
|
||||
else:
|
||||
line = self.parent.timeFormat
|
||||
|
@ -24,17 +24,34 @@ from PyKDE4.kdeui import *
|
||||
from PyKDE4.kio import *
|
||||
from PyKDE4 import plasmascript
|
||||
from PyKDE4.plasma import Plasma
|
||||
import commands, os, shutil, time
|
||||
import commands, os, shutil
|
||||
|
||||
import configdef
|
||||
import configwindow
|
||||
import dataengine
|
||||
import ptmnotify
|
||||
import reinit
|
||||
import tooltip
|
||||
from util import *
|
||||
|
||||
|
||||
|
||||
class NewPlasmaLabel(Plasma.Label):
|
||||
"""new Label with defined clicked() event"""
|
||||
def __init__(self, applet, parent):
|
||||
"""class definition"""
|
||||
Plasma.Label.__init__(self, applet)
|
||||
self.parent = parent
|
||||
self.notify = ptmnotify.PTMNotify(self)
|
||||
|
||||
|
||||
def mousePressEvent(self, event):
|
||||
"""mouse click event"""
|
||||
if (event.button() == Qt.LeftButton):
|
||||
self.notify.init()
|
||||
|
||||
|
||||
|
||||
class pyTextWidget(plasmascript.Applet):
|
||||
def __init__(self, parent, args=None):
|
||||
"""widget definition"""
|
||||
@ -44,18 +61,21 @@ class pyTextWidget(plasmascript.Applet):
|
||||
def init(self):
|
||||
"""function to initializate widget"""
|
||||
self._name = str(self.package().metadata().pluginName())
|
||||
self.layout = QGraphicsLinearLayout(Qt.Horizontal, self.applet)
|
||||
self.setupVar()
|
||||
|
||||
self.dataengine = dataengine.DataEngine(self)
|
||||
self.reinit = reinit.Reinit(self)
|
||||
self.reinit = reinit.Reinit(self, self.ptm['defaults'])
|
||||
self.tooltipAgent = tooltip.Tooltip(self)
|
||||
|
||||
self.timer = QTimer()
|
||||
QObject.connect(self.timer, SIGNAL("timeout()"), self.updateLabel)
|
||||
|
||||
self.setupVar()
|
||||
self.initTooltip()
|
||||
self.reinit.reinit(confAccept=False)
|
||||
self.reinit.reinit()
|
||||
self.applet.setLayout(self.ptm['layout'])
|
||||
self.theme = Plasma.Svg(self)
|
||||
self.theme.setImagePath("widgets/background")
|
||||
self.setBackgroundHints(Plasma.Applet.DefaultBackground)
|
||||
|
||||
self.setHasConfigurationInterface(True)
|
||||
# Create notifyrc file if required
|
||||
@ -129,6 +149,59 @@ class pyTextWidget(plasmascript.Applet):
|
||||
|
||||
def setupVar(self):
|
||||
"""function to setup variables"""
|
||||
self.ptm = {}
|
||||
# dataengines
|
||||
self.ptm['dataengine'] = {'ext':None, 'system':None, 'time':None}
|
||||
# defaults
|
||||
self.ptm['defaults'] = {}
|
||||
self.ptm['defaults']['order'] = {'6':'bat', '1':'cpu', '7':'cpuclock', 'f':'custom', '9':'gpu',
|
||||
'a':'gputemp', 'b':'hdd', 'c':'hddtemp', '3':'mem', '5':'net', '4':'swap', '2':'temp',
|
||||
'8':'uptime', 'd':'player', 'e':'time'}
|
||||
self.ptm['defaults']['format'] = {'bat':'[bat: $bat%$ac]', 'cpu':'[cpu: $cpu%]',
|
||||
'cpuclock':'[mhz: $cpucl]', 'custom':'[$custom]', 'gpu':'[gpu: $gpu%]',
|
||||
'gputemp':'[gpu temp: $gputemp°C]', 'hdd':'[hdd: $hdd0%]',
|
||||
'hddtemp':'[hdd temp: $hddtemp0°C]', 'mem':'[mem: $mem%]',
|
||||
'net':'[$netdev: $down/$upKB/s]', 'swap':'[swap: $swap%]',
|
||||
'temp':'[temp: $temp0°C]', 'uptime':'[uptime: $uptime]',
|
||||
'player':'[$artist - $title]', 'time':'[$time]'}
|
||||
# labels
|
||||
self.ptm['labels'] = {}
|
||||
self.ptm['layout'] = QGraphicsLinearLayout(Qt.Horizontal, self.applet)
|
||||
self.ptm['layout'].setContentsMargins(1, 1, 1, 1)
|
||||
# names
|
||||
self.ptm['names'] = {}
|
||||
self.ptm['names']['hdd'] = []
|
||||
self.ptm['names']['hddtemp'] = []
|
||||
self.ptm['names']['net'] = ""
|
||||
self.ptm['names']['temp'] = []
|
||||
# tooltips
|
||||
self.ptm['tooltip'] = {}
|
||||
self.ptm['tooltip']['bounds'] = {'cpu':100.0, 'cpuclock':4000.0, 'mem':16000.0,
|
||||
'swap':16000, 'down':10000.0, 'up':10000.0}
|
||||
self.ptm['tooltip']['values'] = {'cpu':[0.0, 0.0], 'cpuclock':[0, 0], 'mem':[0, 0],
|
||||
'swap':[0, 0], 'down':[0, 0], 'up':[0, 0]}
|
||||
# values
|
||||
self.ptm['values'] = {}
|
||||
self.ptm['values']['cpu'] = {-1:0.0}
|
||||
self.ptm['values']['cpuclock'] = {-1:0}
|
||||
numCores = int(commands.getoutput("grep -c '^processor' /proc/cpuinfo"))
|
||||
for i in range(numCores):
|
||||
self.ptm['values']['cpu'][i] = 0.0
|
||||
self.ptm['values']['cpuclock'][i] = 0
|
||||
self.ptm['values']['hdd'] = {}
|
||||
self.ptm['values']['hddtemp'] = {}
|
||||
self.ptm['values']['mem'] = {'used':0, 'free':0, 'total':1}
|
||||
self.ptm['values']['net'] = {"up":0, "down":0}
|
||||
self.ptm['values']['swap'] = {'used':0, 'free':0, 'total':1}
|
||||
self.ptm['values']['temp'] = {}
|
||||
# variables
|
||||
self.ptm['vars'] = {}
|
||||
self.ptm['vars']['adv'] = {}
|
||||
self.ptm['vars']['app'] = {}
|
||||
self.ptm['vars']['bools'] = {}
|
||||
self.ptm['vars']['formats'] = {}
|
||||
self.ptm['vars']['tooltip'] = {}
|
||||
|
||||
self.cpuCore = {-1:" 0.0"}
|
||||
self.cpuClockCore = {-1:" 0"}
|
||||
numCores = int(commands.getoutput("grep -c '^processor' /proc/cpuinfo"))
|
||||
@ -315,6 +388,45 @@ class pyTextWidget(plasmascript.Applet):
|
||||
self.label_temp.setText(text)
|
||||
|
||||
|
||||
# api's functions
|
||||
def addLabel(self, name=None, text=None, add=True):
|
||||
"""function to add new label"""
|
||||
if (add):
|
||||
self.ptm['labels'][name] = NewPlasmaLabel(self.applet, self)
|
||||
self.ptm['layout'].addItem(self.ptm['labels'][name])
|
||||
self.setText(name, text)
|
||||
else:
|
||||
self.setText(name, '')
|
||||
self.ptm['layout'].removeItem(self.ptm['labels'][name])
|
||||
|
||||
|
||||
def applySettings(self, name=None, ptm=None):
|
||||
"""function to read settings"""
|
||||
self.ptm[name] = ptm
|
||||
if (name == "names"):
|
||||
for item in ['hdd', 'hddtemp', 'temp']:
|
||||
for value in self.ptm['names'][item]:
|
||||
self.ptm['values'][item][value] = 0.0
|
||||
|
||||
|
||||
def connectToEngine(self):
|
||||
"""function to connect to dataengines"""
|
||||
self.ptm['dataengine']['ext'] = self.dataEngine("ext-sysmon")
|
||||
self.ptm['dataengine']['system'] = self.dataEngine("systemmonitor")
|
||||
self.ptm['dataengine']['time'] = self.dataEngine("time")
|
||||
self.dataengine.connectToEngine(self.ptm['vars']['bools'], self.ptm['dataengine'],
|
||||
self.ptm['vars']['app']['interval'], self.ptm['names'])
|
||||
|
||||
|
||||
def disconnectFromSource(self):
|
||||
"""function to disconnect from sources"""
|
||||
|
||||
|
||||
def setText(self, name=None, text=None):
|
||||
"""function to set text to labels"""
|
||||
self.ptm['labels'][name].setText(text)
|
||||
|
||||
|
||||
@pyqtSignature("dataUpdated(const QString &, const Plasma::DataEngine::Data &)")
|
||||
def dataUpdated(self, sourceName, data):
|
||||
"""function to update label"""
|
||||
|
@ -19,247 +19,86 @@
|
||||
|
||||
from PyQt4.QtCore import *
|
||||
from PyQt4.QtGui import *
|
||||
from PyKDE4.plasma import Plasma
|
||||
import config
|
||||
import ptmnotify
|
||||
|
||||
|
||||
|
||||
class NewPlasmaLabel(Plasma.Label):
|
||||
"""new Label with defined clicked() event"""
|
||||
def __init__(self, applet, parent):
|
||||
"""class definition"""
|
||||
Plasma.Label.__init__(self, applet)
|
||||
self.parent = parent
|
||||
self.notify = ptmnotify.PTMNotify(self)
|
||||
|
||||
|
||||
def mousePressEvent(self, event):
|
||||
"""mouse click event"""
|
||||
if (event.button() == Qt.LeftButton):
|
||||
self.notify.init()
|
||||
|
||||
|
||||
|
||||
class Reinit():
|
||||
def __init__(self, parent):
|
||||
def __init__(self, parent, defaults=None):
|
||||
"""class definition"""
|
||||
self.parent = parent
|
||||
self.defaults = defaults
|
||||
self.labels = defaults['format'].keys()
|
||||
|
||||
|
||||
def reinit(self, confAccept=False):
|
||||
def reinit(self):
|
||||
"""function to reinitializate widget"""
|
||||
settings = config.Config(self.parent)
|
||||
self.parent.interval = settings.get('interval', 2000).toInt()[0]
|
||||
self.parent.font_family = str(settings.get('font_family', 'Terminus'))
|
||||
self.parent.font_size = settings.get('font_size', 12).toInt()[0]
|
||||
self.parent.font_color = str(settings.get('font_color', '#000000'))
|
||||
self.parent.font_style = str(settings.get('font_style', 'normal'))
|
||||
self.parent.font_weight = settings.get('font_weight', 400).toInt()[0]
|
||||
self.parent.formatLine = "<pre><p align=\"center\"><span style=\" font-family:'" + self.parent.font_family + "'; font-style:" + self.parent.font_style
|
||||
self.parent.formatLine = self.parent.formatLine + "; font-size:" + str(self.parent.font_size) + "pt; font-weight:" + str(self.parent.font_weight)
|
||||
self.parent.formatLine = self.parent.formatLine + "; color:" + self.parent.font_color + ";\">$LINE</span></p></pre>"
|
||||
ptmVars = {}
|
||||
|
||||
self.parent.custom_time = str(settings.get('custom_time', '$hh:$mm'))
|
||||
self.parent.custom_uptime = str(settings.get('custom_uptime', '$ds,$hs,$ms'))
|
||||
self.parent.tempNames = []
|
||||
self.parent.temp = {}
|
||||
for item in str(settings.get('temp_device', '')).split('@@'):
|
||||
self.parent.tempNames.append(item)
|
||||
self.parent.temp[item] =" 0.0"
|
||||
self.parent.mountNames = []
|
||||
self.parent.mount = {}
|
||||
for item in str(settings.get('mount', '/')).split('@@'):
|
||||
self.parent.mountNames.append(item)
|
||||
self.parent.mount[item] =" 0.0"
|
||||
self.parent.hddNames = []
|
||||
self.parent.hdd = {}
|
||||
for item in str(settings.get('hdd', '/dev/sda')).split('@@'):
|
||||
self.parent.hddNames.append(item)
|
||||
self.parent.hdd[item] =" 0.0"
|
||||
self.parent.netdir = str(settings.get('netdir', '/sys/class/net'))
|
||||
self.parent.netdevBool = settings.get('netdevBool', 0).toInt()[0]
|
||||
self.parent.custom_netdev = str(settings.get('custom_netdev', 'lo'))
|
||||
self.parent.battery_device = str(settings.get('battery_device', '/sys/class/power_supply/BAT0/capacity'))
|
||||
self.parent.ac_device = str(settings.get('ac_device', '/sys/class/power_supply/AC/online'))
|
||||
self.parent.player_name = settings.get('player_name', 0).toInt()[0]
|
||||
ptmVars['adv'] = {}
|
||||
ptmVars['adv']['acDev'] = str(settings.get('ac_device', '/sys/class/power_supply/AC/online'))
|
||||
ptmVars['adv']['batDev'] = str(settings.get('battery_device', '/sys/class/power_supply/BAT0/capacity'))
|
||||
ptmVars['adv']['customTime'] = str(settings.get('custom_time', '$hh:$mm'))
|
||||
ptmVars['adv']['customUptime'] = str(settings.get('custom_uptime', '$dd,$hh,$mm'))
|
||||
ptmVars['adv']['netdevBool'] = settings.get('netdevBool', 0).toInt()[0]
|
||||
ptmVars['adv']['netDir'] = str(settings.get('netdir', '/sys/class/net'))
|
||||
ptmVars['adv']['player'] = settings.get('player_name', 0).toInt()[0]
|
||||
|
||||
self.parent.tooltipNum = settings.get('tooltip_num', 100).toInt()[0]
|
||||
self.parent.tooltipColors['cpu'] = str(settings.get('cpu_color', '#ff0000'))
|
||||
self.parent.tooltipColors['cpuclock'] = str(settings.get('cpuclock_color', '#00ff00'))
|
||||
self.parent.tooltipColors['mem'] = str(settings.get('mem_color', '#0000ff'))
|
||||
self.parent.tooltipColors['swap'] = str(settings.get('swap_color', '#ffff00'))
|
||||
self.parent.tooltipColors['down'] = str(settings.get('down_color', '#00ffff'))
|
||||
self.parent.tooltipColors['up'] = str(settings.get('up_color', '#ff00ff'))
|
||||
ptmVars['app'] = {}
|
||||
ptmVars['app']['format'] = "<pre><p align=\"center\"><span style=\" font-family:'" + str(settings.get('font_family', 'Terminus')) +\
|
||||
"'; font-style:" + str(settings.get('font_style', 'normal')) + "; font-size:" + str(settings.get('font_size', 12)) +\
|
||||
"pt; font-weight:" + str(settings.get('font_weight', 400)) + "; color:" + str(settings.get('font_color', '#000000')) +\
|
||||
";\">$LINE</span></p></pre>"
|
||||
ptmVars['app']['interval'] = settings.get('interval', 2000).toInt()[0]
|
||||
ptmVars['app']['order'] = str(settings.get('label_order', '1345'))
|
||||
|
||||
self.parent.tooltipReq = []
|
||||
self.parent.label_order = str(settings.get('label_order', '1345'))
|
||||
for label in self.parent.dict_orders.values():
|
||||
if ((label == 'cpu') or (label == 'mem') or (label == 'swap') or (label == 'net')):
|
||||
exec ('self.parent.' + label + 'Bool = settings.get("' + label + 'Bool", 2).toInt()[0]')
|
||||
ptmVars['tooltip'] = {}
|
||||
ptmVars['tooltip']['colors'] = {}
|
||||
ptmVars['tooltip']['colors']['cpu'] = str(settings.get('cpu_color', '#ff0000'))
|
||||
ptmVars['tooltip']['colors']['cpuclock'] = str(settings.get('cpuclock_color', '#00ff00'))
|
||||
ptmVars['tooltip']['colors']['mem'] = str(settings.get('mem_color', '#0000ff'))
|
||||
ptmVars['tooltip']['colors']['swap'] = str(settings.get('swap_color', '#ffff00'))
|
||||
ptmVars['tooltip']['colors']['down'] = str(settings.get('down_color', '#00ffff'))
|
||||
ptmVars['tooltip']['colors']['up'] = str(settings.get('up_color', '#ff00ff'))
|
||||
ptmVars['tooltip']['num'] = settings.get('tooltip_num', 100).toInt()[0]
|
||||
|
||||
ptmVars['bools'] = {}
|
||||
for label in self.labels:
|
||||
if (label in ['cpu', 'mem', 'swap', 'net']):
|
||||
exec("ptmVars['bools'][label] = settings.get('" + label + "Bool', 2).toInt()[0]")
|
||||
else:
|
||||
exec ('self.parent.' + label + 'Bool = settings.get("' + label + 'Bool", 0).toInt()[0]')
|
||||
exec("ptmVars['bools'][label] = settings.get('" + label + "Bool', 0).toInt()[0]")
|
||||
print (ptmVars['bools'])
|
||||
|
||||
# labels
|
||||
for order in self.parent.label_order:
|
||||
if (order == "1"):
|
||||
if (self.parent.cpuBool > 0):
|
||||
self.parent.cpuFormat = str(settings.get('cpuFormat', '[cpu: $cpu%]'))
|
||||
self.parent.label_cpu = NewPlasmaLabel(self.parent.applet, self.parent)
|
||||
line = self.parent.cpuFormat
|
||||
text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1]
|
||||
self.parent.label_cpu.setText(text)
|
||||
self.parent.layout.addItem(self.parent.label_cpu)
|
||||
if (self.parent.cpuBool == 2):
|
||||
self.parent.tooltipReq.append('cpu')
|
||||
elif (order == "2"):
|
||||
if (self.parent.tempBool > 0):
|
||||
self.parent.tempFormat = str(settings.get('tempFormat', '[temp: $temp0°C]'))
|
||||
self.parent.label_temp = NewPlasmaLabel(self.parent.applet, self.parent)
|
||||
line = self.parent.tempFormat
|
||||
text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1]
|
||||
self.parent.label_temp.setText(text)
|
||||
self.parent.layout.addItem(self.parent.label_temp)
|
||||
elif (order == "3"):
|
||||
if (self.parent.memBool > 0):
|
||||
self.parent.memFormat = str(settings.get('memFormat', '[mem: $mem%]'))
|
||||
self.parent.label_mem = NewPlasmaLabel(self.parent.applet, self.parent)
|
||||
if (self.parent.memFormat.split('$memmb')[0] != self.parent.memFormat):
|
||||
self.parent.memInMb = True
|
||||
elif (self.parent.memFormat.split('$mem')[0] != self.parent.memFormat):
|
||||
self.parent.memInMb = False
|
||||
line = self.parent.memFormat
|
||||
text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1]
|
||||
self.parent.label_mem.setText(text)
|
||||
self.parent.layout.addItem(self.parent.label_mem)
|
||||
if (self.parent.memBool == 2):
|
||||
self.parent.tooltipReq.append('mem')
|
||||
elif (order == "4"):
|
||||
if (self.parent.swapBool > 0):
|
||||
self.parent.swapFormat = str(settings.get('swapFormat', '[swap: $swap%]'))
|
||||
self.parent.label_swap = NewPlasmaLabel(self.parent.applet, self.parent)
|
||||
if (self.parent.swapFormat.split('$swapmb')[0] != self.parent.swapFormat):
|
||||
self.parent.swapInMb = True
|
||||
elif (self.parent.swapFormat.split('$swap')[0] != self.parent.swapFormat):
|
||||
self.parent.swapInMb = False
|
||||
line = self.parent.swapFormat
|
||||
text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1]
|
||||
self.parent.label_swap.setText(text)
|
||||
self.parent.layout.addItem(self.parent.label_swap)
|
||||
if (self.parent.swapBool == 2):
|
||||
self.parent.tooltipReq.append('swap')
|
||||
elif (order == "5"):
|
||||
if (self.parent.netBool > 0):
|
||||
self.parent.netNonFormat = str(settings.get('netNonFormat', '[net: $down/$upKB/s]'))
|
||||
self.parent.label_net = NewPlasmaLabel(self.parent.applet, self.parent)
|
||||
if (self.parent.netdevBool > 0):
|
||||
self.parent.netdev = self.parent.custom_netdev
|
||||
ptmNames = {}
|
||||
ptmNames['hdd'] = str(settings.get('mount', '/')).split('@@')
|
||||
ptmNames['hddtemp'] = str(settings.get('hdd', '/dev/sda')).split('@@')
|
||||
ptmNames['net'] = str(settings.get('custom_netdev', 'lo'))
|
||||
ptmNames['temp'] = str(settings.get('temp_device', '')).split('@@')
|
||||
self.parent.applySettings('names', ptmNames)
|
||||
|
||||
ptmVars['formats'] = {}
|
||||
ptmVars['tooltip']['required'] = []
|
||||
for order in ptmVars['app']['order']:
|
||||
label = self.defaults['order'][order]
|
||||
if (ptmVars['bools'][label] > 0):
|
||||
exec("ptmVars['formats'][label] = str(settings.get('" + label + "Format', self.defaults['format'][label]))")
|
||||
text = ptmVars['app']['format'].split('$LINE')[0] + ptmVars['formats'][label] + ptmVars['app']['format'].split('$LINE')[1]
|
||||
self.parent.addLabel(label, text, True)
|
||||
if ((label in ['cpu', 'cpuclock', 'mem', 'net', 'swap']) and (ptmVars['bools'][label] == 2)):
|
||||
if (label == 'net'):
|
||||
ptmVars['tooltip']['required'].append("down")
|
||||
ptmVars['tooltip']['required'].append("up")
|
||||
else:
|
||||
self.parent.netdev = self.parent.setupNetdev()
|
||||
if (self.parent.netNonFormat.split('$netdev')[0] != self.parent.netNonFormat):
|
||||
self.parent.netFormat = self.parent.netNonFormat.split('$netdev')[0] + self.parent.netdev + self.parent.netNonFormat.split('$netdev')[1]
|
||||
else:
|
||||
self.parent.netFormat = self.parent.netNonFormat
|
||||
line = self.parent.netFormat
|
||||
text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1]
|
||||
self.parent.label_net.setText(text)
|
||||
self.parent.layout.addItem(self.parent.label_net)
|
||||
if (self.parent.netBool == 2):
|
||||
self.parent.tooltipReq.append('down')
|
||||
self.parent.tooltipReq.append('up')
|
||||
elif (order == "6"):
|
||||
if (self.parent.batBool > 0):
|
||||
self.parent.batFormat = str(settings.get('batFormat', '[bat: $bat%$ac]'))
|
||||
self.parent.label_bat = NewPlasmaLabel(self.parent.applet, self.parent)
|
||||
line = self.parent.batFormat
|
||||
text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1]
|
||||
self.parent.label_bat.setText(text)
|
||||
self.parent.layout.addItem(self.parent.label_bat)
|
||||
elif (order == "7"):
|
||||
if (self.parent.cpuclockBool > 0):
|
||||
self.parent.cpuclockFormat = str(settings.get('cpuclockFormat', '[mhz: $cpucl]'))
|
||||
self.parent.label_cpuclock = NewPlasmaLabel(self.parent.applet, self.parent)
|
||||
line = self.parent.cpuclockFormat
|
||||
text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1]
|
||||
self.parent.label_cpuclock.setText(text)
|
||||
self.parent.layout.addItem(self.parent.label_cpuclock)
|
||||
if (self.parent.cpuclockBool == 2):
|
||||
self.parent.tooltipReq.append('cpuclock')
|
||||
elif (order == "8"):
|
||||
if (self.parent.uptimeBool > 0):
|
||||
self.parent.uptimeFormat = str(settings.get('uptimeFormat', '[uptime: $uptime]'))
|
||||
self.parent.label_uptime = NewPlasmaLabel(self.parent.applet, self.parent)
|
||||
line = self.parent.uptimeFormat
|
||||
text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1]
|
||||
self.parent.label_uptime.setText(text)
|
||||
self.parent.layout.addItem(self.parent.label_uptime)
|
||||
elif (order == "9"):
|
||||
if (self.parent.gpuBool > 0):
|
||||
self.parent.gpuFormat = str(settings.get('gpuFormat', '[gpu: $gpu%]'))
|
||||
self.parent.label_gpu = NewPlasmaLabel(self.parent.applet, self.parent)
|
||||
line = self.parent.gpuFormat
|
||||
text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1]
|
||||
self.parent.label_gpu.setText(text)
|
||||
self.parent.layout.addItem(self.parent.label_gpu)
|
||||
elif (order == "a"):
|
||||
if (self.parent.gputempBool > 0):
|
||||
self.parent.gputempFormat = str(settings.get('gputempFormat', '[gpu temp: $gputemp°C]'))
|
||||
self.parent.label_gputemp = NewPlasmaLabel(self.parent.applet, self.parent)
|
||||
line = self.parent.gputempFormat
|
||||
text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1]
|
||||
self.parent.label_gputemp.setText(text)
|
||||
self.parent.layout.addItem(self.parent.label_gputemp)
|
||||
elif (order == "b"):
|
||||
if (self.parent.hddBool > 0):
|
||||
self.parent.hddFormat = str(settings.get('hddFormat', '[hdd: $hdd0%]'))
|
||||
self.parent.label_hdd = NewPlasmaLabel(self.parent.applet, self.parent)
|
||||
line = self.parent.hddFormat
|
||||
text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1]
|
||||
self.parent.label_hdd.setText(text)
|
||||
self.parent.layout.addItem(self.parent.label_hdd)
|
||||
elif (order == "c"):
|
||||
if (self.parent.hddtempBool > 0):
|
||||
self.parent.hddtempFormat = str(settings.get('hddtempFormat', '[hdd temp: $hddtemp0°C]'))
|
||||
self.parent.label_hddtemp = NewPlasmaLabel(self.parent.applet, self.parent)
|
||||
line = self.parent.hddtempFormat
|
||||
text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1]
|
||||
self.parent.label_hddtemp.setText(text)
|
||||
self.parent.layout.addItem(self.parent.label_hddtemp)
|
||||
elif (order == "d"):
|
||||
if (self.parent.playerBool > 0):
|
||||
self.parent.playerFormat = str(settings.get('playerFormat', '[$artist - $title]'))
|
||||
self.parent.label_player = NewPlasmaLabel(self.parent.applet, self.parent)
|
||||
line = self.parent.playerFormat
|
||||
text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1]
|
||||
self.parent.label_player.setText(text)
|
||||
self.parent.layout.addItem(self.parent.label_player)
|
||||
elif (order == "e"):
|
||||
if (self.parent.timeBool > 0):
|
||||
self.parent.timeFormat = str(settings.get('timeFormat', '[$time]'))
|
||||
self.parent.label_time = NewPlasmaLabel(self.parent.applet, self.parent)
|
||||
line = self.parent.timeFormat
|
||||
text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1]
|
||||
self.parent.label_time.setText(text)
|
||||
self.parent.layout.addItem(self.parent.label_time)
|
||||
elif (order == "f"):
|
||||
if (self.parent.customBool > 0):
|
||||
self.parent.customFormat = str(settings.get('customFormat', '[$custom]'))
|
||||
self.parent.label_custom = NewPlasmaLabel(self.parent.applet, self.parent)
|
||||
line = self.parent.customFormat
|
||||
text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1]
|
||||
self.parent.label_custom.setText(text)
|
||||
self.parent.layout.addItem(self.parent.label_custom)
|
||||
if not confAccept:
|
||||
self.parent.layout.setContentsMargins(1, 1, 1, 1)
|
||||
self.parent.applet.setLayout(self.parent.layout)
|
||||
self.parent.theme = Plasma.Svg(self.parent)
|
||||
self.parent.theme.setImagePath("widgets/background")
|
||||
self.parent.setBackgroundHints(Plasma.Applet.DefaultBackground)
|
||||
ptmVars['tooltip']['required'].append(label)
|
||||
self.parent.applySettings('vars', ptmVars)
|
||||
|
||||
self.parent.resize(10, 10)
|
||||
|
||||
# create dataengines
|
||||
self.parent.thread().wait(60000)
|
||||
self.parent.dataengine.connectToEngine()
|
||||
self.parent.connectToEngine()
|
||||
|
||||
self.parent.timer.setInterval(self.parent.interval)
|
||||
self.parent.startPolling()
|
||||
|
@ -34,7 +34,7 @@ class Util():
|
||||
try:
|
||||
os.mkdir(name)
|
||||
except:
|
||||
print 'Failed to create directory: ' + name
|
||||
print ('Failed to create directory: ' + name)
|
||||
|
||||
|
||||
def kdeHome(self):
|
||||
@ -42,7 +42,7 @@ class Util():
|
||||
|
||||
|
||||
def createNotifyrc(self):
|
||||
print '[%s] creating notifyrc' % (self.applet._name)
|
||||
print ('[%s] creating notifyrc' % (self.applet._name))
|
||||
self.createDirectory(self.kdeHome() + 'share/apps/%s' % self.applet._name)
|
||||
|
||||
source = self.applet.package().path() + 'contents/misc/%s.notifyrc' % self.applet._name
|
||||
|
Reference in New Issue
Block a user