357 lines
9.8 KiB
Python
357 lines
9.8 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)
|
||
|
|
||
|
|
||
|
|
||
|
# 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
|