diff --git a/code/controllers/subsystems/processing/vueui.dm b/code/controllers/subsystems/processing/vueui.dm index 4be05e776d5..e794804658b 100644 --- a/code/controllers/subsystems/processing/vueui.dm +++ b/code/controllers/subsystems/processing/vueui.dm @@ -84,7 +84,7 @@ Byond Vue UI framework's management subsystem */ /datum/controller/subsystem/processing/vueui/proc/check_uis_for_change(var/src_object) for (var/datum/vueui/ui in get_open_uis(src_object)) - ui.check_for_change() + ui.update_status(1) /** * Initiates check for data change of specified object @@ -178,20 +178,24 @@ Byond Vue UI framework's management subsystem * @param new_activeui - Vue component name to be used in ui with new object * @param new_data - initial data for this transfered ui * - * @return 0 if failed, 1 if success + * @return list of transfered uis */ -/datum/controller/subsystem/processing/vueui/proc/transfer_uis(var/old_object, var/new_object, var/new_activeui = null, var/new_data = null) +/datum/controller/subsystem/processing/vueui/proc/transfer_uis(var/old_object, var/new_object, var/new_activeui = null, var/nwidth = 0, var/nheight = 0, var/new_title = null, var/new_data = null) var/old_object_key = SOFTREF(old_object) var/new_object_key = SOFTREF(new_object) + . = list() LAZYINITLIST(open_uis[new_object_key]) for(var/datum/vueui/ui in open_uis[old_object_key]) ui.object = new_object - if(new_activeui) ui.activeui = new_activeui + if(new_activeui) {ui.activeui = new_activeui} + if(new_title) {ui.title = new_title} ui.data = new_data open_uis[old_object_key] -= ui LAZYADD(open_uis[new_object_key], ui) - ui.check_for_change() + ui.resize(nwidth, nheight) + ui.update_status(1) + . += ui if (!LAZYLEN(open_uis[old_object_key])) open_uis -= old_object_key diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm index df058dee9b7..d3486fe7e14 100644 --- a/code/modules/modular_computers/computers/modular_computer/core.dm +++ b/code/modules/modular_computers/computers/modular_computer/core.dm @@ -142,9 +142,10 @@ /obj/item/modular_computer/proc/kill_program(var/forced = 0) if(active_program) active_program.kill_program(forced) + src.vueui_transfer(active_program) active_program = null var/mob/user = usr - if(user && istype(user)) + if(user && istype(user) && !forced) ui_interact(user) // Re-open the UI on this computer. It should show the main screen now. update_icon() @@ -161,12 +162,14 @@ return ntnet_global.add_log(text, network_card) /obj/item/modular_computer/proc/shutdown_computer(var/loud = 1) + SSvueui.close_uis(active_program) kill_program(1) for(var/datum/computer_file/program/P in idle_threads) P.kill_program(1) idle_threads.Remove(P) if(loud) visible_message("\The [src] shuts down.") + SSvueui.close_uis(active_program) enabled = 0 update_icon() @@ -189,6 +192,7 @@ idle_threads.Add(active_program) active_program.program_state = PROGRAM_STATE_BACKGROUND // Should close any existing UIs SSnanoui.close_uis(active_program.NM ? active_program.NM : active_program) + src.vueui_transfer(active_program) active_program = null update_icon() if(istype(user)) @@ -214,6 +218,8 @@ active_program = P idle_threads.Remove(P) update_icon() + if(!P.vueui_transfer(src)) + SSvueui.close_uis(src) return if(idle_threads.len >= processor_unit.max_idle_programs+1) @@ -229,6 +235,8 @@ if(P.run_program(user)) active_program = P + if(!P.vueui_transfer(src)) + SSvueui.close_uis(src) update_icon() return 1 diff --git a/code/modules/modular_computers/computers/modular_computer/ui.dm b/code/modules/modular_computers/computers/modular_computer/ui.dm index 4fa8c75e0a4..175bf36a283 100644 --- a/code/modules/modular_computers/computers/modular_computer/ui.dm +++ b/code/modules/modular_computers/computers/modular_computer/ui.dm @@ -1,18 +1,17 @@ -// Operates NanoUI -/obj/item/modular_computer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +// Opens VueUI +/obj/item/modular_computer/ui_interact(mob/user) + var/datum/vueui/ui = SSvueui.get_open_ui(user, src) if(!screen_on || !enabled) if(ui) ui.close() - return 0 + return if(!apc_power(0) && !battery_power(0)) if(ui) ui.close() - return 0 + return // If we have an active program switch to it now. if(active_program) - if(ui) // This is the main laptop screen. Since we are switching to program's UI close it for now. - ui.close() active_program.ui_interact(user) return @@ -22,28 +21,36 @@ visible_message("\The [src] beeps three times, it's screen displaying \"DISK ERROR\" warning.") return // No HDD, No HDD files list or no stored files. Something is very broken. - var/datum/computer_file/data/autorun = hard_drive.find_file_by_name("autorun") - - var/list/data = get_header_data() - - var/list/programs = list() - for(var/datum/computer_file/program/P in hard_drive.stored_files) - var/list/program = list() - program["name"] = P.filename - program["desc"] = P.filedesc - program["autorun"] = (istype(autorun) && (autorun.stored_data == P.filename)) ? 1 : 0 - if(P in idle_threads) - program["running"] = 1 - programs.Add(list(program)) - - data["programs"] = programs - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - ui = new(user, src, ui_key, "laptop_mainscreen.tmpl", "NTOS Main Menu", 400, 500) - ui.auto_update_layout = 1 - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) + ui = new /datum/vueui/modularcomputer(user, src, "mcomputer-system-main", 400, 500, "NTOS Main Menu") + ui.header = "modular-computer" + ui.open() + +/obj/item/modular_computer/vueui_transfer(oldobj) + . = FALSE + var/uis = SSvueui.transfer_uis(oldobj, src, "mcomputer-system-main", 400, 500, "NTOS Main Menu") + for(var/tui in uis) + var/datum/vueui/ui = tui + ui.auto_update_content = FALSE + . = TRUE + +// Gaters data for ui +/obj/item/modular_computer/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui) + . = ..() + data = . || data || list() + // Gather data for computer header + var/headerdata = get_header_data(data["_PC"]) + if(headerdata) + data["_PC"] = headerdata + . = data + + var/datum/computer_file/data/autorun = hard_drive.find_file_by_name("autorun") + VUEUI_SET_CHECK_IFNOTSET(data["programs"], list(), ., data) + for(var/datum/computer_file/program/P in hard_drive.stored_files) + VUEUI_SET_CHECK_IFNOTSET(data["programs"][P.filename], list(), ., data) + VUEUI_SET_CHECK(data["programs"][P.filename]["desc"], P.filedesc, ., data) + VUEUI_SET_CHECK(data["programs"][P.filename]["autorun"], (istype(autorun) && (autorun.stored_data == P.filename)), ., data) + VUEUI_SET_CHECK(data["programs"][P.filename]["running"], (P in idle_threads), ., data) // Handles user's GUI input /obj/item/modular_computer/Topic(href, href_list) @@ -84,7 +91,8 @@ to_chat(user, "Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed.") if( href_list["PC_runprogram"] ) - return run_program(href_list["PC_runprogram"]) + . = run_program(href_list["PC_runprogram"]) + ui_interact(usr) if( href_list["PC_setautorun"] ) if(!hard_drive) @@ -102,56 +110,57 @@ if(.) update_uis() -// Function used by NanoUI's to obtain data for header. All relevant entries begin with "PC_" -/obj/item/modular_computer/proc/get_header_data() - var/list/data = list() +// Function used to obtain data for header. All relevant entries begin with "PC_" +/obj/item/modular_computer/proc/get_header_data(data) + if(!data) + data = list() if(battery_module) switch(battery_module.battery.percent()) if(80 to 200) // 100 should be maximal but just in case.. - data["PC_batteryicon"] = "batt_100.gif" + VUEUI_SET_CHECK(data["batteryicon"], "batt_100.gif", ., data) if(60 to 80) - data["PC_batteryicon"] = "batt_80.gif" + VUEUI_SET_CHECK(data["batteryicon"], "batt_80.gif", ., data) if(40 to 60) - data["PC_batteryicon"] = "batt_60.gif" + VUEUI_SET_CHECK(data["batteryicon"], "batt_60.gif", ., data) if(20 to 40) - data["PC_batteryicon"] = "batt_40.gif" + VUEUI_SET_CHECK(data["batteryicon"], "batt_40.gif", ., data) if(5 to 20) - data["PC_batteryicon"] = "batt_20.gif" + VUEUI_SET_CHECK(data["batteryicon"], "batt_20.gif", ., data) else - data["PC_batteryicon"] = "batt_5.gif" - data["PC_batterypercent"] = "[round(battery_module.battery.percent())] %" - data["PC_showbatteryicon"] = 1 + VUEUI_SET_CHECK(data["batteryicon"], "batt_5.gif", ., data) + VUEUI_SET_CHECK(data["batterypercent"], "[round(battery_module.battery.percent())] %", ., data) + data["showbatteryicon"] = 1 else - data["PC_batteryicon"] = "batt_5.gif" - data["PC_batterypercent"] = "N/C" - data["PC_showbatteryicon"] = battery_module ? 1 : 0 + data["batteryicon"] = "batt_5.gif" + VUEUI_SET_CHECK(data["batterypercent"], "N/C", ., data) + data["showbatteryicon"] = battery_module ? 1 : 0 if(tesla_link && tesla_link.enabled && apc_powered) - data["PC_apclinkicon"] = "charging.gif" + VUEUI_SET_CHECK(data["apclinkicon"], "charging.gif", ., data) + else + VUEUI_SET_CHECK(data["apclinkicon"], "", ., data) switch(get_ntnet_status()) if(0) - data["PC_ntneticon"] = "sig_none.gif" + VUEUI_SET_CHECK(data["ntneticon"], "sig_none.gif", ., data) if(1) - data["PC_ntneticon"] = "sig_low.gif" + VUEUI_SET_CHECK(data["ntneticon"], "sig_low.gif", ., data) if(2) - data["PC_ntneticon"] = "sig_high.gif" + VUEUI_SET_CHECK(data["ntneticon"], "sig_high.gif", ., data) if(3) - data["PC_ntneticon"] = "sig_lan.gif" + VUEUI_SET_CHECK(data["ntneticon"], "sig_lan.gif", ., data) + else + VUEUI_SET_CHECK(data["ntneticon"], "", ., data) + LAZYINITLIST(data["programheaders"]) if(idle_threads.len) - var/list/program_headers = list() for(var/datum/computer_file/program/P in idle_threads) if(!P.ui_header) + if(data["programheaders"][P.filename]) + data["programheaders"][P.filename] = null + . = data continue - program_headers.Add(list(list( - "icon" = P.ui_header - ))) + VUEUI_SET_CHECK(data["programheaders"][P.filename], P.ui_header, ., data) - data["PC_programheaders"] = program_headers - - data["PC_stationtime"] = worldtime2text() - data["PC_hasheader"] = 1 - data["PC_showexitprogram"] = active_program ? 1 : 0 // Hides "Exit Program" button on mainscreen - return data + VUEUI_SET_CHECK(data["showexitprogram"], !!active_program, ., data) // Hides "Exit Program" button on mainscreen diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index f9b3f4df495..13be02b74fa 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -174,7 +174,6 @@ /datum/computer_file/program/proc/get_header_data() if(computer) return computer.get_header_data() - return list() // This is performed on program startup. May be overriden to add extra logic. Remember to include ..() call. Return 1 on success, 0 on failure. // When implementing new program based device, use this to run the program. diff --git a/code/modules/modular_computers/file_system/programs/_program.dm b/code/modules/modular_computers/file_system/programs/_program.dm index 22ebd0aa539..654aa6f7d8d 100644 --- a/code/modules/modular_computers/file_system/programs/_program.dm +++ b/code/modules/modular_computers/file_system/programs/_program.dm @@ -1,5 +1,5 @@ /obj/item/modular_computer/initial_data() - return get_header_data() + return list("_PC" = get_header_data()) /obj/item/modular_computer/update_layout() return TRUE diff --git a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm index 18ec9b8df37..409f599de75 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm @@ -48,7 +48,7 @@ var/list/data = list() if(!istype(PRG)) return - data = PRG.get_header_data() + data = list("_PC" = PRG.get_header_data()) if(PRG.error) data["error"] = PRG.error diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm index dabb1a186bd..15649281210 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm @@ -63,7 +63,7 @@ if(!istype(PRG)) return - data = PRG.get_header_data() + data = list("_PC" = PRG.get_header_data()) data["armed"] = PRG.armed diff --git a/code/modules/modular_computers/file_system/programs/generic/news_browser.dm b/code/modules/modular_computers/file_system/programs/generic/news_browser.dm index 2e2476055f4..c2444b3dfc7 100644 --- a/code/modules/modular_computers/file_system/programs/generic/news_browser.dm +++ b/code/modules/modular_computers/file_system/programs/generic/news_browser.dm @@ -93,7 +93,7 @@ var/datum/computer_file/program/newsbrowser/PRG var/list/data = list() if(program) - data = program.get_header_data() + data = list("_PC" = program.get_header_data()) PRG = program else return diff --git a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm index 59f73599697..2989a16af4b 100644 --- a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm @@ -188,7 +188,7 @@ var/list/data = list() if(program) - data = program.get_header_data() + data = list("_PC" = program.get_header_data()) var/datum/computer_file/program/chatclient/C = program if(!istype(C)) diff --git a/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm b/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm index 01c071a4455..1455d24f9ce 100644 --- a/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm +++ b/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm @@ -98,7 +98,7 @@ var/global/nttransfer_uid = 0 if(!istype(PRG)) return - var/list/data = program.get_header_data() + var/list/data = list("_PC" = program.get_header_data()) if(PRG.error) data["error"] = PRG.error diff --git a/code/modules/modular_computers/file_system/programs/system/client_manager.dm b/code/modules/modular_computers/file_system/programs/system/client_manager.dm index 1623ab4c8ec..79d824857bd 100644 --- a/code/modules/modular_computers/file_system/programs/system/client_manager.dm +++ b/code/modules/modular_computers/file_system/programs/system/client_manager.dm @@ -13,11 +13,81 @@ size = 4 available_on_ntnet = 0 requires_ntnet = 0 - nanomodule_path = /datum/nano_module/program/clientmanager/ - var/_dev_type = 1 //1 - Company Device ,2 - Private device - var/_dev_preset = "civilian" - var/_error_message = null +/datum/computer_file/program/clientmanager/ui_interact(mob/user) + var/datum/vueui/ui = SSvueui.get_open_ui(user, src) + if (!ui) + ui = new /datum/vueui/modularcomputer(user, src, "mcomputer-system-manager", 575, 700, "NTOS Client Manager") + ui.open() + +/datum/computer_file/program/clientmanager/vueui_transfer(oldobj) + SSvueui.transfer_uis(oldobj, src, "mcomputer-system-manager", 575, 700, "NTOS Client Manager") + return TRUE + +// Gaters data for ui +/datum/computer_file/program/clientmanager/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui) + . = ..() + data = . || data || list() + // Gather data for computer header + var/headerdata = get_header_data(data["_PC"]) + if(headerdata) + data["_PC"] = headerdata + . = data + if(!computer) + return + VUEUI_SET_CHECK_IFNOTSET(data["device_type"], 0, ., data) + VUEUI_SET_CHECK_IFNOTSET(data["device_preset"], "", ., data) + + VUEUI_SET_CHECK(data["enrollment_status"], computer.enrolled, ., data) + VUEUI_SET_CHECK(data["ntnet_status"], ntnet_global.check_function(NTNET_SOFTWAREDOWNLOAD), ., data) + + LAZYINITLIST(data["presets"]) + for (var/datum/modular_computer_app_presets/p in ntnet_global.available_software_presets) + if(p.available) + LAZYINITLIST(data["presets"][p.name]) + VUEUI_SET_CHECK(data["presets"][p.name]["name"], p.display_name, ., data) + VUEUI_SET_CHECK(data["presets"][p.name]["description"], p.description, ., data) + + +/datum/computer_file/program/clientmanager/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["enroll"]) + if(ntnet_global.check_function(NTNET_SOFTWAREDOWNLOAD)) + if(href_list["enroll"]["type"] == 1) + enroll_company_device(href_list["enroll"]["preset"]) + return 1 + if(href_list["enroll"]["type"] == 2) + enroll_private_device() + return 1 + return 0 + +//Set´s up the computer with the file manager and the downloader and removes the lock +/datum/computer_file/program/clientmanager/proc/enroll_private_device() + if(!computer) + return 0 + computer.enrolled = 2 // private devices + computer.hard_drive.store_file(new /datum/computer_file/program/filemanager()) + computer.hard_drive.store_file(new /datum/computer_file/program/ntnetdownload()) + return 1 + +//Set´s up the programs from the preset +/datum/computer_file/program/clientmanager/proc/enroll_company_device(var/preset) + if(!computer) + return 0 + + for (var/datum/modular_computer_app_presets/prs in ntnet_global.available_software_presets) + if(prs.name == preset && prs.available == 1) + var/list/prs_programs = prs.return_install_programs() + for (var/datum/computer_file/program/prog in prs_programs) + computer.hard_drive.store_file(prog) + computer.enrolled = 1 // enroll as company device after finding matching preset and storing software + return 1 + return 0 + + +/* /datum/nano_module/program/clientmanager name = "NTOS Client Manager" var/obj/item/modular_computer/movable = null @@ -48,35 +118,15 @@ _error_message = "NTNET unavailable. Unable to enroll device" return 0 -//Set´s up the computer with the file manager and the downloader and removes the lock -/datum/computer_file/program/clientmanager/proc/enroll_private_device() - if(!computer) - return 0 - computer.enrolled = 2 // private devices - computer.hard_drive.store_file(new/datum/computer_file/program/filemanager()) - computer.hard_drive.store_file(new/datum/computer_file/program/ntnetdownload()) - return 1 -//Set´s up the programs from the preset -/datum/computer_file/program/clientmanager/proc/enroll_company_device() - if(!computer || !_dev_type || !_dev_preset) - return 0 - for (var/datum/modular_computer_app_presets/prs in ntnet_global.available_software_presets) - if(prs.name == _dev_preset && prs.available == 1) - var/list/prs_programs = prs.return_install_programs() - for (var/datum/computer_file/program/prog in prs_programs) - computer.hard_drive.store_file(prog) - computer.enrolled = 1 // enroll as company device after finding matching preset and storing software - return 1 - return 0 /datum/nano_module/program/clientmanager/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) var/list/data = list() if(program) movable = program.computer - data = program.get_header_data() + data = list("_PC" = program.get_header_data()) if(!istype(movable)) movable = null @@ -112,3 +162,4 @@ ui.auto_update_layout = 1 ui.set_initial_data(data) ui.open() +*/ \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/system/configurator.dm b/code/modules/modular_computers/file_system/programs/system/configurator.dm index 69f2a13c26c..8247febc171 100644 --- a/code/modules/modular_computers/file_system/programs/system/configurator.dm +++ b/code/modules/modular_computers/file_system/programs/system/configurator.dm @@ -13,51 +13,43 @@ size = 4 available_on_ntnet = 0 requires_ntnet = 0 - nanomodule_path = /datum/nano_module/program/computer_configurator/ -/datum/nano_module/program/computer_configurator - name = "NTOS Computer Configuration Tool" - var/obj/item/modular_computer/movable = null - -/datum/nano_module/program/computer_configurator/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) - if(program) - movable = program.computer - if(!istype(movable)) - movable = null - - // No computer connection, we can't get data from that. - if(!movable) - return 0 - - var/list/data = list() - - if(program) - data = program.get_header_data() - - var/list/hardware = movable.get_all_components() - - data["disk_size"] = movable.hard_drive.max_capacity - data["disk_used"] = movable.hard_drive.used_capacity - data["power_usage"] = movable.last_power_usage - data["battery_exists"] = movable.battery_module ? 1 : 0 - if(movable.battery_module) - data["battery_rating"] = movable.battery_module.battery.maxcharge - data["battery_percent"] = round(movable.battery_module.battery.percent()) - - var/list/all_entries[0] - for(var/obj/item/weapon/computer_hardware/H in hardware) - all_entries.Add(list(list( - "name" = H.name, - "desc" = H.desc, - "enabled" = H.enabled, - "critical" = H.critical, - "powerusage" = H.power_usage - ))) - - data["hardware"] = all_entries - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) +/datum/computer_file/program/computerconfig/ui_interact(mob/user) + var/datum/vueui/ui = SSvueui.get_open_ui(user, src) if (!ui) - ui = new(user, src, ui_key, "laptop_configuration.tmpl", "NTOS Configuration Utility", 575, 700, state = state) - ui.auto_update_layout = 1 - ui.set_initial_data(data) - ui.open() + ui = new /datum/vueui/modularcomputer(user, src, "mcomputer-system-config", 575, 700, "NTOS Configuration Utility") + ui.open() + +/datum/computer_file/program/computerconfig/vueui_transfer(oldobj) + SSvueui.transfer_uis(oldobj, src, "mcomputer-system-config", 575, 700, "NTOS Configuration Utility") + return TRUE + +// Gaters data for ui +/datum/computer_file/program/computerconfig/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui) + . = ..() + data = . || data || list() + // Gather data for computer header + var/headerdata = get_header_data(data["_PC"]) + if(headerdata) + data["_PC"] = headerdata + . = data + + if(!computer) + return + + var/list/hardware = computer.get_all_components() + VUEUI_SET_CHECK(data["disk_size"], computer.hard_drive.max_capacity, ., data) + VUEUI_SET_CHECK(data["disk_used"], computer.hard_drive.used_capacity, ., data) + VUEUI_SET_CHECK(data["power_usage"], computer.last_power_usage, ., data) + if(!computer.battery_module) + VUEUI_SET_CHECK(data["battery"], 0, ., data) + else + LAZYINITLIST(data["battery"]) + VUEUI_SET_CHECK(data["battery"]["rating"], computer.battery_module.battery.maxcharge, ., data) + VUEUI_SET_CHECK(data["battery"]["percent"], round(computer.battery_module.battery.percent()), ., data) + + LAZYINITLIST(data["hardware"]) + for(var/obj/item/weapon/computer_hardware/H in hardware) + LAZYINITLIST(data["hardware"][H.name]) + for(var/v in list("name", "desc", "enabled", "critical", "power_usage")) + VUEUI_SET_CHECK(data["hardware"][H.name][v], H.vars[v], ., data) \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/system/file_browser.dm b/code/modules/modular_computers/file_system/programs/system/file_browser.dm index 6fda0a724ae..f73c8496f81 100644 --- a/code/modules/modular_computers/file_system/programs/system/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/system/file_browser.dm @@ -183,7 +183,7 @@ /datum/nano_module/program/computer_filemanager/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) var/list/data = host.initial_data() var/datum/computer_file/program/filemanager/PRG - //var/list/data = program.get_header_data() + //var/list/data = list("_PC" = program.get_header_data()) PRG = program var/obj/item/weapon/computer_hardware/hard_drive/HDD diff --git a/code/modules/modular_computers/file_system/programs/system/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/system/ntdownloader.dm index 52b4a7c2db2..26f09a61a22 100644 --- a/code/modules/modular_computers/file_system/programs/system/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/system/ntdownloader.dm @@ -153,7 +153,7 @@ if(!prog || !istype(prog)) return if(program) - data = program.get_header_data() + data = list("_PC" = program.get_header_data()) // This IF cuts on data transferred to client, so i guess it's worth it. if(prog.downloaderror) // Download errored. Wait until user resets the program. diff --git a/code/modules/vueui/external.dm b/code/modules/vueui/external.dm index d03accb8cf0..51b364842ef 100644 --- a/code/modules/vueui/external.dm +++ b/code/modules/vueui/external.dm @@ -11,18 +11,29 @@ /** * Alert UI host of data change made by Ui and gather initial data * - * @param newdata - a list containing current ui data, null obtaining initial data + * @param data - a list containing current ui data, null obtaining initial data * @param user - mob that has opened ui and get this data shown * @param ui - that is alerting of change / requesting initial data * * @return list containing changed data, null if data wasn't changed by host */ -/datum/proc/vueui_data_change(var/list/newdata, var/mob/user, var/datum/vueui/ui) +/datum/proc/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui) . = null var/datum/vueui_var_monitor/VM = SSvueui.get_var_monitor(src) if (VM) - LAZYINITLIST(newdata) - . = VM.update_data(src, newdata.Copy(), user, ui) + LAZYINITLIST(data) + . = VM.update_data(src, data.Copy(), user, ui) + +/** + * If some object wants to trasnfer it's uis to us, then we have to implemnt this proc to make transfer sucessfull + * It is recommended to use `SSvueui.transfer_uis` to perform ui transfer + * + * @param srcObject - Object that wanted to give away it's uis + * + * @return 0 if failed, 1 if success + */ +/datum/proc/vueui_transfer(var/srcObject) + return FALSE /mob/var/list/open_vueui_uis diff --git a/code/modules/vueui/ui.dm b/code/modules/vueui/ui.dm index c875462a09f..a92b1e3a0e4 100644 --- a/code/modules/vueui/ui.dm +++ b/code/modules/vueui/ui.dm @@ -30,7 +30,6 @@ main ui datum. // determines if ui state should be constantly be cheacked for updates var/auto_update_content = FALSE - /** * Creates a new ui * @@ -103,6 +102,19 @@ main ui datum. user << browse(null, "window=[windowid]") status = null +/** + * Resizes UI + * + * @param nwidth - width of this ui + * @param nheight - height of this ui + * + * @return nothing + */ +/datum/vueui/proc/resize(var/nwidth, var/nheight) + width = nwidth || width + height = nheight || height + winset(user, windowid, "size=[width]x[height];") + /** * Generates base html for this ui to be rendered. * @@ -252,6 +264,7 @@ main ui datum. href_list["vueui"] = src // Let's pass our UI object to object for it to do things. topicReturn = object.Topic(href, href_list) if(. || topicReturn) + if(topicReturn) check_for_change(FALSE, TRUE) . = null push_change() @@ -271,47 +284,62 @@ main ui datum. * Check for change and push that change of data * * @param force - determines should data be pushed even if no change is present + * @param nopush - determines new data be imediatly pushed. * - * @return nothing + * @return 1 if push happened, 0 if it didn't happen */ -/datum/vueui/proc/check_for_change(var/force = 0) +/datum/vueui/proc/check_for_change(var/force = FALSE, var/nopush = FALSE) + . = 0 if(!user.client) return if(status > STATUS_DISABLED) var/ret = object.vueui_data_change(data, user, src) if(ret) - push_change(ret) + if(!nopush) + push_change(ret) + else + src.data = ret + return 1 else if (force) - push_change(null) + if(!nopush) push_change(null) + return 1 else if (force && status == STATUS_DISABLED) - push_change(null) + if(!nopush) push_change(null) + return 1 /** * Set the current status (also known as visibility) of this ui. * - * @param state int The status to set, see the defines at the top of this file + * @param state - int The status to set, see the defines at the top of this file + * @param autopush - determines if data with new status should be automaticly pushed + * @param checkforchange - determines if check for change should be done, even if status didn't chnage. * - * @return nothing + * @return 1 if push should happen, 0 if shouldn't happen. */ -/datum/vueui/proc/set_status(var/nstatus, var/autopush = TRUE) +/datum/vueui/proc/set_status(var/nstatus, var/autopush = TRUE, var/checkforchange = FALSE) if (nstatus != status) // Only update if it is different status = nstatus if(nstatus > STATUS_DISABLED) - if(autopush) check_for_change(1) // Gather data and update it - return 1 + return check_for_change(TRUE, !autopush) // Gather data and update it else if (nstatus == STATUS_DISABLED && autopush) if(autopush) push_change(null) // Only update ui data return 1 else close() + else if (status > STATUS_DISABLED && checkforchange) + return check_for_change(TRUE, !autopush) + /** * Update the status (visibility) of this ui based on the user's status * + * @param autopush - determines if data with new status should be automaticly pushed + * @param checkforchange - determines if check for change should be done, even if status didn't chnage. + * * @return nothing */ -/datum/vueui/proc/update_status(var/autopush = TRUE) - . = set_status(object.CanUseTopic(user, state), autopush) +/datum/vueui/proc/update_status(var/autopush = TRUE, var/checkforchange = FALSE) + . = set_status(object.CanUseTopic(user, state), autopush, checkforchange) /** * Process this ui @@ -322,9 +350,10 @@ main ui datum. if (!object || !user || status < 0 || !user.client) close() return - update_status() if(auto_update_content) - check_for_change() + update_status(checkforchange = TRUE) + else + update_status() /** * Returns actuve theme on varous conditions @@ -334,4 +363,8 @@ main ui datum. /datum/vueui/proc/get_theme_class() return SStheming.get_html_theme_class(user) -#undef UIDEBUG +/datum/vueui/modularcomputer + header = "modular-computer" + +/datum/vueui/modularcomputer/get_theme_class() + return "theme-nano dark-theme" \ No newline at end of file diff --git a/html/changelogs/vueuicomputers.yml b/html/changelogs/vueuicomputers.yml new file mode 100644 index 00000000000..8174444d588 --- /dev/null +++ b/html/changelogs/vueuicomputers.yml @@ -0,0 +1,7 @@ +author: Karolis2011 +delete-after: True +changes: + - refactor: "Computers now support both UI systems." + - rscadd: "Ported main computer screen to VueUI." + - rscadd: "Ported computer configurator to VueUI." + - rscadd: "Ported computer management to VueUI." diff --git a/nano/templates/laptop_configuration.tmpl b/nano/templates/laptop_configuration.tmpl deleted file mode 100644 index 69af3bd6c0f..00000000000 --- a/nano/templates/laptop_configuration.tmpl +++ /dev/null @@ -1,70 +0,0 @@ -Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device.
-

