diff --git a/electron/greenworks.js b/electron/greenworks.js index a2dc7fa10..88a84ffeb 100644 --- a/electron/greenworks.js +++ b/electron/greenworks.js @@ -22,109 +22,96 @@ function error_process(err, error_callback) { if (err && error_callback) error_callback(err); } -greenworks.ugcGetItems = function (options, ugc_matching_type, ugc_query_type, success_callback, error_callback) { - if (typeof options !== "object") { - error_callback = success_callback; - success_callback = ugc_query_type; - ugc_query_type = ugc_matching_type; - ugc_matching_type = options; - options = { - app_id: greenworks.getAppId(), - page_num: 1, - }; - } - greenworks._ugcGetItems(options, ugc_matching_type, ugc_query_type, success_callback, error_callback); -}; +if (greenworks) { + greenworks.ugcGetItems = function (options, ugc_matching_type, ugc_query_type, success_callback, error_callback) { + if (typeof options !== "object") { + error_callback = success_callback; + success_callback = ugc_query_type; + ugc_query_type = ugc_matching_type; + ugc_matching_type = options; + options = { + app_id: greenworks.getAppId(), + page_num: 1, + }; + } + greenworks._ugcGetItems(options, ugc_matching_type, ugc_query_type, success_callback, error_callback); + }; -greenworks.ugcGetUserItems = function ( - options, - ugc_matching_type, - ugc_list_sort_order, - ugc_list, - success_callback, - error_callback, -) { - if (typeof options !== "object") { - error_callback = success_callback; - success_callback = ugc_list; - ugc_list = ugc_list_sort_order; - ugc_list_sort_order = ugc_matching_type; - ugc_matching_type = options; - options = { - app_id: greenworks.getAppId(), - page_num: 1, - }; - } - greenworks._ugcGetUserItems( + greenworks.ugcGetUserItems = function ( options, ugc_matching_type, ugc_list_sort_order, ugc_list, success_callback, error_callback, - ); -}; + ) { + if (typeof options !== "object") { + error_callback = success_callback; + success_callback = ugc_list; + ugc_list = ugc_list_sort_order; + ugc_list_sort_order = ugc_matching_type; + ugc_matching_type = options; + options = { + app_id: greenworks.getAppId(), + page_num: 1, + }; + } + greenworks._ugcGetUserItems( + options, + ugc_matching_type, + ugc_list_sort_order, + ugc_list, + success_callback, + error_callback, + ); + }; -greenworks.ugcSynchronizeItems = function (options, sync_dir, success_callback, error_callback) { - if (typeof options !== "object") { - error_callback = success_callback; - success_callback = sync_dir; - sync_dir = options; - options = { - app_id: greenworks.getAppId(), - page_num: 1, - }; - } - greenworks._ugcSynchronizeItems(options, sync_dir, success_callback, error_callback); -}; + greenworks.ugcSynchronizeItems = function (options, sync_dir, success_callback, error_callback) { + if (typeof options !== "object") { + error_callback = success_callback; + success_callback = sync_dir; + sync_dir = options; + options = { + app_id: greenworks.getAppId(), + page_num: 1, + }; + } + greenworks._ugcSynchronizeItems(options, sync_dir, success_callback, error_callback); + }; -greenworks.publishWorkshopFile = function ( - options, - file_path, - image_path, - title, - description, - success_callback, - error_callback, -) { - if (typeof options !== "object") { - error_callback = success_callback; - success_callback = description; - description = title; - title = image_path; - image_path = file_path; - file_path = options; - options = { - app_id: greenworks.getAppId(), - tags: [], - }; - } - greenworks._publishWorkshopFile(options, file_path, image_path, title, description, success_callback, error_callback); -}; + greenworks.publishWorkshopFile = function ( + options, + file_path, + image_path, + title, + description, + success_callback, + error_callback, + ) { + if (typeof options !== "object") { + error_callback = success_callback; + success_callback = description; + description = title; + title = image_path; + image_path = file_path; + file_path = options; + options = { + app_id: greenworks.getAppId(), + tags: [], + }; + } + greenworks._publishWorkshopFile( + options, + file_path, + image_path, + title, + description, + success_callback, + error_callback, + ); + }; -greenworks.updatePublishedWorkshopFile = function ( - options, - published_file_handle, - file_path, - image_path, - title, - description, - success_callback, - error_callback, -) { - if (typeof options !== "object") { - error_callback = success_callback; - success_callback = description; - description = title; - title = image_path; - image_path = file_path; - file_path = published_file_handle; - published_file_handle = options; - options = { - tags: [], // No tags are set - }; - } - greenworks._updatePublishedWorkshopFile( + greenworks.updatePublishedWorkshopFile = function ( options, published_file_handle, file_path, @@ -133,161 +120,184 @@ greenworks.updatePublishedWorkshopFile = function ( description, success_callback, error_callback, - ); -}; + ) { + if (typeof options !== "object") { + error_callback = success_callback; + success_callback = description; + description = title; + title = image_path; + image_path = file_path; + file_path = published_file_handle; + published_file_handle = options; + options = { + tags: [], // No tags are set + }; + } + greenworks._updatePublishedWorkshopFile( + options, + published_file_handle, + file_path, + image_path, + title, + description, + success_callback, + error_callback, + ); + }; -// An utility function for publish related APIs. -// It processes remains steps after saving files to Steam Cloud. -function file_share_process(file_name, image_name, next_process_func, error_callback, progress_callback) { - if (progress_callback) progress_callback("Completed on saving files on Steam Cloud."); - greenworks.fileShare( + // An utility function for publish related APIs. + // It processes remains steps after saving files to Steam Cloud. + function file_share_process(file_name, image_name, next_process_func, error_callback, progress_callback) { + if (progress_callback) progress_callback("Completed on saving files on Steam Cloud."); + greenworks.fileShare( + file_name, + function () { + greenworks.fileShare( + image_name, + function () { + next_process_func(); + }, + function (err) { + error_process(err, error_callback); + }, + ); + }, + function (err) { + error_process(err, error_callback); + }, + ); + } + + // Publishing user generated content(ugc) to Steam contains following steps: + // 1. Save file and image to Steam Cloud. + // 2. Share the file and image. + // 3. publish the file to workshop. + greenworks.ugcPublish = function ( file_name, - function () { - greenworks.fileShare( + title, + description, + image_name, + success_callback, + error_callback, + progress_callback, + ) { + var publish_file_process = function () { + if (progress_callback) progress_callback("Completed on sharing files."); + greenworks.publishWorkshopFile( + file_name, image_name, - function () { - next_process_func(); + title, + description, + function (publish_file_id) { + success_callback(publish_file_id); }, function (err) { error_process(err, error_callback); }, ); - }, - function (err) { - error_process(err, error_callback); - }, - ); + }; + greenworks.saveFilesToCloud( + [file_name, image_name], + function () { + file_share_process(file_name, image_name, publish_file_process, error_callback, progress_callback); + }, + function (err) { + error_process(err, error_callback); + }, + ); + }; + + // Update publish ugc steps: + // 1. Save new file and image to Steam Cloud. + // 2. Share file and images. + // 3. Update published file. + greenworks.ugcPublishUpdate = function ( + published_file_id, + file_name, + title, + description, + image_name, + success_callback, + error_callback, + progress_callback, + ) { + var update_published_file_process = function () { + if (progress_callback) progress_callback("Completed on sharing files."); + greenworks.updatePublishedWorkshopFile( + published_file_id, + file_name, + image_name, + title, + description, + function () { + success_callback(); + }, + function (err) { + error_process(err, error_callback); + }, + ); + }; + + greenworks.saveFilesToCloud( + [file_name, image_name], + function () { + file_share_process(file_name, image_name, update_published_file_process, error_callback, progress_callback); + }, + function (err) { + error_process(err, error_callback); + }, + ); + }; + + // Greenworks Utils APIs implmentation. + greenworks.Utils.move = function (source_dir, target_dir, success_callback, error_callback) { + fs.rename(source_dir, target_dir, function (err) { + if (err) { + if (error_callback) error_callback(err); + return; + } + if (success_callback) success_callback(); + }); + }; + + greenworks.init = function () { + if (this.initAPI()) return true; + if (!this.isSteamRunning()) throw new Error("Steam initialization failed. Steam is not running."); + var appId; + try { + appId = fs.readFileSync("steam_appid.txt", "utf8"); + } catch (e) { + throw new Error( + "Steam initialization failed. Steam is running," + + "but steam_appid.txt is missing. Expected to find it in: " + + require("path").resolve("steam_appid.txt"), + ); + } + if (!/^\d+ *\r?\n?$/.test(appId)) { + throw new Error( + "Steam initialization failed. " + + "steam_appid.txt appears to be invalid; " + + "it should contain a numeric ID: " + + appId, + ); + } + throw new Error( + "Steam initialization failed, but Steam is running, " + + "and steam_appid.txt is present and valid." + + "Maybe that's not really YOUR app ID? " + + appId.trim(), + ); + }; + + var EventEmitter = require("events").EventEmitter; + greenworks.__proto__ = EventEmitter.prototype; + EventEmitter.call(greenworks); + + greenworks._steam_events.on = function () { + greenworks.emit.apply(greenworks, arguments); + }; + + process.versions["greenworks"] = greenworks._version; } -// Publishing user generated content(ugc) to Steam contains following steps: -// 1. Save file and image to Steam Cloud. -// 2. Share the file and image. -// 3. publish the file to workshop. -greenworks.ugcPublish = function ( - file_name, - title, - description, - image_name, - success_callback, - error_callback, - progress_callback, -) { - var publish_file_process = function () { - if (progress_callback) progress_callback("Completed on sharing files."); - greenworks.publishWorkshopFile( - file_name, - image_name, - title, - description, - function (publish_file_id) { - success_callback(publish_file_id); - }, - function (err) { - error_process(err, error_callback); - }, - ); - }; - greenworks.saveFilesToCloud( - [file_name, image_name], - function () { - file_share_process(file_name, image_name, publish_file_process, error_callback, progress_callback); - }, - function (err) { - error_process(err, error_callback); - }, - ); -}; - -// Update publish ugc steps: -// 1. Save new file and image to Steam Cloud. -// 2. Share file and images. -// 3. Update published file. -greenworks.ugcPublishUpdate = function ( - published_file_id, - file_name, - title, - description, - image_name, - success_callback, - error_callback, - progress_callback, -) { - var update_published_file_process = function () { - if (progress_callback) progress_callback("Completed on sharing files."); - greenworks.updatePublishedWorkshopFile( - published_file_id, - file_name, - image_name, - title, - description, - function () { - success_callback(); - }, - function (err) { - error_process(err, error_callback); - }, - ); - }; - - greenworks.saveFilesToCloud( - [file_name, image_name], - function () { - file_share_process(file_name, image_name, update_published_file_process, error_callback, progress_callback); - }, - function (err) { - error_process(err, error_callback); - }, - ); -}; - -// Greenworks Utils APIs implmentation. -greenworks.Utils.move = function (source_dir, target_dir, success_callback, error_callback) { - fs.rename(source_dir, target_dir, function (err) { - if (err) { - if (error_callback) error_callback(err); - return; - } - if (success_callback) success_callback(); - }); -}; - -greenworks.init = function () { - if (this.initAPI()) return true; - if (!this.isSteamRunning()) throw new Error("Steam initialization failed. Steam is not running."); - var appId; - try { - appId = fs.readFileSync("steam_appid.txt", "utf8"); - } catch (e) { - throw new Error( - "Steam initialization failed. Steam is running," + - "but steam_appid.txt is missing. Expected to find it in: " + - require("path").resolve("steam_appid.txt"), - ); - } - if (!/^\d+ *\r?\n?$/.test(appId)) { - throw new Error( - "Steam initialization failed. " + - "steam_appid.txt appears to be invalid; " + - "it should contain a numeric ID: " + - appId, - ); - } - throw new Error( - "Steam initialization failed, but Steam is running, " + - "and steam_appid.txt is present and valid." + - "Maybe that's not really YOUR app ID? " + - appId.trim(), - ); -}; - -var EventEmitter = require("events").EventEmitter; -greenworks.__proto__ = EventEmitter.prototype; -EventEmitter.call(greenworks); - -greenworks._steam_events.on = function () { - greenworks.emit.apply(greenworks, arguments); -}; - -process.versions["greenworks"] = greenworks._version; - module.exports = greenworks; diff --git a/electron/main.js b/electron/main.js index a042b6a08..edd61eff6 100644 --- a/electron/main.js +++ b/electron/main.js @@ -25,7 +25,7 @@ process.on("uncaughtException", function () { // We want to fail gracefully if we cannot connect to Steam try { - if (greenworks.init()) { + if (greenworks && greenworks.init()) { log.info("Steam API has been initialized."); } else { const error = "Steam API has failed to initialize."; diff --git a/electron/menu.js b/electron/menu.js index 6b53367eb..c7449efd8 100644 --- a/electron/menu.js +++ b/electron/menu.js @@ -8,6 +8,39 @@ const storage = require("./storage"); const config = new Config(); function getMenu(window) { + const canZoomIn = utils.getZoomFactor() <= 2; + const zoomIn = () => { + const currentZoom = utils.getZoomFactor(); + const newZoom = currentZoom + 0.1; + if (newZoom <= 2.0) { + utils.setZoomFactor(window, newZoom); + refreshMenu(window); + } else { + log.log("Max zoom out"); + utils.writeToast(window, "Cannot zoom in anymore", "warning"); + } + }; + + const canZoomOut = utils.getZoomFactor() >= 0.5; + const zoomOut = () => { + const currentZoom = utils.getZoomFactor(); + const newZoom = currentZoom - 0.1; + if (newZoom >= 0.5) { + utils.setZoomFactor(window, newZoom); + refreshMenu(window); + } else { + log.log("Max zoom in"); + utils.writeToast(window, "Cannot zoom out anymore", "warning"); + } + }; + + const canResetZoom = utils.getZoomFactor() !== 1; + const resetZoom = () => { + utils.setZoomFactor(window, 1); + refreshMenu(window); + log.log("Reset zoom"); + }; + return Menu.buildFromTemplate([ { label: "File", @@ -289,45 +322,45 @@ function getMenu(window) { submenu: [ { label: "Zoom In", - enabled: utils.getZoomFactor() <= 2, + enabled: canZoomIn, accelerator: "CommandOrControl+numadd", - click: () => { - const currentZoom = utils.getZoomFactor(); - const newZoom = currentZoom + 0.1; - if (newZoom <= 2.0) { - utils.setZoomFactor(window, newZoom); - refreshMenu(window); - } else { - log.log("Max zoom out"); - utils.writeToast(window, "Cannot zoom in anymore", "warning"); - } - }, + click: zoomIn, + }, + { + label: "Zoom In (non numpad)", + enabled: canZoomIn, + visible: false, + accelerator: "CommandOrControl+Plus", + acceleratorWorksWhenHidden: true, + click: zoomIn, }, { label: "Zoom Out", - enabled: utils.getZoomFactor() >= 0.5, + enabled: canZoomOut, accelerator: "CommandOrControl+numsub", - click: () => { - const currentZoom = utils.getZoomFactor(); - const newZoom = currentZoom - 0.1; - if (newZoom >= 0.5) { - utils.setZoomFactor(window, newZoom); - refreshMenu(window); - } else { - log.log("Max zoom in"); - utils.writeToast(window, "Cannot zoom out anymore", "warning"); - } - }, + click: zoomOut, + }, + { + label: "Zoom Out (non numpad)", + enabled: canZoomOut, + accelerator: "CommandOrControl+-", + visible: false, + acceleratorWorksWhenHidden: true, + click: zoomOut, }, { label: "Reset Zoom", - enabled: utils.getZoomFactor() !== 1, + enabled: canResetZoom, accelerator: "CommandOrControl+num0", - click: () => { - utils.setZoomFactor(window, 1); - refreshMenu(window); - log.log("Reset zoom"); - }, + click: resetZoom, + }, + { + label: "Reset Zoom (non numpad)", + enabled: canResetZoom, + accelerator: "CommandOrControl+0", + visible: false, + acceleratorWorksWhenHidden: true, + click: resetZoom, }, ], },