Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
2
2020_068
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
2020_068
2020_068
Commits
5bec3d47
Commit
5bec3d47
authored
Nov 05, 2020
by
Tharindu Munasinghe
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Tray minimizer
parent
c0834b66
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
374 additions
and
0 deletions
+374
-0
RenderH/Tray.py
RenderH/Tray.py
+374
-0
No files found.
RenderH/Tray.py
0 → 100644
View file @
5bec3d47
from
PySide.QtCore
import
*
from
PySide.QtGui
import
*
import
sys
,
os
,
time
,
subprocess
,
shutil
,
socket
pandoraRoot
=
os
.
path
.
dirname
(
os
.
path
.
dirname
(
__file__
))
sys
.
path
.
append
(
os
.
path
.
join
(
pandoraRoot
,
"PythonLibs"
,
"Renderslave"
))
import
psutil
from
UserInterfacesPandora
import
qdarkstyle
class
PandoraTray
():
def
__init__
(
self
,
core
,
silent
=
False
):
self
.
core
=
core
try
:
pIcon
=
QIcon
(
os
.
path
.
dirname
(
os
.
path
.
abspath
(
__file__
))
+
"
\\
UserInterfacesPandora
\\
pandora_tray.ico"
)
self
.
core
.
messageParent
.
setWindowIcon
(
pIcon
)
# coreProc = []
# for x in psutil.pids():
# try:
# if x != os.getpid() and os.path.basename(psutil.Process(x).exe()) == "PandoraTray.exe":
# coreProc.append(x)
# except:
# pass
# if len(coreProc) > 0:
# if silent:
# for pid in coreProc:
# proc = psutil.Process(pid)
# proc.kill()
# else:
# QMessageBox.warning(self.core.messageParent, "PandoraTray", "PandoraTray is already running.")
# qApp.quit()
# sys.exit()
# return
self
.
createTrayIcon
()
self
.
trayIcon
.
show
()
except
Exception
,
e
:
exc_type
,
exc_obj
,
exc_tb
=
sys
.
exc_info
()
QMessageBox
.
critical
(
self
.
core
.
messageParent
,
"Unknown Error"
,
"initTray -
%
s -
%
s -
%
s"
%
(
str
(
e
),
exc_type
,
exc_tb
.
tb_lineno
))
def
createTrayIcon
(
self
):
try
:
self
.
trayIconMenu
=
QMenu
(
self
.
core
.
messageParent
)
self
.
handlerAction
=
QAction
(
"Render Handler"
,
self
.
core
.
messageParent
,
triggered
=
self
.
startRenderHandler
)
self
.
collectAction
=
QAction
(
"Collect renderings"
,
self
.
core
.
messageParent
,
triggered
=
self
.
collectRenderings
)
self
.
trayIconMenu
.
addAction
(
self
.
handlerAction
)
self
.
trayIconMenu
.
addAction
(
self
.
collectAction
)
self
.
trayIconMenu
.
addSeparator
()
self
.
slaveAction
=
QAction
(
"Start Slave"
,
self
.
core
.
messageParent
,
triggered
=
lambda
:
self
.
core
.
startRenderSlave
(
newProc
=
True
))
self
.
trayIconMenu
.
addAction
(
self
.
slaveAction
)
self
.
slaveStopAction
=
QAction
(
"Stop Slave"
,
self
.
core
.
messageParent
,
triggered
=
self
.
core
.
stopRenderSlave
)
self
.
trayIconMenu
.
addAction
(
self
.
slaveStopAction
)
self
.
trayIconMenu
.
addSeparator
()
self
.
coordAction
=
QAction
(
"Start Coordinator"
,
self
.
core
.
messageParent
,
triggered
=
self
.
core
.
startCoordinator
)
self
.
trayIconMenu
.
addAction
(
self
.
coordAction
)
self
.
coordStopAction
=
QAction
(
"Stop Coordinator"
,
self
.
core
.
messageParent
,
triggered
=
self
.
core
.
stopCoordinator
)
self
.
trayIconMenu
.
addAction
(
self
.
coordStopAction
)
self
.
trayIconMenu
.
addSeparator
()
self
.
settingsAction
=
QAction
(
"Pandora Settings..."
,
self
.
core
.
messageParent
,
triggered
=
self
.
openSettings
)
self
.
trayIconMenu
.
addAction
(
self
.
settingsAction
)
self
.
trayIconMenu
.
addSeparator
()
self
.
exitAction
=
QAction
(
"Exit"
,
self
.
core
.
messageParent
,
triggered
=
self
.
exitTray
)
self
.
trayIconMenu
.
addAction
(
self
.
exitAction
)
self
.
trayIcon
=
QSystemTrayIcon
()
self
.
trayIcon
.
setContextMenu
(
self
.
trayIconMenu
)
self
.
trayIcon
.
setToolTip
(
"Pandora Tools"
)
self
.
icon
=
QIcon
(
os
.
path
.
dirname
(
os
.
path
.
abspath
(
__file__
))
+
"
\\
UserInterfacesPandora
\\
pandora_tray.ico"
)
self
.
trayIcon
.
setIcon
(
self
.
icon
)
self
.
trayIcon
.
activated
.
connect
(
self
.
iconActivated
)
self
.
trayIconMenu
.
aboutToShow
.
connect
(
self
.
aboutToShow
)
except
Exception
,
e
:
exc_type
,
exc_obj
,
exc_tb
=
sys
.
exc_info
()
QMessageBox
.
critical
(
self
.
core
.
messageParent
,
"Unknown Error"
,
"createTray -
%
s -
%
s -
%
s"
%
(
str
(
e
),
exc_type
,
exc_tb
.
tb_lineno
))
def
iconActivated
(
self
,
reason
):
try
:
if
reason
in
(
QSystemTrayIcon
.
Trigger
,
QSystemTrayIcon
.
DoubleClick
):
self
.
startRenderHandler
()
except
Exception
,
e
:
exc_type
,
exc_obj
,
exc_tb
=
sys
.
exc_info
()
QMessageBox
.
critical
(
self
.
core
.
messageParent
,
"Unknown Error"
,
"iconActivated -
%
s -
%
s -
%
s"
%
(
str
(
e
),
exc_type
,
exc_tb
.
tb_lineno
))
def
aboutToShow
(
self
):
try
:
cData
=
{}
cData
[
"localMode"
]
=
[
"globals"
,
"localMode"
]
cData
[
"slave"
]
=
[
"slave"
,
"enabled"
]
cData
[
"coordinator"
]
=
[
"coordinator"
,
"enabled"
]
cData
=
self
.
core
.
getConfig
(
data
=
cData
)
if
self
.
core
.
getSubmissionEnabled
():
self
.
handlerAction
.
setVisible
(
True
)
if
cData
[
"localMode"
]
==
True
:
self
.
collectAction
.
setVisible
(
False
)
else
:
self
.
collectAction
.
setVisible
(
True
)
else
:
self
.
handlerAction
.
setVisible
(
False
)
self
.
collectAction
.
setVisible
(
False
)
if
cData
[
"slave"
]
==
True
:
# slaveProc = []
# for x in psutil.pids():
# try:
# if os.path.basename(psutil.Process(x).exe()) == "PandoraSlave.exe":
# slaveProc.append(x)
# except:
# pass
# slaveRunning = len(slaveProc) > 0
self
.
slaveAction
.
setVisible
(
True
)
self
.
slaveStopAction
.
setVisible
(
True
)
else
:
self
.
slaveAction
.
setVisible
(
False
)
self
.
slaveStopAction
.
setVisible
(
False
)
if
cData
[
"coordinator"
]
==
True
:
# coordProc = []
# for x in psutil.pids():
# try:
# if os.path.basename(psutil.Process(x).exe()) == "PandoraCoordinator.exe":
# coordProc.append(x)
# except:
# pass
# coordRunning = len(coordProc) > 0
self
.
coordAction
.
setVisible
(
True
)
self
.
coordStopAction
.
setVisible
(
True
)
else
:
self
.
coordAction
.
setVisible
(
False
)
self
.
coordStopAction
.
setVisible
(
False
)
except
Exception
,
e
:
exc_type
,
exc_obj
,
exc_tb
=
sys
.
exc_info
()
QMessageBox
.
critical
(
self
.
core
.
messageParent
,
"Unknown Error"
,
"iconAboutToShow -
%
s -
%
s -
%
s"
%
(
str
(
e
),
exc_type
,
exc_tb
.
tb_lineno
))
def
startRenderHandler
(
self
):
handlerIcon
=
QIcon
(
os
.
path
.
dirname
(
os
.
path
.
abspath
(
__file__
))
+
"
\\
UserInterfacesPandora
\\
rh_tray.ico"
)
qApp
.
setWindowIcon
(
handlerIcon
)
self
.
core
.
openRenderHandler
()
return
# the following code starts the RenderHandler in a new process, but is a lot slower
try
:
handlerPath
=
os
.
path
.
join
(
pandoraRoot
,
"Scripts"
,
"PandoraRenderHandler.py"
)
pythonPath
=
os
.
path
.
join
(
pandoraRoot
,
"Python27"
,
"PandoraRenderHandler.exe"
)
for
i
in
[
handlerPath
,
pythonPath
]:
if
not
os
.
path
.
exists
(
i
):
QMessageBox
.
warning
(
self
.
core
.
messageParent
,
"Script missing"
,
"
%
s does not exist."
%
os
.
path
.
basename
(
i
))
return
None
command
=
[
'
%
s'
%
pythonPath
,
'
%
s'
%
handlerPath
]
self
.
handlerProc
=
subprocess
.
Popen
(
command
)
PROCNAME
=
'PandoraRenderHandler.exe'
for
proc
in
psutil
.
process_iter
():
if
proc
.
name
()
==
PROCNAME
:
if
proc
.
pid
==
self
.
handlerProc
.
pid
:
continue
p
=
psutil
.
Process
(
proc
.
pid
)
if
not
'SYSTEM'
in
p
.
username
():
proc
.
kill
()
except
Exception
,
e
:
exc_type
,
exc_obj
,
exc_tb
=
sys
.
exc_info
()
QMessageBox
.
critical
(
self
.
core
.
messageParent
,
"Unknown Error"
,
"startRenderHandler -
%
s -
%
s -
%
s"
%
(
str
(
e
),
exc_type
,
exc_tb
.
tb_lineno
))
def
collectRenderings
(
self
):
try
:
cData
=
{}
cData
[
"localMode"
]
=
[
"globals"
,
"localMode"
]
cData
[
"rootPath"
]
=
[
"globals"
,
"rootPath"
]
cData
[
"submissionPath"
]
=
[
"submissions"
,
"submissionPath"
]
cData
=
self
.
core
.
getConfig
(
data
=
cData
)
if
cData
[
"localMode"
]
==
True
:
psPath
=
os
.
path
.
join
(
cData
[
"rootPath"
],
"Workstations"
,
"WS_"
+
socket
.
gethostname
())
else
:
psPath
=
cData
[
"submissionPath"
]
if
psPath
is
None
or
not
os
.
path
.
exists
(
psPath
):
QMessageBox
.
warning
(
self
.
core
.
messageParent
,
"Directory missing"
,
"Pandora submission directory doesn't exist."
)
return
None
outputDir
=
os
.
path
.
join
(
psPath
,
"RenderOutput"
)
if
not
os
.
path
.
exists
(
outputDir
):
QMessageBox
.
warning
(
self
.
core
.
messageParent
,
"Directory missing"
,
"Pandora renderoutput directory doesn't exist."
)
return
None
result
=
{}
for
i
in
os
.
walk
(
outputDir
):
for
prj
in
i
[
1
]:
for
k
in
os
.
walk
(
os
.
path
.
join
(
i
[
0
],
prj
)):
for
job
in
k
[
1
]:
jobDir
=
os
.
path
.
join
(
k
[
0
],
job
)
confPath
=
os
.
path
.
join
(
k
[
0
],
job
,
"PandoraJob.json"
)
if
not
os
.
path
.
exists
(
confPath
):
QMessageBox
.
warning
(
self
.
core
.
messageParent
,
"Config missing"
,
"Job config doesn't exist. (
%
s)"
%
job
)
continue
outputCount
=
0
for
i
in
os
.
walk
(
jobDir
):
outputCount
+=
len
(
i
[
2
])
outPath
=
self
.
core
.
getConfig
(
"information"
,
"outputPath"
,
configPath
=
confPath
)
if
outPath
is
None
:
QMessageBox
.
warning
(
self
.
core
.
messageParent
,
"information missing"
,
"No outputpath is defined in job config. (
%
s)"
%
job
)
continue
targetBase
=
os
.
path
.
dirname
(
os
.
path
.
dirname
(
outPath
))
waitmsg
=
QMessageBox
(
QMessageBox
.
NoIcon
,
"Pandora - Collect Renderings"
,
"Collecting renderings -
%
s - please wait.."
%
job
,
QMessageBox
.
Cancel
)
waitmsg
.
setWindowIcon
(
self
.
core
.
messageParent
.
windowIcon
())
waitmsg
.
buttons
()[
0
]
.
setHidden
(
True
)
waitmsg
.
show
()
QCoreApplication
.
processEvents
()
copiedNum
=
0
errors
=
0
for
o
in
os
.
walk
(
jobDir
):
for
m
in
o
[
2
]:
if
m
==
"PandoraJob.json"
:
continue
filePath
=
os
.
path
.
join
(
o
[
0
],
m
)
relFilePath
=
filePath
.
replace
(
jobDir
,
""
)
while
relFilePath
.
startswith
(
"
\\
"
)
or
relFilePath
.
startswith
(
"/"
):
relFilePath
=
relFilePath
[
1
:]
targetPath
=
os
.
path
.
join
(
targetBase
,
relFilePath
)
copyFile
=
True
if
os
.
path
.
exists
(
targetPath
):
curFileDate
=
int
(
os
.
path
.
getmtime
(
os
.
path
.
abspath
(
filePath
)))
targetFileDate
=
int
(
os
.
path
.
getmtime
(
targetPath
))
if
curFileDate
<=
targetFileDate
:
copyFile
=
False
if
copyFile
:
folderExists
=
True
if
not
os
.
path
.
exists
(
os
.
path
.
dirname
(
targetPath
)):
try
:
os
.
makedirs
(
os
.
path
.
dirname
(
targetPath
))
except
:
errors
+=
1
folderExists
=
False
if
folderExists
:
try
:
shutil
.
copy2
(
filePath
,
targetPath
)
copiedNum
+=
1
except
:
errors
+=
1
result
[
"
%
s -
%
s"
%
(
prj
,
job
)]
=
[
copiedNum
,
errors
]
completeCount
=
self
.
core
.
getConfig
(
"information"
,
"outputFileCount"
,
configPath
=
confPath
)
if
completeCount
is
not
None
:
if
outputCount
==
completeCount
:
try
:
shutil
.
rmtree
(
jobDir
)
except
:
pass
if
"waitmsg"
in
locals
()
and
waitmsg
.
isVisible
():
waitmsg
.
close
()
break
break
resStr
=
""
for
i
in
result
:
if
result
[
i
][
0
]
==
0
and
result
[
i
][
1
]
==
0
:
continue
resStr
+=
"
%
s:
\n
"
%
i
if
result
[
i
][
0
]
>
0
:
resStr
+=
"
%
s files copied
\n
"
%
result
[
i
][
0
]
if
result
[
i
][
1
]
>
0
:
resStr
+=
"
%
s errors
\n
"
%
result
[
i
][
1
]
resStr
+=
"
\n
"
if
resStr
==
""
:
resStr
=
"No renderings to copy"
QMessageBox
.
information
(
self
.
core
.
messageParent
,
"Collect renderings"
,
resStr
)
except
Exception
,
e
:
exc_type
,
exc_obj
,
exc_tb
=
sys
.
exc_info
()
QMessageBox
.
critical
(
self
.
core
.
messageParent
,
"Unknown Error"
,
"collectRenderings -
%
s -
%
s -
%
s"
%
(
str
(
e
),
exc_type
,
exc_tb
.
tb_lineno
))
def
openSettings
(
self
):
handlerIcon
=
QIcon
(
os
.
path
.
join
(
pandoraRoot
,
"Scripts"
,
"UserInterfacesPandora"
,
"pandora_tray.ico"
))
qApp
.
setWindowIcon
(
handlerIcon
)
self
.
core
.
openSettings
()
return
# the following code starts the Settings in a new process, but is a lot slower
try
:
settingsPath
=
os
.
path
.
join
(
pandoraRoot
,
"Scripts"
,
"PandoraSettings.py"
)
pythonPath
=
os
.
path
.
join
(
pandoraRoot
,
"Python27"
,
"PandoraSettings.exe"
)
for
i
in
[
settingsPath
,
pythonPath
]:
if
not
os
.
path
.
exists
(
i
):
QMessageBox
.
warning
(
self
.
core
.
messageParent
,
"Script missing"
,
"
%
s does not exist."
%
os
.
path
.
basename
(
i
))
return
None
command
=
[
'
%
s'
%
pythonPath
,
'
%
s'
%
settingsPath
]
self
.
settingsProc
=
subprocess
.
Popen
(
command
)
PROCNAME
=
'PandoraSettings.exe'
for
proc
in
psutil
.
process_iter
():
if
proc
.
name
()
==
PROCNAME
:
if
proc
.
pid
==
self
.
settingsProc
.
pid
:
continue
p
=
psutil
.
Process
(
proc
.
pid
)
if
not
'SYSTEM'
in
p
.
username
():
proc
.
kill
()
except
Exception
,
e
:
exc_type
,
exc_obj
,
exc_tb
=
sys
.
exc_info
()
QMessageBox
.
critical
(
self
.
core
.
messageParent
,
"Unknown Error"
,
"openSettings -
%
s -
%
s -
%
s"
%
(
str
(
e
),
exc_type
,
exc_tb
.
tb_lineno
))
def
exitTray
(
self
):
qApp
.
quit
()
if
__name__
==
"__main__"
:
qApp
=
QApplication
(
sys
.
argv
)
qApp
.
setQuitOnLastWindowClosed
(
False
)
qApp
.
setStyleSheet
(
qdarkstyle
.
load_stylesheet
(
pyside
=
True
))
if
not
QSystemTrayIcon
.
isSystemTrayAvailable
():
QMessageBox
.
critical
(
None
,
"PandoraTray"
,
"Could not launch PandoraTray."
)
sys
.
exit
(
1
)
isSilent
=
sys
.
argv
[
-
1
]
==
"silent"
import
PandoraCore
pc
=
PandoraCore
.
PandoraCore
()
pc
.
startTray
(
silent
=
isSilent
)
sys
.
exit
(
qApp
.
exec_
())
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment