596 lines
14 KiB
Python
596 lines
14 KiB
Python
# 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"]
|
|
|
|
|
|
# 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)
|
|
|
|
|
|
|
|
# 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"] and win.current["tool"] != "connect":
|
|
win.current["tool"] = "selection"
|
|
|
|
# Selector visualization
|
|
if win.current["LMB"] and win.current["tool"] == "selection" and win.url == "story_editor":
|
|
|
|
# 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()
|
|
|
|
# Now let's draw the cool AF multi selection zone thingy
|
|
|
|
# Draw selection box
|
|
if len(win.story["selected"]) > 1 and win.current["tool"] == "selection":
|
|
UI_color.set(layer, win, "progress_background")
|
|
layer.rectangle(
|
|
win.szone[0][0]-10,
|
|
win.szone[0][1]-10,
|
|
win.szone[1][0]+20,
|
|
win.szone[1][1]+20
|
|
)
|
|
layer.stroke()
|
|
|
|
# Now I want to make a tiny widget that will resize the stuff.
|
|
|
|
if win.story["selected"]:
|
|
|
|
if win.current["tool"] == "selection":
|
|
|
|
draw_circle = True
|
|
if len(win.story["selected"]) == 1:
|
|
if win.story["selected"][0][0] != "scene":
|
|
draw_circle = False
|
|
|
|
if draw_circle:
|
|
UI_color.set(layer, win, "node_badfile")
|
|
UI_elements.roundrect(layer, win,
|
|
win.szone[0][0]+win.szone[1][0],
|
|
win.szone[0][1]+win.szone[1][1],
|
|
0,
|
|
0,
|
|
10)
|
|
UI_color.set(layer, win, "progress_background")
|
|
UI_elements.roundrect(layer, win,
|
|
win.szone[0][0]+win.szone[1][0],
|
|
win.szone[0][1]+win.szone[1][1],
|
|
0,
|
|
0,
|
|
10,
|
|
fill=False)
|
|
layer.stroke()
|
|
|
|
elif win.current["tool"] == "scale":
|
|
UI_color.set(layer, win, "node_badfile")
|
|
UI_elements.roundrect(layer, win,
|
|
win.current["mx"]-10,
|
|
win.current["my"]-10,
|
|
0,
|
|
0,
|
|
10)
|
|
UI_color.set(layer, win, "progress_background")
|
|
UI_elements.roundrect(layer, win,
|
|
win.current["mx"]-10,
|
|
win.current["my"]-10,
|
|
0,
|
|
0,
|
|
10,
|
|
fill=False)
|
|
layer.stroke()
|
|
|
|
if int(win.current["mx"]) in range(int(win.szone[0][0]+win.szone[1][0]), int(win.szone[0][0]+win.szone[1][0]+20))\
|
|
and int(win.current["my"]) in range(int(win.szone[0][1]+win.szone[1][1]), int(win.szone[0][1]+win.szone[1][1]+20))\
|
|
and win.current["tool"] == "selection":
|
|
|
|
UI_color.set(layer, win, "text_normal")
|
|
UI_elements.roundrect(layer, win,
|
|
win.szone[0][0]+win.szone[1][0],
|
|
win.szone[0][1]+win.szone[1][1],
|
|
0,
|
|
0,
|
|
10,
|
|
fill=False)
|
|
layer.stroke()
|
|
|
|
if win.current["LMB"] and not win.previous["LMB"]:
|
|
|
|
win.current["tool"] = "scale"
|
|
|
|
if win.current["tool"] == "scale" and not win.current["LMB"]:
|
|
win.current["tool"] = "selection"
|
|
|
|
# Canceling seletion. I move it here so it would not interfire with the
|
|
# the rest of the program.
|
|
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"] = []
|
|
|
|
# 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)
|
|
|
|
# Let's draw the line while connecting 2 scenes together.
|
|
|
|
if win.current["tool"] == "connect":
|
|
|
|
if not win.current["LMB"]:
|
|
win.current["tool"] = "selection"
|
|
|
|
fr = win.current["draw_dot"]
|
|
if type(fr) == list:
|
|
fr = fr[0]+":"+fr[1]
|
|
|
|
try:
|
|
UI_color.set(layer, win, "node_script")
|
|
layer.move_to(
|
|
win.out_dots[fr][0],
|
|
win.out_dots[fr][1]
|
|
)
|
|
layer.line_to(win.current["mx"], win.current["my"])
|
|
layer.stroke()
|
|
except:
|
|
pass
|
|
|
|
|
|
return surface
|
|
|