# THIS FILE IS A PART OF VCStudio # PYTHON 3 import os import datetime # 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 studio import studio_dialogs from project_manager import pm_project #UI modules from UI import UI_elements from UI import UI_color # Studio from studio import studio_dialogs from studio import analytics from network import http_client 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, "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, win.current["w"]/2-250, 100, 500, win.current["h"]-200, 10) # Exit button def do(): win.url = "story_editor" win.textactive = "" UI_elements.roundrect(layer, win, win.current["w"]/2+210, win.current["h"]-140, 40, 40, 10, button=do, icon="cancel", tip=talk.text("cancel")) # Clipping everything UI_elements.roundrect(layer, win, win.current["w"]/2-250, 100, 500, win.current["h"]-260, 10, fill=False) layer.clip() clip = [ win.current["w"]/2-250, 100, 500, win.current["h"]-260] # Setting up the scroll if "studio_settings" not in win.scroll: win.scroll["studio_settings"] = 0 current_Y = 0 # The max scroll value # Projectname UI_elements.image(layer, win, "settings/themes/"\ +win.settings["Theme"]+"/icons/analytics.png", win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 40, 40) UI_elements.text(layer, win, "Project_Name_setting", win.current["w"]/2-190, 110 + current_Y + win.scroll["studio_settings"], 420, 40, set_text=win.analytics["name"], tip=talk.text("project_name")) if win.text["Project_Name_setting"]["text"] != win.analytics["name"]: def do(): win.analytics["name"] = win.text["Project_Name_setting"]["text"] UI_elements.roundrect(layer, win, win.current["w"]/2-240+430, 110 + current_Y + win.scroll["studio_settings"], 40, 40, 10, button=do, icon="ok", tip=talk.text("checked")) current_Y += 50 # Director UI_elements.image(layer, win, "settings/themes/"\ +win.settings["Theme"]+"/icons/analytics.png", win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 40, 40) UI_elements.text(layer, win, "Project_Director_setting", win.current["w"]/2-190, 110 + current_Y + win.scroll["studio_settings"], 420, 40, set_text=win.analytics["director"], tip=talk.text("project_director")) if win.text["Project_Director_setting"]["text"] != win.analytics["director"]: def do(): win.analytics["director"] = win.text["Project_Director_setting"]["text"] UI_elements.roundrect(layer, win, win.current["w"]/2-240+430, 110 + current_Y + win.scroll["studio_settings"], 40, 40, 10, button=do, icon="ok", tip=talk.text("checked")) current_Y += 50 # Project Comment UI_elements.image(layer, win, "settings/themes/"\ +win.settings["Theme"]+"/icons/analytics.png", win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 40, 40) UI_elements.text(layer, win, "Project_status_setting", win.current["w"]/2-190, 110 + current_Y + win.scroll["studio_settings"], 420, 40, set_text=win.analytics["status"], tip=talk.text("project_status")) if win.text["Project_status_setting"]["text"] != win.analytics["status"]: def do(): win.analytics["status"] = win.text["Project_status_setting"]["text"] UI_elements.roundrect(layer, win, win.current["w"]/2-240+430, 110 + current_Y + win.scroll["studio_settings"], 40, 40, 10, button=do, icon="ok", tip=talk.text("checked")) current_Y += 50 # Banner / Background image settings. if os.path.exists(win.project+"/set/banner.png"): UI_elements.image(layer, win, win.project+"/set/banner.png", win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 480, 200, cell="settings_background") elif os.path.exists(win.project+"/py_data/banner.png"): UI_elements.image(layer, win, win.project+"/py_data/banner.png", win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 480, 200, cell="settings_background") else: UI_elements.image(layer, win, "icon.png", win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 480, 200, cell="settings_background") def do(): def after(win, var): try: if var: # Let's check that the selected if an image. for f in fileformats.images: if var.endswith(f): # Now let's copy the picture from whereever it is to be the new # banner. For this first of all I need to check whether it exists # inside the project. if os.path.exists(win.project+"/"+var): fr = win.project+"/"+var else: fr = var with open(fr, "rb") as in_file, open(win.project+"/set/banner.png", "wb") as out_file: out_file.write(in_file.read()) # Refrashing images win.images = {} break except: raise() studio_dialogs.file_select(win, "banner_editing", after, force=True) UI_elements.roundrect(layer, win, win.current["w"]/2-250, 100 + current_Y + win.scroll["studio_settings"], 500, 220, 10, button=do, fill=False, tip=talk.text("project_banner")) layer.stroke() current_Y += 220 # Start date and Deadline UI_elements.image(layer, win, "settings/themes/"\ +win.settings["Theme"]+"/icons/schedule.png", win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 40, 40) UI_elements.text(layer, win, "Project_startdate_setting", win.current["w"]/2-190, 110 + current_Y + win.scroll["studio_settings"], 200, 40, set_text=win.analytics["startdate"], tip=talk.text("project_startdate")) if win.text["Project_startdate_setting"]["text"] != win.analytics["startdate"]\ and analytics.ifdate(win.text["Project_startdate_setting"]["text"]): def do(): win.analytics["startdate"] = win.text["Project_startdate_setting"]["text"] # Refrashing the analytics analytics.save(win.project, win.analytics) win.analytics = analytics.load(win.project) UI_elements.roundrect(layer, win, win.current["w"]/2-240+210, 110 + current_Y + win.scroll["studio_settings"], 40, 40, 10, button=do, icon="ok", tip=talk.text("checked")) UI_elements.text(layer, win, "Project_deadline_setting", win.current["w"]/2-190+210, 110 + current_Y + win.scroll["studio_settings"], 200, 40, set_text=win.analytics["deadline"], tip=talk.text("project_deadline")) if win.text["Project_deadline_setting"]["text"] != win.analytics["deadline"]\ and analytics.ifdate(win.text["Project_deadline_setting"]["text"]): def do(): win.analytics["deadline"] = win.text["Project_deadline_setting"]["text"] # Refrashing the analytics analytics.save(win.project, win.analytics) win.analytics = analytics.load(win.project) UI_elements.roundrect(layer, win, win.current["w"]/2-240+420, 110 + current_Y + win.scroll["studio_settings"], 40, 40, 10, button=do, icon="ok", tip=talk.text("checked")) current_Y += 50 # Days a week. UI_elements.text(layer, win, "Project_days_a_week_setting", win.current["w"]/2-190, 110 + current_Y + win.scroll["studio_settings"], 80, 40, set_text=str(win.analytics.get("days_a_week", 7)), tip=talk.text("days_a_week")) if win.text["Project_days_a_week_setting"]["text"] != str(win.analytics.get("days_a_week", 7))\ and analytics.if_days_a_week(win.text["Project_days_a_week_setting"]["text"]): def do(): win.analytics["days_a_week"] = int(win.text["Project_days_a_week_setting"]["text"]) # Refrashing the analytics analytics.save(win.project, win.analytics) win.analytics = analytics.load(win.project) UI_elements.roundrect(layer, win, win.current["w"]/2-150, 110 + current_Y + win.scroll["studio_settings"], 40, 40, 10, button=do, icon="ok", tip=talk.text("checked")) UI_color.set(layer, win, "text_normal") layer.set_font_size(20) layer.move_to(win.current["w"]/2-100, current_Y + win.scroll["studio_settings"] + 135) layer.show_text(talk.text("days_a_week")) current_Y += 100 # Username UI_elements.image(layer, win, "settings/themes/"\ +win.settings["Theme"]+"/icons/user.png", win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 40, 40) UI_elements.text(layer, win, "Username_setting", win.current["w"]/2-190, 110 + current_Y + win.scroll["studio_settings"], 420, 40, set_text=win.settings["Username"], tip=talk.text("username")) if win.text["Username_setting"]["text"] != win.settings["Username"]: def do(): win.settings["Username"] = win.text["Username_setting"]["text"] settings.write("Username", win.settings["Username"]) UI_elements.roundrect(layer, win, win.current["w"]/2-240+430, 110 + current_Y + win.scroll["studio_settings"], 40, 40, 10, button=do, icon="ok", tip=talk.text("checked")) current_Y += 50 # Preparing lists. if "settings_lists" not in win.current: win.current["settings_lists"] = {} win.current["settings_lists"]["languages"] = settings.list_languages() win.current["settings_lists"]["languages_open"] = False win.current["settings_lists"]["themes"] = os.listdir(os.getcwd()+"/settings/themes") win.current["settings_lists"]["themes_open"] = False # Languages def do(): win.current["settings_lists"]["languages_open"] = \ not win.current["settings_lists"]["languages_open"] UI_elements.roundrect(layer, win, win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 450, 40, 10, button=do, icon="font", tip=talk.text("change_language")) UI_color.set(layer, win, "text_normal") layer.set_font_size(20) layer.move_to(win.current["w"]/2-180, current_Y + win.scroll["studio_settings"] + 135) layer.show_text(win.settings["Language"]) current_Y += 50 if win.current["settings_lists"]["languages_open"]: for lang in win.current["settings_lists"]["languages"]: if lang != win.settings["Language"]: UI_color.set(layer, win, "button_active") layer.move_to(win.current["w"]/2-227, 102 + current_Y + win.scroll["studio_settings"]) layer.line_to(win.current["w"]/2-227, 152 + current_Y + win.scroll["studio_settings"]) layer.stroke() def do(): win.settings["Language"] = lang settings.write("Language", lang) win.current["settings_lists"]["languages_open"] = False UI_elements.roundrect(layer, win, win.current["w"]/2-220, 110 + current_Y + win.scroll["studio_settings"], 430, 40, 10, button=do, icon="font", tip=talk.text("set_language")+lang) UI_color.set(layer, win, "text_normal") layer.set_font_size(20) layer.move_to(win.current["w"]/2-150, current_Y + win.scroll["studio_settings"] + 135) layer.show_text(lang) current_Y += 50 # Themes. Finally we have some themes to choose from. And a good place to # change them so the user would not need to do it manually. I think it's # important. # So there is a folder in the VCStudio installation called. settings/themes # which contains all of the themes. So let's look through it. # Themes def do(): win.current["settings_lists"]["themes_open"] = \ not win.current["settings_lists"]["themes_open"] UI_elements.roundrect(layer, win, win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 450, 40, 10, button=do, icon="theme", tip=talk.text("change_theme")) UI_color.set(layer, win, "text_normal") layer.set_font_size(20) layer.move_to(win.current["w"]/2-180, current_Y + win.scroll["studio_settings"] + 135) layer.show_text(win.settings["Theme"]) current_Y += 50 if win.current["settings_lists"]["themes_open"]: for lang in win.current["settings_lists"]["themes"]: if lang != win.settings["Theme"]: UI_color.set(layer, win, "button_active") layer.move_to(win.current["w"]/2-227, 102 + current_Y + win.scroll["studio_settings"]) layer.line_to(win.current["w"]/2-227, 152 + current_Y + win.scroll["studio_settings"]) layer.stroke() def do(): win.settings["Theme"] = lang settings.write("Theme", lang) win.current["settings_lists"]["themes_open"] = False win.color = UI_color.get_table() UI_elements.roundrect(layer, win, win.current["w"]/2-220, 110 + current_Y + win.scroll["studio_settings"], 430, 40, 10, button=do, icon="theme", tip=talk.text("set_theme")+lang) UI_color.set(layer, win, "text_normal") layer.set_font_size(20) layer.move_to(win.current["w"]/2-150, current_Y + win.scroll["studio_settings"] + 135) layer.show_text(lang) current_Y += 50 # BLUR blur_ok = "unchecked" if win.settings["Blur"]: blur_ok = "checked" def do(): win.settings["Blur"] = not win.settings["Blur"] settings.write("Blur", win.settings["Blur"]) UI_elements.roundrect(layer, win, win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 450, 40, 10, button=do, icon=blur_ok, tip=talk.text("Blur")) UI_color.set(layer, win, "text_normal") layer.set_font_size(20) layer.move_to(win.current["w"]/2-180, current_Y + win.scroll["studio_settings"] + 135) layer.show_text(talk.text("Blur")) current_Y += 50 if win.settings["Blur"]: ablur_ok = "unchecked" if win.settings["Auto_De-Blur"]: ablur_ok = "checked" def do(): win.settings["Auto_De-Blur"] = not win.settings["Auto_De-Blur"] settings.write("Auto_De-Blur", win.settings["Auto_De-Blur"]) UI_elements.roundrect(layer, win, win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 450, 40, 10, button=do, icon=ablur_ok, tip=talk.text("Auto_De-Blur")) UI_color.set(layer, win, "text_normal") layer.set_font_size(20) layer.move_to(win.current["w"]/2-180, current_Y + win.scroll["studio_settings"] + 135) layer.show_text(talk.text("Auto_De-Blur")) current_Y += 50 # Pixelated Blur ablur_ok = "unchecked" if win.settings["PixelBlur"]: ablur_ok = "checked" def do(): win.settings["PixelBlur"] = not win.settings["PixelBlur"] settings.write("PixelBlur", win.settings["PixelBlur"]) UI_elements.roundrect(layer, win, win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 450, 40, 10, button=do, icon=ablur_ok, tip=talk.text("PixelBlur")) UI_color.set(layer, win, "text_normal") layer.set_font_size(20) layer.move_to(win.current["w"]/2-180, current_Y + win.scroll["studio_settings"] + 135) layer.show_text(talk.text("PixelBlur")) current_Y += 50 # ROUNDNESS # The roundness setting is a setting that will define how round the UI will # look. Potentially it can grow beyond 1.0, but will introduce weird rendering # artifacts. If you wan to do that be free to edit the Setting file manually. # I'm going to use the Scroller for this setting. But first we need an icon. And # I think the opengl icon is quite good for this. UI_elements.image(layer, win, "settings/themes/"\ +win.settings["Theme"]+"/icons/opengl.png", win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 40, 40) # Then i'm going to hack my way to it. I'm going to use a scroll for a scrooled # window as the slider. Creativity. maxround = 1000 # I need it do be a higher number then from 0 to 1 since we want # to imulate the scroll if "roundness_setting" not in win.scroll: win.scroll["roundness_setting"] = 0 - win.settings["Roundness"] * 549 if (0 - win.settings["Roundness"] * 549) != win.scroll["roundness_setting"]: win.settings["Roundness"] = (win.scroll["roundness_setting"] / 549)*-1 settings.write("Roundness", win.settings["Roundness"]) UI_elements.scroll_area(layer, win, "roundness_setting", int(win.current["w"]/2-200), 110 + current_Y + win.scroll["studio_settings"]+33, 450, 0, maxround, bar=True, sideways=True, url="settings_layer" ) current_Y += 100 # WHICH BLENDER TO USE if "blender-bash" not in win.settings: win.settings["blender-bash"] = "blender" UI_elements.image(layer, win, "settings/themes/"\ +win.settings["Theme"]+"/icons/blender.png", win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 40, 40) UI_elements.text(layer, win, "blender-bash", win.current["w"]/2-190, 110 + current_Y + win.scroll["studio_settings"], 420, 40, set_text=win.settings["blender-bash"], tip=talk.text("blender-bash")) if win.text["blender-bash"]["text"] != win.settings["blender-bash"]: def do(): win.settings["blender-bash"] = win.text["blender-bash"]["text"] settings.write("blender-bash", win.settings["blender-bash"]) UI_elements.roundrect(layer, win, win.current["w"]/2-240+430, 110 + current_Y + win.scroll["studio_settings"], 40, 40, 10, button=do, icon="ok", tip=talk.text("checked")) current_Y += 100 # REMOTE SERVER rserv_ok = "unchecked" if win.analytics["from-remote-server"]: rserv_ok = "checked" def do(): win.analytics["from-remote-server"] = not win.analytics["from-remote-server"] UI_elements.roundrect(layer, win, win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 450, 40, 10, button=do, icon=rserv_ok, tip=talk.text("Remote_Server_tip")) UI_color.set(layer, win, "text_normal") layer.set_font_size(20) layer.move_to(win.current["w"]/2-180, current_Y + win.scroll["studio_settings"] + 135) layer.show_text(talk.text("Remote_Server")) current_Y += 50 if win.analytics["from-remote-server"]: # Remote Server Host Name UI_elements.image(layer, win, "settings/themes/"\ +win.settings["Theme"]+"/icons/server.png", win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 40, 40) UI_elements.text(layer, win, "remote-server-url", win.current["w"]/2-190, 110 + current_Y + win.scroll["studio_settings"], 420, 40, set_text=win.analytics["remote-server-url"], tip=talk.text("remote-server-url")) if win.text["remote-server-url"]["text"] != win.analytics["remote-server-url"]: def do(): win.analytics["remote-server-url"] = win.text["remote-server-url"]["text"] UI_elements.roundrect(layer, win, win.current["w"]/2-240+430, 110 + current_Y + win.scroll["studio_settings"], 40, 40, 10, button=do, icon="ok", tip=talk.text("checked")) current_Y += 50 if win.analytics["remote-server-url"]: def do(): def after(win, var): pass studio_dialogs.http_client_dialog(win, "http-client", after, http_client.get_essentials) UI_elements.roundrect(layer, win, win.current["w"]/2-240, 110 + current_Y + win.scroll["studio_settings"], 450, 40, 10, button=do, icon="update", tip=talk.text("remote-update-initial-tip")) UI_color.set(layer, win, "text_normal") layer.set_font_size(20) layer.move_to(win.current["w"]/2-180, current_Y + win.scroll["studio_settings"] + 135) layer.show_text(talk.text("remote-update-initial")) current_Y += 50 current_Y += 50 UI_elements.scroll_area(layer, win, "studio_settings", int(win.current["w"]/2-250), 100, 500, win.current["h"]-260, current_Y, bar=True, mmb=True, url="settings_layer" ) return surface