# 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