Power Supply

-
- Battery Status: -
-{{if data.battery_exists}} -
- Active -
-
- Battery Rating: -
-
- {{:data.battery_rating}} -
-
- Battery Charge: -
-
- {{:helper.displayBar(data.battery_percent, 0, 100, (data.battery_percent <= 25) ? 'bad' : (data.battery_percent <= 50) ? 'average' : 'good')}} - {{:data.battery_percent}} % -
-{{else}} -
- Not Available -
-{{/if}} -
- Power Usage: -
-
- {{:data.power_usage}}W -
-

File System

-
- Used Capacity: -
-
- {{:helper.displayBar(data.disk_used, 0, data.disk_size, 'good')}} - {{:data.disk_used}}GQ / {{:data.disk_size}}GQ -
-

Computer Components

-{{for data.hardware}} -

{{:value.name}}

- {{:value.desc}}
-
- State: -
-
- {{:value.enabled ? "Enabled" : "Disabled"}} -
-
- Power Usage: -
-
- {{:value.powerusage}}W -
- {{if !value.critical}} -
- Toggle Component: -
-
- {{:helper.link("ON", null, {'PC_enable_component' : value.name}, value.enabled ? 'disabled' : null)}} - {{:helper.link("OFF", null, {'PC_disable_component' : value.name}, value.enabled ? null : 'disabled')}} -
- {{/if}} -

