123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429 |
- # THIS FILE IS A PART OF VCStudio
- # PYTHON 3
- # This a console project manager.
- import os
- import time
- # 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
- # story
- from studio import story
- from studio import analytics
- from studio import history
- 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,
- 80,
- 80,
- win.current["w"]-160,
- win.current["h"]-160,
- 10)
-
- ############################################################################
-
- # Before we start anything. I would like to refresh the cash of the assets.
- # so I would have the most up to date list / fractions of each item.
-
- # In the studio/story.py there is the get_asset_data() functions. Which if
- # you look closly just loads fraction into a dictionary called win.assets
- # from which we can read directly.
-
- # The function is designed to give load the fraction ones and then just give
- # you one from the RAM. So it's not always going to read the asset.progress
- # files which is not too good. Since I want to have a good idea about the
- # asset's actuall fraction.
-
- # One way I can force it to update is by using the force argument. But doing
- # it on every frame defeats the purpose of the function entirelly. So here
- # what I'm going to do. Each time I close this window. AKA return anything
- # I am also going to wipe the dictionary win.asset clean. It will take one
- # frame of potential lag to load everything back ( at least the stuff that's
- # ont the screen in a given moment.
-
- # Also to make sure that this dialog has the up to date info. I will do it
- # as well in the studio_dialogs.py when initilizing this function. So yeah.
-
- # Let's continue with the program.
-
- ############################################################################
-
-
-
-
- ####### TOP PANEL #######
-
- for num, cur in enumerate(["chr","veh","loc","obj"]):
-
- if win.current["asset_cur"] == cur:
-
- UI_color.set(layer, win, "progress_time")
- UI_elements.roundrect(layer, win,
- 100+(40*num),
- 100,
- 40,
- 40,
- 10)
-
- def do():
- win.current["asset_cur"] = cur
-
- UI_elements.roundrect(layer, win,
- 100+(40*num),
- 100,
- 40,
- 40,
- 10,
- do,
- cur,
- tip=talk.text(cur))
-
- # In case the user is confused
- UI_color.set(layer, win, "text_normal")
- layer.set_font_size(30)
- layer.move_to(300,130)
- layer.show_text(talk.text(win.current["asset_cur"]))
-
-
- # Search
-
- UI_elements.image(layer, win, "settings/themes/"\
- +win.settings["Theme"]+"/icons/search.png",
- win.current["w"]-440,
- 100,
- 40,
- 40)
-
- UI_elements.text(layer, win, "asset_select_search",
- win.current["w"]-400,
- 100,
- 250,
- 40)
-
- # CANCEl
-
- def do():
- win.current["calls"][call]["var"] = False
- win.assets = {}
-
- UI_elements.roundrect(layer, win,
- win.current["w"]-120,
- win.current["h"]-120,
- 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,
- 100,
- 150,
- win.current["w"]-200,
- win.current["h"]-250,
- 10,
- fill=False)
- layer.clip()
-
-
-
- tileX = 120
- current_Y = 50
-
- if "asset_select" not in win.scroll:
- win.scroll["asset_select"] = 0
-
- newcreate = win.text["asset_select_search"]["text"].replace("/","_").replace(" ", "_")\
- .replace('"',"_").replace("(","_").replace(")","_").replace("'","_")\
- .replace("[","_").replace("]","_").replace("{","_").replace("}","_")
-
- ###########################
- okay = True
-
- for asset in os.listdir(win.project+"/dev/"+win.current["asset_cur"]):
- if os.path.isdir(win.project+"/dev/"+win.current["asset_cur"]+"/"+asset):
-
- okay = True
-
- # Search
-
- if win.text["asset_select_search"]["text"]\
- and newcreate.lower() not in asset.lower():
- okay = False
-
- if okay:
-
-
- if int(current_Y + win.scroll["asset_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, "node_asset")
- node.rectangle(0,0,170, 20)
- node.fill()
-
- # Outputting the layer
- layer.set_source_surface(nodesurface,
- tileX-10,
- current_Y + win.scroll["asset_select"] + 120)
- layer.paint()
-
-
- # Previes image
-
- if os.path.exists(win.project+"/dev/"+win.current["asset_cur"]+"/"+asset+"/renders/Preview.png"):
- UI_elements.image(layer, win, win.project+"/dev/"+win.current["asset_cur"]+"/"+asset+"/renders/Preview.png",
- tileX,
- current_Y + win.scroll["asset_select"] + 140,
- 150,
- 150)
-
- elif os.path.exists(win.project+"/dev/"+win.current["asset_cur"]+"/"+asset+"/renders/Preview.jpg"):
- UI_elements.image(layer, win, win.project+"/dev/"+win.current["asset_cur"]+"/"+asset+"/renders/Preview.jpg",
- tileX,
- current_Y + win.scroll["asset_select"] + 140,
- 150,
- 150)
- else:
- UI_elements.image(layer, win, "settings/themes/"+win.settings["Theme"]+"/icons/"+win.current["asset_cur"]+".png",
- tileX+55,
- current_Y + win.scroll["asset_select"] + 150+55,
- 150,
- 150)
-
- # Progress bar
-
- fraction = story.get_asset_data(win, win.current["asset_cur"]+"/"+asset)["fraction"]
-
- UI_color.set(layer, win, "progress_background")
- UI_elements.roundrect(layer, win,
- tileX,
- current_Y + win.scroll["asset_select"] + 300,
- 150,
- 0,
- 5)
-
- UI_color.set(layer, win, "progress_active")
- UI_elements.roundrect(layer, win,
- tileX,
- current_Y + win.scroll["asset_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["asset_select"] + 135)
- layer.show_text(asset[asset.rfind("/")+1:][:22])
-
-
-
-
-
-
-
-
- # Button to activate it
- def do():
- print("test")
- win.current["calls"][call]["var"] = "/"+win.current["asset_cur"]+"/"+asset
- win.assets = {}
-
-
-
- layer.set_line_width(4)
- UI_elements.roundrect(layer, win,
- tileX-10,
- current_Y + win.scroll["asset_select"] + 120,
- 170,
- 200,
- 10,
- button=do,
- tip=talk.text(win.current["asset_cur"])+": "+asset,
- fill=False,
- clip=[
- 100,
- 150,
- win.current["w"]-200,
- win.current["h"]-250
- ])
-
- layer.stroke()
- layer.set_line_width(2)
-
- tileX += 200
-
- if tileX > win.current["w"]-270:
- tileX = 120
-
- current_Y += 230
-
-
-
- if win.text["asset_select_search"]["text"]\
- and newcreate\
- not in os.listdir(win.project+"/dev/"+win.current["asset_cur"])\
- and newcreate not in "chr veh loc obj": #Avoiding potential mistakes
-
- # If there is a seach and there is no asset with the search name. It
- # will ask if you want to create such an asset.
-
- def do():
-
- # I don't thing I need to write a whole module for creating a couple
- # of folders.
-
- try:
- os.mkdir(win.project+"/dev/"+win.current["asset_cur"]+"/"+newcreate)
- os.mkdir(win.project+"/dev/"+win.current["asset_cur"]+"/"+newcreate+"/renders")
- os.mkdir(win.project+"/dev/"+win.current["asset_cur"]+"/"+newcreate+"/reference")
- os.mkdir(win.project+"/dev/"+win.current["asset_cur"]+"/"+newcreate+"/tex")
-
- # Recodring to history
- history.record(win, win.project+"/dev/"+win.current["asset_cur"]+"/"+newcreate, "[Added Asset]")
-
- except:
- pass
-
-
- # There is a problem that was introduced with the multiuser.
- # Basically. The other user whould need to create this asset too. And it's
- # not cool. I want to the experience to be seamless. Or at least somewhat seamless.
-
- # So I'm going to enter the cur of the asset for a fraction of a second. And then
- # come back to what ever we were doing.
- tmp = win.cur
- win.cur = win.current["asset_cur"]
- time.sleep(0.1) # This should be plenty
- win.cur = tmp
-
-
- win.text["asset_select_search"]["text"] = ""
-
- win.current["calls"][call]["var"] = "/"+win.current["asset_cur"]+"/"+newcreate
- win.assets = {}
-
-
- # Refrashing analytics
- win.analytics = analytics.load(win.project)
- analytics.save(win.project, win.analytics)
-
- UI_elements.roundrect(layer, win,
- tileX-10,
- current_Y + win.scroll["asset_select"] + 120,
- 170,
- 200,
- 10,
- button=do,
- tip=talk.text("create_new_asset")+" "+newcreate)
-
- UI_color.set(layer, win, "progress_background")
- UI_elements.roundrect(layer, win,
- tileX-10,
- current_Y + win.scroll["asset_select"] + 120,
- 170,
- 200,
- 10,
- fill=False)
- layer.stroke()
-
- UI_elements.image(layer, win,
- "settings/themes/"+win.settings["Theme"]+"/icons/asset_new.png",
- tileX+55,
- current_Y + win.scroll["asset_select"] + 200,
- 40, 40)
-
- UI_color.set(layer, win, "text_normal")
- layer.set_font_size(12)
- layer.move_to(tileX+85-len(newcreate)*4,
- current_Y + win.scroll["asset_select"] + 300)
- layer.show_text(newcreate)
-
-
-
- ###########################
-
- current_Y += 230
-
- UI_elements.scroll_area(layer, win, "asset_select",
- 50,
- 100,
- win.current["w"]-100,
- win.current["h"]-200,
- current_Y,
- bar=True,
- mmb=True,
- url="asset_select",
- strenght=130
- )
-
-
-
- return surface
|