Blender-Pipeline/studio/studio_asset_selectLayer.py
2023-12-19 21:20:58 +02:00

429 lines
14 KiB
Python

# THIS FILE IS A PART OF VCStudio
# PYTHON 3
# This a console project manager.
import os
import time
# 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 settings import fileformats
from project_manager import pm_project
#UI modules
from UI import UI_elements
from UI import UI_color
# story
from studio import story
from studio import analytics
from studio import history
def layer(win, call):
# 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, "dark_overdrop")
layer.rectangle(
0,
0,
win.current["w"],
win.current["h"],
)
layer.fill()
UI_color.set(layer, win, "node_background")
UI_elements.roundrect(layer, win,
80,
80,
win.current["w"]-160,
win.current["h"]-160,
10)
############################################################################
# Before we start anything. I would like to refresh the cash of the assets.
# so I would have the most up to date list / fractions of each item.
# In the studio/story.py there is the get_asset_data() functions. Which if
# you look closly just loads fraction into a dictionary called win.assets
# from which we can read directly.
# The function is designed to give load the fraction ones and then just give
# you one from the RAM. So it's not always going to read the asset.progress
# files which is not too good. Since I want to have a good idea about the
# asset's actuall fraction.
# One way I can force it to update is by using the force argument. But doing
# it on every frame defeats the purpose of the function entirelly. So here
# what I'm going to do. Each time I close this window. AKA return anything
# I am also going to wipe the dictionary win.asset clean. It will take one
# frame of potential lag to load everything back ( at least the stuff that's
# ont the screen in a given moment.
# Also to make sure that this dialog has the up to date info. I will do it
# as well in the studio_dialogs.py when initilizing this function. So yeah.
# Let's continue with the program.
############################################################################
####### TOP PANEL #######
for num, cur in enumerate(["chr","veh","loc","obj"]):
if win.current["asset_cur"] == cur:
UI_color.set(layer, win, "progress_time")
UI_elements.roundrect(layer, win,
100+(40*num),
100,
40,
40,
10)
def do():
win.current["asset_cur"] = cur
UI_elements.roundrect(layer, win,
100+(40*num),
100,
40,
40,
10,
do,
cur,
tip=talk.text(cur))
# In case the user is confused
UI_color.set(layer, win, "text_normal")
layer.set_font_size(30)
layer.move_to(300,130)
layer.show_text(talk.text(win.current["asset_cur"]))
# Search
UI_elements.image(layer, win, "settings/themes/"\
+win.settings["Theme"]+"/icons/search.png",
win.current["w"]-440,
100,
40,
40)
UI_elements.text(layer, win, "asset_select_search",
win.current["w"]-400,
100,
250,
40)
# CANCEl
def do():
win.current["calls"][call]["var"] = False
win.assets = {}
UI_elements.roundrect(layer, win,
win.current["w"]-120,
win.current["h"]-120,
40,
40,
10,
button=do,
icon="cancel",
tip=talk.text("cancel"))
# Short cut ESC
if 65307 in win.current["keys"] and not win.textactive:
do()
# Now let's prepare the ground for the next part.
UI_elements.roundrect(layer, win,
100,
150,
win.current["w"]-200,
win.current["h"]-250,
10,
fill=False)
layer.clip()
tileX = 120
current_Y = 50
if "asset_select" not in win.scroll:
win.scroll["asset_select"] = 0
newcreate = win.text["asset_select_search"]["text"].replace("/","_").replace(" ", "_")\
.replace('"',"_").replace("(","_").replace(")","_").replace("'","_")\
.replace("[","_").replace("]","_").replace("{","_").replace("}","_")
###########################
okay = True
for asset in os.listdir(win.project+"/dev/"+win.current["asset_cur"]):
if os.path.isdir(win.project+"/dev/"+win.current["asset_cur"]+"/"+asset):
okay = True
# Search
if win.text["asset_select_search"]["text"]\
and newcreate.lower() not in asset.lower():
okay = False
if okay:
if int(current_Y + win.scroll["asset_select"] + 100) in range(0-100, win.current["h"]):
# Making the layer
nodesurface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 170, 200)
node = cairo.Context(nodesurface)
node.select_font_face("Monospace", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
UI_elements.roundrect(node, win,
0,
0,
170,
200,
10,
fill=False)
node.clip()
# Background
UI_color.set(node, win, "dark_overdrop")
node.rectangle(0,0,170, 200)
node.fill()
# Banner
UI_color.set(node, win, "node_asset")
node.rectangle(0,0,170, 20)
node.fill()
# Outputting the layer
layer.set_source_surface(nodesurface,
tileX-10,
current_Y + win.scroll["asset_select"] + 120)
layer.paint()
# Previes image
if os.path.exists(win.project+"/dev/"+win.current["asset_cur"]+"/"+asset+"/renders/Preview.png"):
UI_elements.image(layer, win, win.project+"/dev/"+win.current["asset_cur"]+"/"+asset+"/renders/Preview.png",
tileX,
current_Y + win.scroll["asset_select"] + 140,
150,
150)
elif os.path.exists(win.project+"/dev/"+win.current["asset_cur"]+"/"+asset+"/renders/Preview.jpg"):
UI_elements.image(layer, win, win.project+"/dev/"+win.current["asset_cur"]+"/"+asset+"/renders/Preview.jpg",
tileX,
current_Y + win.scroll["asset_select"] + 140,
150,
150)
else:
UI_elements.image(layer, win, "settings/themes/"+win.settings["Theme"]+"/icons/"+win.current["asset_cur"]+".png",
tileX+55,
current_Y + win.scroll["asset_select"] + 150+55,
150,
150)
# Progress bar
fraction = story.get_asset_data(win, win.current["asset_cur"]+"/"+asset)["fraction"]
UI_color.set(layer, win, "progress_background")
UI_elements.roundrect(layer, win,
tileX,
current_Y + win.scroll["asset_select"] + 300,
150,
0,
5)
UI_color.set(layer, win, "progress_active")
UI_elements.roundrect(layer, win,
tileX,
current_Y + win.scroll["asset_select"] + 300,
150*fraction,
0,
5)
UI_color.set(layer, win, "text_normal")
layer.set_font_size(12)
layer.move_to(tileX,
current_Y + win.scroll["asset_select"] + 135)
layer.show_text(asset[asset.rfind("/")+1:][:22])
# Button to activate it
def do():
print("test")
win.current["calls"][call]["var"] = "/"+win.current["asset_cur"]+"/"+asset
win.assets = {}
layer.set_line_width(4)
UI_elements.roundrect(layer, win,
tileX-10,
current_Y + win.scroll["asset_select"] + 120,
170,
200,
10,
button=do,
tip=talk.text(win.current["asset_cur"])+": "+asset,
fill=False,
clip=[
100,
150,
win.current["w"]-200,
win.current["h"]-250
])
layer.stroke()
layer.set_line_width(2)
tileX += 200
if tileX > win.current["w"]-270:
tileX = 120
current_Y += 230
if win.text["asset_select_search"]["text"]\
and newcreate\
not in os.listdir(win.project+"/dev/"+win.current["asset_cur"])\
and newcreate not in "chr veh loc obj": #Avoiding potential mistakes
# If there is a seach and there is no asset with the search name. It
# will ask if you want to create such an asset.
def do():
# I don't thing I need to write a whole module for creating a couple
# of folders.
try:
os.mkdir(win.project+"/dev/"+win.current["asset_cur"]+"/"+newcreate)
os.mkdir(win.project+"/dev/"+win.current["asset_cur"]+"/"+newcreate+"/renders")
os.mkdir(win.project+"/dev/"+win.current["asset_cur"]+"/"+newcreate+"/reference")
os.mkdir(win.project+"/dev/"+win.current["asset_cur"]+"/"+newcreate+"/tex")
# Recodring to history
history.record(win, win.project+"/dev/"+win.current["asset_cur"]+"/"+newcreate, "[Added Asset]")
except:
pass
# There is a problem that was introduced with the multiuser.
# Basically. The other user whould need to create this asset too. And it's
# not cool. I want to the experience to be seamless. Or at least somewhat seamless.
# So I'm going to enter the cur of the asset for a fraction of a second. And then
# come back to what ever we were doing.
tmp = win.cur
win.cur = win.current["asset_cur"]
time.sleep(0.1) # This should be plenty
win.cur = tmp
win.text["asset_select_search"]["text"] = ""
win.current["calls"][call]["var"] = "/"+win.current["asset_cur"]+"/"+newcreate
win.assets = {}
# Refrashing analytics
win.analytics = analytics.load(win.project)
analytics.save(win.project, win.analytics)
UI_elements.roundrect(layer, win,
tileX-10,
current_Y + win.scroll["asset_select"] + 120,
170,
200,
10,
button=do,
tip=talk.text("create_new_asset")+" "+newcreate)
UI_color.set(layer, win, "progress_background")
UI_elements.roundrect(layer, win,
tileX-10,
current_Y + win.scroll["asset_select"] + 120,
170,
200,
10,
fill=False)
layer.stroke()
UI_elements.image(layer, win,
"settings/themes/"+win.settings["Theme"]+"/icons/asset_new.png",
tileX+55,
current_Y + win.scroll["asset_select"] + 200,
40, 40)
UI_color.set(layer, win, "text_normal")
layer.set_font_size(12)
layer.move_to(tileX+85-len(newcreate)*4,
current_Y + win.scroll["asset_select"] + 300)
layer.show_text(newcreate)
###########################
current_Y += 230
UI_elements.scroll_area(layer, win, "asset_select",
50,
100,
win.current["w"]-100,
win.current["h"]-200,
current_Y,
bar=True,
mmb=True,
url="asset_select",
strenght=130
)
return surface