-{{/for}} -

-NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559 \ No newline at end of file diff --git a/nano/templates/laptop_mainscreen.tmpl b/nano/templates/laptop_mainscreen.tmpl deleted file mode 100644 index 3852c506a9a..00000000000 --- a/nano/templates/laptop_mainscreen.tmpl +++ /dev/null @@ -1,7 +0,0 @@ -No program loaded. Please select program from list below. - -{{for data.programs}} -
{{:helper.link(value.desc, null, {'PC_runprogram' : value.name})}} - {{:helper.link('X', null, {'PC_killprogram' : value.name}, (value.running ? null : 'disabled'))}} -{{/for}} -
\ No newline at end of file diff --git a/nano/templates/layout_default.tmpl b/nano/templates/layout_default.tmpl index 766fc39dac8..5af4784eae3 100644 --- a/nano/templates/layout_default.tmpl +++ b/nano/templates/layout_default.tmpl @@ -1,24 +1,24 @@ -{{if data.PC_hasheader}} +{{if data._PC}}
- {{if data.PC_batteryicon && data.PC_showbatteryicon}} -
+ {{if data._PC.batteryicon && data._PC.showbatteryicon}} + {{/if}} - {{if data.PC_batterypercent && data.PC_showbatteryicon}} - {{:data.PC_batterypercent}} + {{if data._PC.batterypercent && data._PC.showbatteryicon}} + {{:data._PC.batterypercent}} {{/if}} - {{if data.PC_ntneticon}} - + {{if data._PC.ntneticon}} + {{/if}} - {{if data.PC_apclinkicon}} - + {{if data._PC.apclinkicon}} + {{/if}} - {{if data.PC_stationtime}} - {{:data.PC_stationtime}} + {{if data._PC.stationtime}} + {{:data._PC.stationtime}} {{/if}} - {{for data.PC_programheaders}} - + {{for data._PC.programheaders}} + {{/for}}
@@ -26,7 +26,7 @@
{{:helper.link('Shutdown', null, {'PC_shutdown' : 1})}} - {{if data.PC_showexitprogram}} + {{if data._PC.showexitprogram}} {{:helper.link('Exit Program', null, {'PC_exit' : 1})}} {{:helper.link('Minimize Program', null, {'PC_minimize' : 1})}} {{/if}} diff --git a/vueui/src/assets/theme-nano.scss b/vueui/src/assets/theme-nano.scss index 2f78dc2021d..0018a0c2d42 100644 --- a/vueui/src/assets/theme-nano.scss +++ b/vueui/src/assets/theme-nano.scss @@ -132,8 +132,10 @@ .uiTitleWrapper { background: url(resources/theme-nano/uiTitleBackground.png) repeat center; - color: #E9C183; box-shadow: 0px 0px 8px 4px rgba(0,0,0,0.5); + .uiTitleText { + color: #E9C183; + } } .uiTitleFluff { @@ -205,7 +207,9 @@ } .uiTitleWrapper { background: url(resources/theme-nano/uiTitleBackground-light.png) repeat center; - color: #4C401C + .uiTitleText { + color: #4C401C; + } } .uiTitleFluff { background: url(resources/theme-nano/uiTitleFluff-light.png) 50% 50% no-repeat; diff --git a/vueui/src/components/header/default.vue b/vueui/src/components/header/default.vue index 000603dde01..22ce5f20205 100644 --- a/vueui/src/components/header/default.vue +++ b/vueui/src/components/header/default.vue @@ -1,9 +1,11 @@ @@ -29,6 +31,7 @@ export default { padding-bottom: 8px; float: none; background-color: #b9b9b9; + clear: both; } .uiTitleText { @@ -36,8 +39,6 @@ export default { display: inline-block; top: 4px; left: 18px; - width: 66%; - width: calc(100% - 36px - 42px - 18px); font-size: 16px; line-height: 20px; vertical-align: middle; diff --git a/vueui/src/components/header/modular-computer.vue b/vueui/src/components/header/modular-computer.vue new file mode 100644 index 00000000000..0bc3debfe49 --- /dev/null +++ b/vueui/src/components/header/modular-computer.vue @@ -0,0 +1,39 @@ + + + + + + + diff --git a/vueui/src/components/view/mcomputer/system/config.vue b/vueui/src/components/view/mcomputer/system/config.vue new file mode 100644 index 00000000000..c924a775a61 --- /dev/null +++ b/vueui/src/components/view/mcomputer/system/config.vue @@ -0,0 +1,41 @@ + + + \ No newline at end of file diff --git a/vueui/src/components/view/mcomputer/system/main.vue b/vueui/src/components/view/mcomputer/system/main.vue new file mode 100644 index 00000000000..de28919d05d --- /dev/null +++ b/vueui/src/components/view/mcomputer/system/main.vue @@ -0,0 +1,17 @@ + + + \ No newline at end of file diff --git a/vueui/src/components/view/mcomputer/system/manager.vue b/vueui/src/components/view/mcomputer/system/manager.vue new file mode 100644 index 00000000000..d45d17de9b2 --- /dev/null +++ b/vueui/src/components/view/mcomputer/system/manager.vue @@ -0,0 +1,44 @@ + + + \ No newline at end of file diff --git a/vueui/src/components/vui/progress.vue b/vueui/src/components/vui/progress.vue index acae5e53b54..7c279319db7 100644 --- a/vueui/src/components/vui/progress.vue +++ b/vueui/src/components/vui/progress.vue @@ -1,6 +1,6 @@ @@ -27,4 +27,16 @@ export default { } } } - \ No newline at end of file + + +