Blender-Pipeline/studio/studio_file_selectLayer.py
Jeison Yehuda Amihud (Blender Dumbass) 914f4c5748 Updated the way it shows files
- Updated the sorting to be 1,2,3,4,5,6,7,8,9,10,11 instead of 1,10,11,2,3,4,5,6,7,8,9
- Made it so it doesn't show _backup files.
2023-06-26 19:34:44 +00:00

448 lines
14 KiB
Python

# THIS FILE IS A PART OF VCStudio
# PYTHON 3
# This a console project manager.
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 settings import fileformats
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 checklist
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,
40,
40,
win.current["w"]-80,
win.current["h"]-80,
10)
############################################################################
# This dialogue deals with file selection. This is not the only place where
# files are drawn. So don't rely on this dialog only.
# To make all the files drawn first off all I want to get all the files data
# and later to clean it. The problem is that it's running on every frame so
# some particular cleverness is required.
# I do want to clean after the dialog is closed so if a change in the files
# happened it could be loaded on the next loading of this window.
# On the other hand reading all the file dynamically would not be wise because
# of expected volume of those files. For things like textures folder in the
# assets it could be possible. But here it will look through the entire
# project. With all the renders of all of the shots from all of the scenes.
# Imagine a movie that is 2 hour long and it's a good 24 frames per second.
# Each of which has 4 versions saved in different folders. This is not the
# kind of data I would try to load dynamically. Unless you know a clever
# way to do so. Please tell me so if you do.
############################################################################
if "AllFiles" not in win.current:
win.current["AllFiles"] = []
for r, d, f in os.walk(win.project):
for item in f:
win.current["AllFiles"].append(os.path.join(r, item).replace(win.project, ""))
UI_math.sort_nicely(win.current["AllFiles"])
# Now that we have the files. There should be some way to filter them.
# I guess let's add a searchbox and buttons on the side for filtering.
if "file_selector" not in win.current:
win.current["file_selector"] = {
"image" :True,
"blender":False,
"video" :True,
"file" :False,
"chr" :True,
"veh" :True,
"loc" :True,
"obj" :True,
"vse" :False,
"folder" :False
}
############### TOP PANEL ###################
# Left Icons
for num, thing in enumerate(win.current["file_selector"]):
if num > 3:
num = num + 1
if win.current["file_selector"][thing]:
UI_color.set(layer, win, "progress_time")
UI_elements.roundrect(layer, win,
50+(40*num),
50,
40,
40,
10)
def do():
win.current["file_selector"][thing] = not win.current["file_selector"][thing]
UI_elements.roundrect(layer, win,
50+(40*num),
50,
40,
40,
10,
do,
thing)
# Search
UI_elements.image(layer, win, "settings/themes/"\
+win.settings["Theme"]+"/icons/search.png",
win.current["w"]-440,
50,
40,
40)
UI_elements.text(layer, win, "file_select_search",
win.current["w"]-400,
50,
350,
40)
##### BOTTOM BUTTONS ####
def do():
filechooser = Gtk.FileChooserDialog(talk.text("select_file"),
None,
Gtk.FileChooserAction.OPEN,
(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
filechooser.set_default_response(Gtk.ResponseType.OK)
response = filechooser.run()
if response == Gtk.ResponseType.OK:
get = filechooser.get_filename()
win.current["calls"][call]["var"] = get
del win.current["AllFiles"]
filechooser.destroy()
UI_elements.roundrect(layer, win,
win.current["w"]-120,
win.current["h"]-80,
40,
40,
10,
button=do,
icon="folder",
tip=talk.text("outside_folder"))
def do():
win.current["calls"][call]["var"] = False
del win.current["AllFiles"]
UI_elements.roundrect(layer, win,
win.current["w"]-80,
win.current["h"]-80,
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,
50,
100,
win.current["w"]-100,
win.current["h"]-200,
10,
fill=False)
layer.clip()
### ACTUALL FILES LIST ###
tileX = 70
current_Y = 0
if "file_select" not in win.scroll:
win.scroll["file_select"] = 0
if "AllFiles" in win.current:
for filename in reversed(win.current["AllFiles"]):
######################## FILTERING STARTS ##########################
okay = True
# Remove all _backup files
if "_backup" in filename:
okay = False
# By search
for stuff in win.text["file_select_search"]["text"].split(" "):
if stuff:
if stuff.lower() not in filename.lower():
okay = False
# By folder
folderfound = False
if okay and "chr/" in filename:
folderfound = True
if not win.current["file_selector"]["chr"]:
okay = False
if okay and "veh/" in filename:
folderfound = True
if not win.current["file_selector"]["veh"]:
okay = False
if okay and "loc/" in filename:
folderfound = True
if not win.current["file_selector"]["loc"]:
okay = False
if okay and "obj/" in filename:
folderfound = True
if not win.current["file_selector"]["obj"]:
okay = False
if okay and "rnd/" in filename:
folderfound = True
if not win.current["file_selector"]["vse"]:
okay = False
if okay and not folderfound:
if not win.current["file_selector"]["folder"]:
okay = False
# By filetype
typefound = False
if okay:
# Images
for f in fileformats.images:
if filename.endswith(f):
typefound = True
thecoloris = "node_imagefile"
if not win.current["file_selector"]["image"]:
okay = False
break
if okay:
# Videos
for f in fileformats.videos:
if filename.endswith(f):
typefound = True
thecoloris = "node_videofile"
if not win.current["file_selector"]["video"]:
okay = False
break
if okay:
# Blend Files
if filename.endswith(".blend"):
typefound = True
thecoloris = "node_blendfile"
if "ast/" in filename:
thecoloris = "node_asset"
if not win.current["file_selector"]["blender"]:
okay = False
if okay:
if typefound == False:
thecoloris = "node_script"
if not win.current["file_selector"]["file"]:
okay = False
######################### FILTERING END ############################
if okay:
if int(current_Y + win.scroll["file_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, thecoloris)
node.rectangle(0,0,170, 20)
node.fill()
# Outputting the layer
layer.set_source_surface(nodesurface,
tileX-10,
current_Y + win.scroll["file_select"] + 120)
layer.paint()
UI_elements.image(layer, win, win.project+filename,
tileX,
current_Y + win.scroll["file_select"] + 150,
150,
150)
# If this is a checklist
if filename.endswith(".progress"):
fraction = checklist.get_fraction(win, filename)
UI_color.set(layer, win, "progress_background")
UI_elements.roundrect(layer, win,
tileX,
current_Y + win.scroll["file_select"] + 300,
150,
0,
5)
UI_color.set(layer, win, "progress_active")
UI_elements.roundrect(layer, win,
tileX,
current_Y + win.scroll["file_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["file_select"] + 135)
layer.show_text(filename[filename.rfind("/")+1:][:22])
# Button to activate it
def do():
win.current["calls"][call]["var"] = filename
layer.set_line_width(4)
UI_elements.roundrect(layer, win,
tileX-10,
current_Y + win.scroll["file_select"] + 120,
170,
200,
10,
button=do,
tip=filename,
fill=False,
clip=[
50,
100,
win.current["w"]-100,
win.current["h"]-200
])
layer.stroke()
layer.set_line_width(2)
tileX += 200
if tileX > win.current["w"]-220:
tileX = 70
current_Y += 230
current_Y += 230
UI_elements.scroll_area(layer, win, "file_select",
50,
100,
win.current["w"]-100,
win.current["h"]-200,
current_Y,
bar=True,
mmb=True,
url="file_select",
strenght=130
)
return surface