Blender-Pipeline/project_manager/pm_mainLayer.py

446 lines
11 KiB
Python

# THIS FILE IS A PART OF VCStudio
# PYTHON 3
import os
# GTK module ( Graphical interface
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import GLib
from gi.repository import Gdk
import cairo
# Own modules
from settings import settings
from settings import talk
from project_manager import pm_project
from studio import analytics
from studio import story
from studio import studio_gtk
from studio import studio_dialogs
#UI modules
from UI import UI_elements
from UI import UI_color
def layer(win):
# Making the layer
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, win.current['w'],
win.current['h'])
layer = cairo.Context(surface)
#text setting
layer.select_font_face("Monospace", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
UI_color.set(layer, win, "darker_parts")
UI_elements.roundrect(layer, win,
50,
5,
win.current["w"] - 55,
win.current["h"] - 30,
30)
# Little verion thing in the bottom corner
UI_color.set(layer, win, "testing_banner")
layer.set_font_size(15)
layer.move_to(win.current["w"]-80, win.current["h"] - 7)
layer.show_text(str(win.version))
# Side bar. First 3. New project / Search Projects / Configure Project.
# New Project
def do():
print("New Project")
win.url = "new_project"
UI_elements.roundrect(layer, win,
5,
5,
40,
40,
10,
do,
"new_file",
talk.text("createnewproject_tooltip"),
url="project_manager")
# Search for projects
def do():
win.url = "scan_projects"
UI_elements.roundrect(layer, win,
5,
55,
40,
40,
10,
do,
"search_file",
talk.text("scanforprojects_tooltip"),
url="project_manager")
# Configure
if win.current["project"] and pm_project.is_legacy(win.current["project"]):
def do():
print("configure")
#GLib.timeout_add(1, studio_gtk.run, win )
analytics.save(win.current["project"], win.projects[win.current["project"]])
story.save(win.current["project"], story.get_legacy(win.current["project"]))
# Makinf the set folder
try:
os.mkdir(win.current["project"]+"/set/")
except:
pass
# Copy the project.data to set
try:
f = open(win.current["project"]+"/project.progress")
t = open(win.current["project"]+"/set/project.progress", "w")
t.write(f.read())
t.close()
except:
pass
UI_elements.roundrect(layer, win,
5,
110,
40,
40,
10,
do,
"configure_file",
talk.text("convertoldproject_tooltip"),
url="project_manager")
# Side bar. Last 3. Internet things / Updater / Settings
# Internet things
def do():
# I used to have a specific UI instance for the help layer here. But
# it proved to be too hard to maintain. So I'm changing it to a different
# dialog. I'm not going to delete the help layer it self. For curious
# poeple.
# win.url = "help_layer"
# The following commands are the replacement. So if you want to see how
# it used to look. Comment those. So not to launch both in the same time.
def after(win, var):
pass
studio_dialogs.help(win, "help", after, SEARCH=talk.text("documentation_project_manager"))
UI_elements.roundrect(layer, win,
5,
win.current["h"]-95, #-150 ( Update removed )
40,
40,
10,
do,
"question",
talk.text("pm_internet_tooltip"),
url="project_manager")
# Update
#def do():
# win.url = "update_layer"
#
#UI_elements.roundrect(layer, win,
# 5,
# win.current["h"]-95,
# 40,
# 40,
# 10,
# do,
# "update",
# talk.text("Update"),
# url="project_manager")
# I gonna draw a little thingy for if a new update is available
try:
if win.update["count"]:
count = str(win.update["count"])
UI_color.set(layer, win, "node_background")
UI_elements.roundrect(layer, win,
30,
win.current["h"]-100,
len(count)*12+6,
25,
5)
layer.fill()
UI_color.set(layer, win, "text_normal")
layer.set_font_size(20)
layer.move_to(33,win.current["h"]-80)
layer.show_text(count)
except:
pass
# Settings
def do():
win.url = "settings_layer"
UI_elements.roundrect(layer, win,
5,
win.current["h"]-45,
40,
40,
10,
do,
"settings",
talk.text("Settings"),
url="project_manager")
# Now let's make previews of projects. I think each one will be it's own
# layer thingy. Just so I could draw things inside them.
# Clipping so it wont draw beyon the frame
UI_elements.roundrect(layer, win,
50,
5,
win.current["w"] - 55,
win.current["h"] - 30,
30,
fill=False)
layer.clip()
# Setting up scroll for Projects
if "pm_scroll" not in win.current:
win.current["pm_scroll"] = 0.0
# Setting up tilling
tileY = 0
tileX = 0
if "pm_main" not in win.scroll:
win.scroll["pm_main"] = 0
for num, project in enumerate(pm_project.get_list()):
if tileX > (win.current["w"]-55)-391:
tileY += 330
tileX = 0
project_node(layer, win, 60+tileX, 15+tileY+ win.scroll["pm_main"], project)
tileX += 360
UI_elements.scroll_area(layer, win, "pm_main",
50,
5,
win.current["w"] - 55,
win.current["h"] - 30,
tileY+340,
bar=True,
mmb=True,
url="project_manager"
)
return surface
def project_node(layer, win, x, y, project):
# This function will draw a project to a given place.
node_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, win.current['w'],
win.current['h'])
node = cairo.Context(node_surface)
node.select_font_face("Monospace", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
# Before we gonna do clip. Let's put here the logic of the node.
def do():
print(project)
win.current["project"] = project
Legacytip = ""
nameonly = project[project.rfind("/")+1:]
timefraction = 0.0
projectfraction = 0.0
if pm_project.is_legacy(project):
Legacytip = "\nLegacy (Blender-Organizer)"
# Getting info about the project. For now only Legacy. Since nothing is
# written for the new stuff.
try:
if project not in win.projects:
win.projects[project] = analytics.get_legacy(project)
nameonly = win.projects[project]["name"]
timefraction = win.projects[project]["timepassed"]
projectfraction = win.projects[project]["fraction"]
except:
pass
else:
try:
if project not in win.projects:
win.projects[project] = analytics.load(project)
nameonly = win.projects[project]["name"]
timefraction = win.projects[project]["timepassed"]
projectfraction = win.projects[project]["fraction"]
except:
pass
node.set_line_width(10)
UI_elements.roundrect(node, win,
x-5,
y-5,
350+10,
320+10,
20+5,
button=do,
fill=False,
tip=project+Legacytip,
url="project_manager")
node.stroke()
# If project is selected
if win.current["project"] == project and win.previous["project"] == project:
UI_color.set(node, win, "button_active")
UI_elements.roundrect(node, win,
x-5,
y-5,
350+10,
320+10,
20+5,
button=False,
fill=False
)
node.stroke()
def do():
pm_project.load(project, win)
#Gtk.main_quit() # Here I might do some kind a setting later
UI_elements.roundrect(node, win,
x-5,
y-5,
350+10,
320+10,
20+5,
button=do,
fill=False,
url="project_manager"
)
# Enter keys
if win.url == "project_manager":
if 65293 in win.current["keys"] or 65421 in win.current["keys"]:
do()
win.current["keys"].remove(65293)
win.current["keys"].remove(65421)
# This next roundrect will both be the backdrop of the node and both will
# clip the node content. All folowing graphics will be drawn clipped to the
# current roundrect.
UI_color.set(node, win, "node_background")
UI_elements.roundrect(node, win,
x,
y,
350,
320,
20)
# Clip
UI_elements.roundrect(node, win,
x,
y,
350,
320,
20,
fill=False)
node.clip()
if os.path.exists(project+"/set/banner.png"):
UI_elements.image(node, win, project+"/set/banner.png",
x,y,350,320)
elif os.path.exists(project+"/py_data/banner.png"):
UI_elements.image(node, win, project+"/py_data/banner.png",
x,y,350,320)
else:
UI_elements.image(node, win, "icon.png",
x,y,350,320)
# Top Banner thingy
if pm_project.is_legacy(project):
UI_color.set(node, win, "node_badfile")
else:
UI_color.set(node, win, "node_blendfile")
node.rectangle(x,y,350,40)
node.fill()
# Name of the project
UI_color.set(node, win, "text_normal")
node.set_font_size(20)
node.move_to(x+175-len(nameonly)*12/2,y+25)
node.show_text(nameonly)
# Bottom widget part
UI_color.set(node, win, "node_background")
node.rectangle(x,y+250,350,100)
node.fill()
# Finally the progress bar HELL YEAH. (I had to write 3 hard parsing
# algorythms only to read percentage from the project)
#Background
UI_color.set(node, win, "progress_background")
UI_elements.roundrect(node, win,
x+20,
y+280,
310,
10,
10)
#Time-passed
UI_color.set(node, win, "progress_time")
UI_elements.roundrect(node, win,
x+20,
y+280,
310*timefraction,
10,
10)
#Done
UI_color.set(node, win, "progress_active")
UI_elements.roundrect(node, win,
x+20,
y+280,
310*projectfraction,
10,
10)
# Drawing the Node on the main layer.
layer.set_source_surface(node_surface, 0,0)
layer.paint()