401 lines
12 KiB
Python
401 lines
12 KiB
Python
# THIS FILE IS A PART OF VCStudio
|
|
# PYTHON 3
|
|
|
|
import os
|
|
import datetime
|
|
import json
|
|
from subprocess import *
|
|
|
|
# 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 settings import oscalls
|
|
from project_manager import pm_project
|
|
|
|
#UI modules
|
|
from UI import UI_elements
|
|
from UI import UI_color
|
|
from UI import UI_math
|
|
|
|
# Studio
|
|
from studio import studio_dialogs
|
|
from studio import analytics
|
|
from studio import story
|
|
|
|
def layer(win, call):
|
|
|
|
##########################################################################
|
|
|
|
# This file will select a VSE blend file. And create ones when needed.
|
|
# I'm making it as a dialog (see: studio/studio_dialogs.py ) because I
|
|
# want to be able to use this UI in various places in VCStudio.
|
|
|
|
# The launching of the file will be done by a host Layer.
|
|
|
|
##########################################################################
|
|
|
|
|
|
# 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,
|
|
win.current["w"]/2-250,
|
|
100,
|
|
500,
|
|
win.current["h"]-200,
|
|
10)
|
|
|
|
|
|
# Remote server download button
|
|
|
|
if win.analytics["from-remote-server"]:
|
|
|
|
if "remote-folder-data" not in win.current:
|
|
win.current["remote-folder-data"] = {}
|
|
|
|
if win.cur not in win.current["remote-folder-data"]:
|
|
win.current["remote-folder-data"][win.cur] = {"missing":{},
|
|
"changed":{}}
|
|
|
|
def do():
|
|
|
|
def after(win, var):
|
|
UI_elements.reload_images(win)
|
|
win.current["remote-folder-data"]["prompt"] = "vse"
|
|
studio_dialogs.http_client_update_prompt(win, "http-client-prompt", after)
|
|
|
|
|
|
UI_elements.roundrect(layer, win,
|
|
win.current["w"]/2+210-50,
|
|
win.current["h"]-140,
|
|
40,
|
|
40,
|
|
10,
|
|
do,
|
|
"download",
|
|
tip=talk.text("RemoteAssetUpdates"))
|
|
|
|
if win.current["remote-folder-data"]["vse"]["missing"] or win.current["remote-folder-data"]["vse"]["changed"]:
|
|
count = str(len(win.current["remote-folder-data"]["vse"]["missing"])+len(win.current["remote-folder-data"]["vse"]["changed"]))
|
|
UI_color.set(layer, win, "progress_active")
|
|
UI_elements.roundrect(layer, win,
|
|
win.current["w"]/2+210-50+25,
|
|
win.current["h"]-140,
|
|
len(count)*12+6,
|
|
25,
|
|
5)
|
|
layer.fill()
|
|
UI_color.set(layer, win, "text_normal")
|
|
layer.set_font_size(20)
|
|
layer.move_to(win.current["w"]/2+210-50+28,
|
|
win.current["h"]-140+20,)
|
|
layer.show_text(count)
|
|
|
|
|
|
# Exit button
|
|
def do():
|
|
win.current["calls"][call]["var"] = False
|
|
|
|
|
|
UI_elements.roundrect(layer, win,
|
|
win.current["w"]/2+210,
|
|
win.current["h"]-140,
|
|
40,
|
|
40,
|
|
10,
|
|
button=do,
|
|
icon="cancel",
|
|
tip=talk.text("cancel"))
|
|
|
|
|
|
x = win.current["w"]/2-250 + 10
|
|
y = 170
|
|
width = 500 - 20
|
|
height = win.current["h"]-270
|
|
|
|
# Search
|
|
|
|
UI_elements.image(layer, win, "settings/themes/"\
|
|
+win.settings["Theme"]+"/icons/search.png",
|
|
x+width/4,
|
|
y-50,
|
|
40,
|
|
40)
|
|
|
|
UI_elements.text(layer, win, "in_vses",
|
|
x+width/4+50,
|
|
y-50,
|
|
width/2-50,
|
|
40)
|
|
|
|
# Clip
|
|
|
|
UI_elements.roundrect(layer, win,
|
|
x,
|
|
y,
|
|
width,
|
|
height-60,
|
|
10,
|
|
fill=False)
|
|
layer.clip()
|
|
|
|
clip = [
|
|
x,
|
|
y,
|
|
width,
|
|
height-60]
|
|
|
|
# Little testing thing. Make it True to see where it's clipping.
|
|
if False:
|
|
# Background
|
|
UI_color.set(layer, win, "dark_overdrop")
|
|
layer.rectangle(x,y,width, height)
|
|
layer.fill()
|
|
|
|
|
|
# Setting up the scroll
|
|
if "vse" not in win.scroll:
|
|
win.scroll["vse"] = 0
|
|
|
|
current_Y = 0
|
|
|
|
# There is not going to be any launch buttons. Basically you click on a
|
|
# file in the list and it's launched. ( Or out_putted into parent function )
|
|
# And since the contents of those blend files are not model based. Let's not
|
|
# draw tiles of squares, but rather a simple list would be fine.
|
|
|
|
# I think something like
|
|
|
|
#####################################################
|
|
# #
|
|
# [____SEARCH____] #
|
|
# #
|
|
# [] NAME_OF_FILE.BLEND #
|
|
# [] NAME_OF_FILE.BLEND #
|
|
# [] NAME_OF_FILE.BLEND #
|
|
# [] NAME_OF_FILE.BLEND #
|
|
# [] NAME_OF_FILE.BLEND #
|
|
# [] NAME_OF_FILE.BLEND #
|
|
# [] NAME_OF_FILE.BLEND #
|
|
# [] NAME_OF_FILE.BLEND #
|
|
# #
|
|
# #
|
|
# #
|
|
# #
|
|
# #
|
|
# #
|
|
# #
|
|
# #
|
|
# #
|
|
# X #
|
|
#####################################################
|
|
|
|
# Of course It's going to look better in the end. I'm not great with ASCII
|
|
# art. And of course to add a blend file you will look for it in a search
|
|
# and it will give you to make one or copy one. Like usual.
|
|
|
|
blends = []
|
|
for blend in os.listdir(win.project+"/rnd"):
|
|
if blend.endswith(".blend"):
|
|
blends.append(blend)
|
|
|
|
# I just did this because there could not be a file to begin with. And I
|
|
# want to make one if such doesn't exists.
|
|
|
|
if not blends:
|
|
newname = "sequence.blend"
|
|
|
|
oscalls.copy_file(
|
|
win,
|
|
os.getcwd()+"/new_file/seq.blend",
|
|
"/rnd/",
|
|
newname)
|
|
|
|
# Okay since now we have our file let's list them. Or it. Yeah.
|
|
|
|
newcreate = win.text["in_vses"]["text"].replace("/","_").replace(" ", "_")\
|
|
.replace('"',"_").replace("(","_").replace(")","_").replace("'","_")\
|
|
.replace("[","_").replace("]","_").replace("{","_").replace("}","_")
|
|
|
|
for blend in blends:
|
|
|
|
# Search
|
|
if newcreate and newcreate.lower() not in blend.lower():
|
|
continue
|
|
|
|
# LAUNCH BUTTON
|
|
def do():
|
|
win.current["calls"][call]["var"] = "/rnd/"+blend
|
|
|
|
UI_elements.roundrect(layer, win,
|
|
x,
|
|
y+current_Y + win.scroll["vse"],
|
|
width,
|
|
40,
|
|
10,
|
|
button=do)
|
|
|
|
# ICON
|
|
UI_elements.image(layer, win, "settings/themes/"\
|
|
+win.settings["Theme"]+"/icons/vse.png",
|
|
x+5,
|
|
y+current_Y + win.scroll["vse"],
|
|
40,
|
|
40)
|
|
|
|
# NAME
|
|
UI_color.set(layer, win, "text_normal")
|
|
layer.set_font_size(20)
|
|
layer.move_to(x+50,
|
|
y+current_Y + win.scroll["vse"]+30)
|
|
layer.show_text(blend)
|
|
|
|
current_Y = current_Y + 50
|
|
|
|
# Now let's make the 2 adding buttons and to hell with it.
|
|
|
|
if newcreate and newcreate not in blends:
|
|
|
|
if not newcreate.endswith(".blend"):
|
|
newcreate = newcreate + ".blend"
|
|
|
|
# NEW FILE
|
|
|
|
def do():
|
|
oscalls.copy_file(
|
|
win,
|
|
os.getcwd()+"/new_file/seq.blend",
|
|
"/rnd/",
|
|
newcreate)
|
|
win.text["in_vses"]["text"] = ""
|
|
|
|
UI_elements.roundrect(layer, win,
|
|
x,
|
|
y+current_Y + win.scroll["vse"],
|
|
width,
|
|
40,
|
|
10,
|
|
button=do)
|
|
|
|
UI_color.set(layer, win, "progress_background")
|
|
UI_elements.roundrect(layer, win,
|
|
x,
|
|
y+current_Y + win.scroll["vse"],
|
|
width,
|
|
40,
|
|
10,
|
|
fill=False)
|
|
layer.stroke()
|
|
|
|
# ICON
|
|
UI_elements.image(layer, win, "settings/themes/"\
|
|
+win.settings["Theme"]+"/icons/new_file.png",
|
|
x+5,
|
|
y+current_Y + win.scroll["vse"],
|
|
40,
|
|
40)
|
|
|
|
# NAME
|
|
UI_color.set(layer, win, "text_normal")
|
|
layer.set_font_size(20)
|
|
layer.move_to(x+50,
|
|
y+current_Y + win.scroll["vse"]+30)
|
|
layer.show_text(newcreate)
|
|
|
|
current_Y = current_Y + 50
|
|
|
|
|
|
# COPY FILE
|
|
|
|
def do():
|
|
def after(win, var):
|
|
if var and var.endswith(".blend"):
|
|
oscalls.copy_file(
|
|
win,
|
|
var,
|
|
"/rnd/",
|
|
newcreate)
|
|
win.text["in_vses"]["text"] = ""
|
|
|
|
studio_dialogs.file_select(win, "seq_blends", after, force=True,
|
|
IMAGE=False, BLEND=True, VIDEO=False, FILE=False, CHR=False, VEH=False,
|
|
LOC=False, OBJ=False, RND=True, FOLDER=False)
|
|
|
|
UI_elements.roundrect(layer, win,
|
|
x,
|
|
y+current_Y + win.scroll["vse"],
|
|
width,
|
|
40,
|
|
10,
|
|
button=do)
|
|
|
|
UI_color.set(layer, win, "progress_background")
|
|
UI_elements.roundrect(layer, win,
|
|
x,
|
|
y+current_Y + win.scroll["vse"],
|
|
width,
|
|
40,
|
|
10,
|
|
fill=False)
|
|
layer.stroke()
|
|
|
|
# ICON
|
|
UI_elements.image(layer, win, "settings/themes/"\
|
|
+win.settings["Theme"]+"/icons/copy_file.png",
|
|
x+5,
|
|
y+current_Y + win.scroll["vse"],
|
|
40,
|
|
40)
|
|
|
|
# NAME
|
|
UI_color.set(layer, win, "text_normal")
|
|
layer.set_font_size(20)
|
|
layer.move_to(x+50,
|
|
y+current_Y + win.scroll["vse"]+30)
|
|
layer.show_text(newcreate)
|
|
|
|
current_Y = current_Y + 50
|
|
|
|
|
|
###########################
|
|
|
|
UI_elements.scroll_area(layer, win, "vse",
|
|
x,
|
|
y,
|
|
width,
|
|
height-60,
|
|
current_Y,
|
|
bar=True,
|
|
mmb=True,
|
|
url="vse"
|
|
)
|
|
|
|
|
|
return surface
|