# THIS FILE IS A PART OF VCStudio # PYTHON 3 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 project_manager import pm_project from studio import analytics from studio import studio_nodes #UI modules from UI import UI_elements from UI import UI_color def layer(win): # 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, "darker_parts") UI_elements.roundrect(layer, win, 50, 50, win.current["w"] - 100, win.current["h"] - 80, 30) # Little verion thing in the bottom corner UI_color.set(layer, win, "testing_banner") layer.set_font_size(15) layer.move_to(win.current["w"]-80, win.current["h"] - 7) layer.show_text(str(win.version)) # Hude analytics button on the top def do(): print("Analytics") UI_elements.roundrect(layer, win, 5, 5, win.current["w"]-10, 40, 10, do, "analytics", talk.text("analytics_tooltip"), url="story_editor") # Progressbar UI_color.set(layer, win, "progress_background") UI_elements.roundrect(layer, win, 55, 15, win.current["w"]/3*2-10, 20, 10) timepassed = 0.0 projectdone = 0.0 try: timepassed = win.analytics["timepassed"] projectdone = win.analytics["fraction"] except: pass # Timepassed UI_color.set(layer, win, "progress_time") UI_elements.roundrect(layer, win, 55, 15, (win.current["w"]/3*2-10)*timepassed, 20, 10) # Project Done UI_color.set(layer, win, "progress_active") UI_elements.roundrect(layer, win, 55, 15, (win.current["w"]/3*2-10)*projectdone, 20, 10) # Separator UI_color.set(layer, win, "node_background") layer.move_to(win.current["w"]/3*2+55, 5) layer.line_to(win.current["w"]/3*2+55, 45) layer.stroke() # Schedule UI_elements.image(layer, win, "settings/themes/"\ +win.settings["Theme"]+"/icons/schedule.png", win.current["w"]/3*2+60, 5, 40, 40) # Temporarely: UI_color.set(layer, win, "text_normal") layer.set_font_size(20) layer.move_to(win.current["w"]/3*2+120, 25) layer.show_text("The Next Task") layer.set_font_size(12) layer.move_to(win.current["w"]/3*2+130+len("The Next Task")*12, 25) layer.show_text("from: AllTasks > Subtasks > This") layer.set_font_size(12) layer.move_to(win.current["w"]/3*2+120, 40) layer.show_text("Character: Moria") ###### LEFT PANNEL ####### # New Scene def do(): print("New Scene") UI_elements.roundrect(layer, win, 5, 105, 40, 40, 10, do, "node", talk.text("new_scene_tooltip"), url="story_editor") # Link Asset def do(): print("Link Asset") UI_elements.roundrect(layer, win, 5, 155, 40, 40, 10, do, "obj_link", talk.text("link_asset_tooltip"), url="story_editor") # Link File def do(): print("Link File") UI_elements.roundrect(layer, win, 5, 205, 40, 40, 10, do, "file_link", talk.text("link_file_tooltip"), url="story_editor") # Event def do(): print("Event") UI_elements.roundrect(layer, win, 5, 255, 40, 40, 10, do, "event", talk.text("event_tooltip"), url="story_editor") # Marker def do(): print("Marker") UI_elements.roundrect(layer, win, 5, 305, 40, 40, 10, do, "pin", talk.text("marker_tooltip"), url="story_editor") # Renders def do(): print("Renders") UI_elements.roundrect(layer, win, 5, 405, 40, 40, 10, do, "render", talk.text("render_lists_tooltip"), url="story_editor") # Edit Video def do(): print("Edit Video") UI_elements.roundrect(layer, win, 5, 455, 40, 40, 10, do, "vse", talk.text("vse_tooltip"), url="story_editor") # Bottom # Multiuser def do(): win.url = "multiuser_layer" UI_elements.roundrect(layer, win, 5, win.current["h"]-95, 40, 40, 10, do, "multiuser", talk.text("multiuser_tooltip"), url="story_editor") # Settings def do(): win.url = "settings_layer" UI_elements.roundrect(layer, win, 5, win.current["h"]-45, 40, 40, 10, do, "settings", talk.text("Settings"), url="story_editor") ###### RIGHT PANNEL ####### # Characters def do(): print("Characters") UI_elements.roundrect(layer, win, win.current["w"]-45, 105, 40, 40, 10, do, "chr", talk.text("chr"), url="story_editor") # Vehicles def do(): print("Vehicles") UI_elements.roundrect(layer, win, win.current["w"]-45, 155, 40, 40, 10, do, "veh", talk.text("veh"), url="story_editor") # Locations def do(): print("Locations") UI_elements.roundrect(layer, win, win.current["w"]-45, 205, 40, 40, 10, do, "loc", talk.text("loc"), url="story_editor") # Other (obj) def do(): print("Other (obj)") UI_elements.roundrect(layer, win, win.current["w"]-45, 255, 40, 40, 10, do, "obj", talk.text("obj"), url="story_editor") # Sounds / Music def do(): print("Sounds / Music") UI_elements.roundrect(layer, win, win.current["w"]-45, 355, 40, 40, 10, do, "mus", talk.text("mus"), url="story_editor") ####### NODES ####### # Clipping so it wont draw beyon the frame UI_elements.roundrect(layer, win, 50, 50, win.current["w"] - 100, win.current["h"] - 80, 30, fill=False) layer.clip() # Background Image if os.path.exists(win.project+"/py_data/banner.png"): UI_elements.image(layer, win, win.project+"/py_data/banner.png", 50, 50, win.current["w"] - 100, win.current["h"] - 80) else: UI_elements.image(layer, win, "icon.png", 50, 50, win.current["w"] - 100, win.current["h"] - 80) UI_color.set(layer, win, "node_background") layer.rectangle(0,0,win.current["w"], win.current["h"]) layer.fill() # You probably intersted where is the scroll function for this part. Well # see there is a thing. It's easier to write one from screach here. Because # you geassed it we are starting to draw story editor. # Let's prepare the camera first. if win.url == "story_editor": if win.current["MMB"]: win.story["camera"][0] += ( win.current["mx"]-win.previous["mx"]) win.story["camera"][1] += ( win.current["my"]-win.previous["my"]) win.story["camera"][0] -= win.current["scroll"][0]*50 win.story["camera"][1] -= win.current["scroll"][1]*50 cx, cy = win.story["camera"] # EVENTS (Frames) for event in win.story["events"]: # Loaction sx, sy = win.story["events"][event]["position"] sx = sx + cx sy = sy + cy # Scale ssx, ssy = win.story["events"][event]["size"] #Draw studio_nodes.event_node(layer, win, sx, sy, ssx, ssy, name=event) # SCENES for scene in win.story["scenes"]: # Loaction sx, sy = win.story["scenes"][scene]["position"] sx = sx + cx sy = sy + cy # Scale ssx, ssy = win.story["scenes"][scene]["size"] #Fraction sf = win.story["scenes"][scene]["fraction"] #Draw studio_nodes.scene_node(layer, win, sx, sy, ssx, ssy, name=scene, fraction=sf) # Let's get events arround the scene. If it's inside the event. if win.story["scenes"][scene]["parent"]: parent = win.story["scenes"][scene]["parent"] try: # Don't touch these. It's a hard rigging thing. if win.story["events"][parent]["position"][0] > sx - cx: win.story["events"][parent]["position"][0] = sx - cx if win.story["events"][parent]["position"][1] > sy - cy: win.story["events"][parent]["position"][1] = sy - cy if win.story["events"][parent]["size"][0]\ + win.story["events"][parent]["position"][0]+cx < ssx + sx: win.story["events"][parent]["size"][0] = ssx + sx\ - win.story["events"][parent]["position"][0] - cx if win.story["events"][parent]["size"][1]\ + win.story["events"][parent]["position"][1]+cy < ssy + sy: win.story["events"][parent]["size"][1] = ssy + sy\ - win.story["events"][parent]["position"][1] - cy except: pass # LINKS (Images, Stuff) for num, link in enumerate(win.story["links"]): linktype = link[0] linkname = link[1] lx = link[2][0] + cx ly = link[2][1] + cy studio_nodes.link_node(layer, win, lx, ly, name=linkname, num=num, linktype=linktype ) # In case there is a selection bug if not win.story["selected"]: win.current["tool"] = "selection" # Selector visualization if win.current["LMB"] and win.current["tool"] == "selection" and win.url == "story_editor": # Undo selection if int(win.current["LMB"][0] - win.current["mx"]) in range(-10, 10)\ and int(win.current["LMB"][1] - win.current["my"])in range(-10, 10)\ and 65505 not in win.current["keys"]: win.story["selected"] = [] # Draw selection box UI_color.set(layer, win, "progress_background") layer.rectangle( win.current["mx"], win.current["my"], win.current["LMB"][0] - win.current["mx"], win.current["LMB"][1] - win.current["my"] ) layer.stroke() # Let's put in the start and the end nodes. These are drawn on top of # everything. studio_nodes.start_node(layer, win, 60,60,100,40) studio_nodes.end_node(layer, win, win.current["w"] - 160, win.current["h"] - 80, 100,40) return surface