Upload files

This commit is contained in:
SandPoot
2021-09-28 22:03:17 -03:00
parent caf68e62f5
commit b23b88524d
13 changed files with 571 additions and 138 deletions
+3
View File
@@ -206,6 +206,9 @@ GLOBAL_LIST_EMPTY(uplinks)
return data
/datum/component/uplink/ui_act(action, params)
. = ..()
if(.)
return
if(!active)
return
switch(action)
+145 -116
View File
@@ -23,6 +23,8 @@
/obj/item/storage/backpack,
/obj/item/storage/belt
)
/// Temporary messages
var/temp
/obj/machinery/gear_painter/Initialize(mapload)
. = ..()
@@ -69,6 +71,8 @@
if(!QDELETED(H))
H.release()
insert_mob(victim, user)
temp = "[victim] has been inserted."
SStgui.update_uis(src)
if(is_type_in_list(I, allowed_types) && is_operational())
if(!user.transferItemToLoc(I, src))
@@ -80,6 +84,9 @@
inserted = I
update_icon()
temp = "[I] has been inserted."
SStgui.update_uis(src)
else
return ..()
@@ -101,137 +108,159 @@
/obj/machinery/gear_painter/AltClick(mob/user)
. = ..()
if(!user.CanReach(src))
drop_item()
/obj/machinery/gear_painter/proc/drop_item()
if(!usr.CanReach(src))
return
if(!inserted)
return
to_chat(user, "<span class='notice'>You remove [inserted] from [src]")
to_chat(usr, "<span class='notice'>You remove [inserted] from [src]")
inserted.forceMove(drop_location())
var/mob/living/user = usr
if(istype(user))
user.put_in_hands(inserted)
inserted = null
update_icon()
updateUsrDialog()
SStgui.update_uis(src)
/obj/machinery/gear_painter/ui_interact(mob/user)
if(!is_operational())
return
user.set_machine(src)
var/list/dat = list("<TITLE>Color Mate Control Panel</TITLE><BR>")
if(!inserted)
dat += "No item inserted."
/obj/machinery/gear_painter/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "Colormate", src.name)
ui.set_autoupdate(FALSE) //This might be a bit intensive, better to not update it every few ticks
ui.open()
/obj/machinery/gear_painter/ui_data(mob/user)
. = list()
.["matrixactive"] = matrix_mode
.["matrixcolors"] = list(
"rr" = color_matrix_last[1],
"rg" = color_matrix_last[2],
"rb" = color_matrix_last[3],
"gr" = color_matrix_last[4],
"gg" = color_matrix_last[5],
"gb" = color_matrix_last[6],
"br" = color_matrix_last[7],
"bg" = color_matrix_last[8],
"bb" = color_matrix_last[9],
"cr" = color_matrix_last[10],
"cg" = color_matrix_last[11],
"cb" = color_matrix_last[12]
)
if(temp)
.["temp"] = temp
if(inserted)
.["item"] = list()
.["item"]["name"] = inserted.name
.["item"]["sprite"] = icon2base64(getFlatIcon(inserted,defdir=SOUTH,no_anim=TRUE))
.["item"]["preview"] = icon2base64(build_preview())
else
dat += "Item inserted: [inserted]<HR>"
dat += "<a href='?src=[REF(src)];toggle_matrix_mode=1'>Matrix mode: [matrix_mode? "On" : "Off"]</a>"
if(!matrix_mode)
dat += "<A href='?src=\ref[src];select=1'>Select new color.</A><BR>"
dat += "Color: <font color='[activecolor]'>&#9899;</font>"
dat += "<A href='?src=\ref[src];paint=1'>Apply new color.</A><BR><BR>"
.["item"] = null
/obj/machinery/gear_painter/ui_act(action, params)
. = ..()
if(.)
return
if(inserted)
switch(action)
if("switch_modes")
matrix_mode = text2num(params["mode"])
return TRUE
if("choose_color")
var/chosen_color = input(usr, "Choose a color: ", "Colormate color picking", activecolor) as color|null
if(chosen_color)
activecolor = chosen_color
return TRUE
if("paint")
if(!check_valid_color(activecolor, usr))
return TRUE
inserted.add_atom_colour(activecolor, FIXED_COLOUR_PRIORITY)
playsound(src, 'sound/effects/spray3.ogg', 50, 1)
temp = "Painted Successfully!"
return TRUE
if("drop")
temp = "Ejected \the [inserted]!"
drop_item()
return TRUE
if("clear")
inserted.remove_atom_colour(FIXED_COLOUR_PRIORITY)
playsound(src, 'sound/effects/spray3.ogg', 50, 1)
temp = "Cleared Successfully!"
return TRUE
if("set_matrix_color")
color_matrix_last[params["color"]] = params["value"]
return TRUE
if("matrix_paint")
var/list/cm = rgb_construct_color_matrix(
text2num(color_matrix_last[1]),
text2num(color_matrix_last[2]),
text2num(color_matrix_last[3]),
text2num(color_matrix_last[4]),
text2num(color_matrix_last[5]),
text2num(color_matrix_last[6]),
text2num(color_matrix_last[7]),
text2num(color_matrix_last[8]),
text2num(color_matrix_last[9]),
text2num(color_matrix_last[10]),
text2num(color_matrix_last[11]),
text2num(color_matrix_last[12])
)
if(!check_valid_color(cm, usr))
return TRUE
inserted.add_atom_colour(cm, FIXED_COLOUR_PRIORITY)
playsound(src, 'sound/effects/spray3.ogg', 50, 1)
temp = "Matrix Painted Successfully!"
return TRUE
/// Produces the preview image of the item, used in the UI, the way the color is not stacking is a sin.
/obj/machinery/gear_painter/proc/build_preview()
if(inserted) //sanity
if(matrix_mode)
var/list/cm = rgb_construct_color_matrix(
text2num(color_matrix_last[1]),
text2num(color_matrix_last[2]),
text2num(color_matrix_last[3]),
text2num(color_matrix_last[4]),
text2num(color_matrix_last[5]),
text2num(color_matrix_last[6]),
text2num(color_matrix_last[7]),
text2num(color_matrix_last[8]),
text2num(color_matrix_last[9]),
text2num(color_matrix_last[10]),
text2num(color_matrix_last[11]),
text2num(color_matrix_last[12])
)
if(!check_valid_color(cm, usr))
temp = "Failed to generate preview: Invalid color!"
return getFlatIcon(inserted, defdir=SOUTH, no_anim=TRUE)
var/cur_color = inserted.color
inserted.color = null
inserted.color = cm
var/icon/preview = getFlatIcon(inserted, defdir=SOUTH, no_anim=TRUE)
inserted.color = cur_color
. = preview
else
// POGGERS
#define MATRIX_FIELD(field, default) "<b><label for='[##field]'>[##field]</label></b> <input type='number' step='0.001' name='[field]' value='[default]'>"
dat += "<br><form name='matrix paint' action='?src=[REF(src)]'>"
dat += "<input type='hidden' name='src' value='[REF(src)]'>"
dat += "<input type='hidden' name='matrix_paint' value='1'"
dat += "<br><br>"
dat += MATRIX_FIELD("rr", color_matrix_last[1])
dat += MATRIX_FIELD("gr", color_matrix_last[4])
dat += MATRIX_FIELD("br", color_matrix_last[7])
dat += "<br><br>"
dat += MATRIX_FIELD("rg", color_matrix_last[2])
dat += MATRIX_FIELD("gg", color_matrix_last[5])
dat += MATRIX_FIELD("bg", color_matrix_last[8])
dat += "<br><br>"
dat += MATRIX_FIELD("rb", color_matrix_last[3])
dat += MATRIX_FIELD("gb", color_matrix_last[6])
dat += MATRIX_FIELD("bb", color_matrix_last[9])
dat += "<br><br>"
dat += MATRIX_FIELD("cr", color_matrix_last[10])
dat += MATRIX_FIELD("cg", color_matrix_last[11])
dat += MATRIX_FIELD("cb", color_matrix_last[12])
dat += "<br><br>"
dat += "<input type='submit' value='Matrix Paint'>"
dat += "</form><br>"
#undef MATRIX_FIELD
dat += "<A href='?src=\ref[src];clear=1'>Remove paintjob.</A><BR><BR>"
dat += "<A href='?src=\ref[src];eject=1'>Eject item.</A><BR><BR>"
if(!check_valid_color(activecolor, usr))
temp = "Failed to generate preview: Invalid color!"
return getFlatIcon(inserted, defdir=SOUTH, no_anim=TRUE)
var/datum/browser/menu = new(user, "colormate","Color Mate Control Panel", 800, 600, src)
menu.set_content(dat.Join(""))
menu.open()
var/cur_color = inserted.color
inserted.color = null
inserted.color = activecolor
var/icon/preview = getFlatIcon(inserted, defdir=SOUTH, no_anim=TRUE)
inserted.color = cur_color
/obj/machinery/gear_painter/Topic(href, href_list)
if((. = ..()))
return
add_fingerprint(usr)
if(href_list["close"])
usr << browse(null, "window=colormate")
return
if(href_list["select"])
var/newcolor = input(usr, "Choose a color.", "", activecolor) as color|null
if(newcolor)
activecolor = newcolor
updateUsrDialog()
if(href_list["paint"])
if(!inserted)
return
if(!check_valid_color(activecolor, usr))
return
inserted.add_atom_colour(activecolor, FIXED_COLOUR_PRIORITY)
playsound(src, 'sound/effects/spray3.ogg', 50, 1)
updateUsrDialog()
if(href_list["toggle_matrix_mode"])
matrix_mode = !matrix_mode
updateUsrDialog()
if(href_list["matrix_paint"])
if(!inserted)
return
// assemble matrix
var/list/cm = rgb_construct_color_matrix(
text2num(href_list["rr"]),
text2num(href_list["rg"]),
text2num(href_list["rb"]),
text2num(href_list["gr"]),
text2num(href_list["gg"]),
text2num(href_list["gb"]),
text2num(href_list["br"]),
text2num(href_list["bg"]),
text2num(href_list["bb"]),
text2num(href_list["cr"]),
text2num(href_list["cg"]),
text2num(href_list["cb"])
)
color_matrix_last = cm.Copy()
if(!check_valid_color(cm, usr))
return
inserted.add_atom_colour(cm, FIXED_COLOUR_PRIORITY)
playsound(src, 'sound/effects/spray3.ogg', 50, 1)
updateUsrDialog()
if(href_list["clear"])
if(!inserted)
return
inserted.remove_atom_colour(FIXED_COLOUR_PRIORITY)
playsound(src, 'sound/effects/spray3.ogg', 50, 1)
updateUsrDialog()
if(href_list["eject"])
if(!inserted)
return
inserted.forceMove(drop_location())
inserted = null
update_icon()
updateUsrDialog()
. = preview
/obj/machinery/gear_painter/proc/check_valid_color(list/cm, mob/user)
if(!islist(cm)) // normal
var/list/HSV = ReadHSV(RGBtoHSV(cm))
if(HSV[3] < minimum_normal_lightness)
to_chat(user, "<span class='warning'>[cm] is far too dark (min lightness [minimum_normal_lightness]!</span>")
temp = "[cm] is far too dark (min lightness [minimum_normal_lightness]!"
return FALSE
return TRUE
else // matrix
@@ -245,6 +274,6 @@
COLORTEST("FFFFFF", cm)
#undef COLORTEST
if(passed < minimum_matrix_tests)
to_chat(user, "<span class='warning'>[english_list(color)] is not allowed (pased [passed] out of 4, minimum [minimum_matrix_tests], minimum lightness [minimum_matrix_lightness]).</span>")
temp = "[english_list(color)] is not allowed (passed [passed] out of 4, minimum [minimum_matrix_tests], minimum lightness [minimum_matrix_lightness])."
return FALSE
return TRUE
+3
View File
@@ -200,6 +200,9 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
return b["totaldam"] - a["totaldam"]
/datum/crewmonitor/ui_act(action,params)
. = ..()
if(.)
return
var/mob/living/silicon/ai/AI = usr
if(!istype(AI))
return
@@ -86,6 +86,9 @@
.["machine"]["chang_freq_value"] = change_freq_value
/obj/machinery/telecomms/ui_act(action, params, datum/tgui/ui)
. = ..()
if(.)
return
if(!canInteract(usr))
if(ui)
ui.close() //haha no.
+78
View File
@@ -11,6 +11,10 @@ GLOBAL_LIST_EMPTY(asset_datums)
/datum/asset
var/_abstract = /datum/asset
var/cached_url_mappings
/// Whether or not this asset should be loaded in the "early assets" SS
var/early = FALSE
/datum/asset/New()
GLOB.asset_datums[type] = src
@@ -19,6 +23,13 @@ GLOBAL_LIST_EMPTY(asset_datums)
/datum/asset/proc/get_url_mappings()
return list()
/// Returns a cached tgui message of URL mappings
/datum/asset/proc/get_serialized_url_mappings()
if (isnull(cached_url_mappings))
cached_url_mappings = TGUI_CREATE_MESSAGE("asset/mappings", get_url_mappings())
return cached_url_mappings
/datum/asset/proc/register()
return
@@ -169,6 +180,8 @@ GLOBAL_LIST_EMPTY(asset_datums)
I = icon(I, icon_state=icon_state, dir=dir, frame=frame, moving=moving)
if (!I || !length(icon_states(I))) // that direction or state doesn't exist
return
//any sprite modifications we want to do (aka, coloring a greyscaled asset)
I = ModifyInserted(I)
var/size_id = "[I.Width()]x[I.Height()]"
var/size = sizes[size_id]
@@ -185,6 +198,15 @@ GLOBAL_LIST_EMPTY(asset_datums)
sizes[size_id] = size = list(1, I, null)
sprites[sprite_name] = list(size_id, 0)
/**
* A simple proc handing the Icon for you to modify before it gets turned into an asset.
*
* Arguments:
* * I: icon being turned into an asset
*/
/datum/asset/spritesheet/proc/ModifyInserted(icon/pre_asset)
return pre_asset
/datum/asset/spritesheet/proc/InsertAll(prefix, icon/I, list/directions)
if (length(prefix))
prefix = "[prefix]-"
@@ -217,6 +239,19 @@ GLOBAL_LIST_EMPTY(asset_datums)
var/size_id = sprite[SPR_SIZE]
return {"[name][size_id] [sprite_name]"}
/**
* Returns the size class (ex design32x32) for a given sprite's icon
*
* Arguments:
* * sprite_name - The sprite to get the size of
*/
/datum/asset/spritesheet/proc/icon_size_id(sprite_name)
var/sprite = sprites[sprite_name]
if (!sprite)
return null
var/size_id = sprite[SPR_SIZE]
return "[name][size_id]"
#undef SPR_SIZE
#undef SPR_IDX
#undef SPRSZ_COUNT
@@ -224,6 +259,24 @@ GLOBAL_LIST_EMPTY(asset_datums)
#undef SPRSZ_STRIPPED
/datum/asset/changelog_item
_abstract = /datum/asset/changelog_item
var/item_filename
/datum/asset/changelog_item/New(date)
item_filename = sanitize_filename("[date].yml")
SSassets.transport.register_asset(item_filename, file("html/changelogs/archive/" + item_filename))
/datum/asset/changelog_item/send(client)
if (!item_filename)
return
. = SSassets.transport.send_assets(client, item_filename)
/datum/asset/changelog_item/get_url_mappings()
if (!item_filename)
return
. = list("[item_filename]" = SSassets.transport.get_asset_url(item_filename))
/datum/asset/spritesheet/simple
_abstract = /datum/asset/spritesheet/simple
var/list/assets
@@ -315,3 +368,28 @@ GLOBAL_LIST_EMPTY(asset_datums)
/datum/asset/simple/namespaced/proc/get_htmlloader(filename)
return url2htmlloader(SSassets.transport.get_asset_url(filename, assets[filename]))
/// A subtype to generate a JSON file from a list
/datum/asset/json
_abstract = /datum/asset/json
/// The filename, will be suffixed with ".json"
var/name
/datum/asset/json/send(client)
return SSassets.transport.send_assets(client, "data/[name].json")
/datum/asset/json/get_url_mappings()
return list(
"[name].json" = SSassets.transport.get_asset_url("data/[name].json"),
)
/datum/asset/json/register()
var/filename = "data/[name].json"
fdel(filename)
text2file(json_encode(generate()), filename)
SSassets.transport.register_asset(filename, fcopy_rsc(filename))
fdel(filename)
/// Returns the data that will be JSON encoded
/datum/asset/json/proc/generate()
SHOULD_CALL_PARENT(FALSE)
CRASH("generate() not implemented for [type]!")
+3
View File
@@ -128,6 +128,9 @@
return data
/obj/machinery/computer/cargo/express/ui_act(action, params, datum/tgui/ui)
. = ..()
if(.)
return
switch(action)
if("LZCargo")
usingBeacon = FALSE
+3
View File
@@ -232,6 +232,9 @@
return data
/obj/structure/chisel_message/ui_act(action, params, datum/tgui/ui)
. = ..()
if(.)
return
var/mob/user = usr
var/is_admin = check_rights_for(user.client, R_ADMIN)
var/is_creator = user.ckey == creator_key
+2 -1
View File
@@ -74,7 +74,7 @@
* return bool If the user's input has been handled and the UI should update.
*/
/datum/proc/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
// SHOULD_CALL_PARENT(TRUE)
SHOULD_CALL_PARENT(TRUE)
// If UI is not interactive or usr calling Topic is not the UI user, bail.
if(!ui || ui.status != UI_INTERACTIVE)
return TRUE
@@ -145,6 +145,7 @@
* client/verb/uiclose(), which closes the ui window
*/
/datum/proc/ui_close(mob/user)
SIGNAL_HANDLER
/**
* verb
+6 -1
View File
@@ -58,11 +58,16 @@
src.interface = interface
if(title)
src.title = title
src.state = src_object.ui_state()
src.state = src_object.ui_state(user)
// Deprecated
if(ui_x && ui_y)
src.window_size = list(ui_x, ui_y)
/datum/tgui/Destroy()
user = null
src_object = null
return ..()
/**
* public
*
+14 -8
View File
@@ -8,8 +8,9 @@
* * title - The of the alert modal, shown on the top of the TGUI window.
* * buttons - The options that can be chosen by the user, each string is assigned a button on the UI.
* * timeout - The timeout of the alert, after which the modal will close and qdel itself. Set to zero for no timeout.
* * autofocus - The bool that controls if this alert should grab window focus.
*/
/proc/tgui_alert(mob/user, message = null, title = null, list/buttons = list("Ok"), timeout = 0)
/proc/tgui_alert(mob/user, message = null, title = null, list/buttons = list("Ok"), timeout = 0, autofocus = TRUE)
if (!user)
user = usr
if (!istype(user))
@@ -18,7 +19,7 @@
user = client.mob
else
return
var/datum/tgui_modal/alert = new(user, message, title, buttons, timeout)
var/datum/tgui_modal/alert = new(user, message, title, buttons, timeout, autofocus)
alert.ui_interact(user)
alert.wait()
if (alert)
@@ -36,8 +37,9 @@
* * buttons - The options that can be chosen by the user, each string is assigned a button on the UI.
* * callback - The callback to be invoked when a choice is made.
* * timeout - The timeout of the alert, after which the modal will close and qdel itself. Disabled by default, can be set to seconds otherwise.
* * autofocus - The bool that controls if this alert should grab window focus.
*/
/proc/tgui_alert_async(mob/user, message = null, title = null, list/buttons = list("Ok"), datum/callback/callback, timeout = 0)
/proc/tgui_alert_async(mob/user, message = null, title = null, list/buttons = list("Ok"), datum/callback/callback, timeout = 0, autofocus = TRUE)
if (!user)
user = usr
if (!istype(user))
@@ -46,7 +48,7 @@
user = client.mob
else
return
var/datum/tgui_modal/async/alert = new(user, message, title, buttons, callback, timeout)
var/datum/tgui_modal/async/alert = new(user, message, title, buttons, callback, timeout, autofocus)
alert.ui_interact(user)
/**
@@ -68,13 +70,16 @@
var/start_time
/// The lifespan of the tgui_modal, after which the window will close and delete itself.
var/timeout
/// The bool that controls if this modal should grab window focus
var/autofocus
/// Boolean field describing if the tgui_modal was closed by the user.
var/closed
/datum/tgui_modal/New(mob/user, message, title, list/buttons, timeout)
/datum/tgui_modal/New(mob/user, message, title, list/buttons, timeout, autofocus)
src.title = title
src.message = message
src.buttons = buttons.Copy()
src.autofocus = autofocus
if (timeout)
src.timeout = timeout
start_time = world.time
@@ -110,7 +115,8 @@
. = list(
"title" = title,
"message" = message,
"buttons" = buttons
"buttons" = buttons,
"autofocus" = autofocus
)
if(timeout)
@@ -140,8 +146,8 @@
/// The callback to be invoked by the tgui_modal upon having a choice made.
var/datum/callback/callback
/datum/tgui_modal/async/New(mob/user, message, title, list/buttons, callback, timeout)
..(user, message, title, buttons, timeout)
/datum/tgui_modal/async/New(mob/user, message, title, list/buttons, callback, timeout, autofocus)
..(user, message, title, buttons, timeout, autofocus)
src.callback = callback
/datum/tgui_modal/async/Destroy(force, ...)
+12 -11
View File
@@ -82,6 +82,7 @@
src.message = message
src.buttons = list()
src.buttons_map = list()
var/list/repeat_buttons = list()
// Gets rid of illegal characters
var/static/regex/whitelistedWords = regex(@{"([^\u0020-\u8000]+)"})
@@ -89,6 +90,9 @@
for(var/i in buttons)
var/string_key = whitelistedWords.Replace("[i]", "")
//avoids duplicated keys E.g: when areas have the same name
string_key = avoid_assoc_duplicate_keys(string_key, repeat_buttons)
src.buttons += string_key
src.buttons_map[string_key] = i
@@ -144,7 +148,7 @@
if("choose")
if (!(params["choice"] in buttons))
return
choice = buttons_map[params["choice"]]
set_choice(buttons_map[params["choice"]])
SStgui.close_uis(src)
return TRUE
if("cancel")
@@ -152,6 +156,9 @@
closed = TRUE
return TRUE
/datum/tgui_list_input/proc/set_choice(choice)
src.choice = choice
/**
* # async tgui_list_input
*
@@ -162,23 +169,17 @@
var/datum/callback/callback
/datum/tgui_list_input/async/New(mob/user, message, title, list/buttons, callback, timeout)
..(user, title, message, buttons, timeout)
..(user, message, title, buttons, timeout)
src.callback = callback
/datum/tgui_list_input/async/Destroy(force, ...)
QDEL_NULL(callback)
. = ..()
/datum/tgui_list_input/async/ui_close(mob/user)
/datum/tgui_list_input/async/set_choice(choice)
. = ..()
qdel(src)
/datum/tgui_list_input/async/ui_act(action, list/params)
. = ..()
if (!. || choice == null)
return
callback.InvokeAsync(choice)
qdel(src)
if(!isnull(src.choice))
callback?.InvokeAsync(src.choice)
/datum/tgui_list_input/async/wait()
return
+1 -1
View File
@@ -258,7 +258,7 @@
if(istype(asset, /datum/asset/spritesheet))
var/datum/asset/spritesheet/spritesheet = asset
send_message("asset/stylesheet", spritesheet.css_filename())
send_message("asset/mappings", asset.get_url_mappings())
send_raw_message(asset.get_serialized_url_mappings())
/**
* private
+298
View File
@@ -0,0 +1,298 @@
import { useBackend } from '../backend';
import { Button, Flex, NoticeBox, NumberInput, Section, Tabs } from '../components';
import { Window } from '../layouts';
export const Colormate = (props, context) => {
const { act, data } = useBackend(context);
const { matrixactive, temp } = data;
const item = data.item || [];
return (
<Window width="700" height="600" resizable>
<Window.Content overflow="auto">
{temp ? (
<NoticeBox>{temp}</NoticeBox>
) : (null)}
{Object.keys(item).length ? (
<>
<Flex fill>
<Section width="50%" height="20%">
<center>Item:</center>
<img
src={"data:image/jpeg;base64, " + item.sprite}
width="100%"
height="100%"
style={{
'-ms-interpolation-mode': 'nearest-neighbor',
}} />
</Section>
<Section width="50%" height="20%">
<center>Preview:</center>
<img
src={"data:image/jpeg;base64, " + item.preview}
width="100%"
height="100%"
style={{
'-ms-interpolation-mode': 'nearest-neighbor',
}} />
</Section>
</Flex>
<Section>
<Tabs>
<Tabs.Tab
fluid
centered
key="0"
selected={!matrixactive}
onClick={() => act('switch_modes', {
mode: "0",
})} >
Regular coloring
</Tabs.Tab>
<Tabs.Tab
fluid
centered
key="1"
selected={matrixactive}
onClick={() => act('switch_modes', {
mode: "1",
})} >
Matrixed coloring
</Tabs.Tab>
</Tabs>
{matrixactive ? (
<>
<center>Coloring: {item.name}</center>
<ColormateMatrix />
</>
) : (
<>
<center>Coloring: {item.name}</center>
<ColormateNoMatrix />
</>
)}
</Section>
</>
) : (
<Section>
<center>No item inserted.</center>
</Section>
)}
</Window.Content>
</Window>
);
};
export const ColormateNoMatrix = (props, context) => {
const { act, data } = useBackend(context);
return (
<Section>
<Flex grow={1} fill>
<Flex.Item width="50%">
<Button
fluid
content="Paint"
icon="fill"
onClick={() => act('paint')} />
<Button
fluid
content="Clear"
icon="eraser"
onClick={() => act('clear')} />
<Button
fluid
content="Eject"
icon="eject"
onClick={() => act('drop')} />
</Flex.Item>
<Flex.Item width="50%">
<Button
fluid
height="100%"
content="Select new color"
icon="paint-brush"
onClick={() => act('choose_color')} />
</Flex.Item>
</Flex>
</Section>
);
};
export const ColormateMatrix = (props, context) => {
const { act, data } = useBackend(context);
const matrixcolors = data.matrixcolors || [];
return (
<Section>
<Flex>
<Flex.Item width="50%">
<Button
fluid
content="Paint"
icon="fill"
onClick={() => act('matrix_paint')} />
<Button
fluid
content="Clear"
icon="eraser"
onClick={() => act('clear')} />
<Button
fluid
content="Eject"
icon="eject"
onClick={() => act('drop')} />
</Flex.Item>
<Flex.Item>
<Flex.Item>
RR: <NumberInput
fluid
width="50px"
minValue={-1000}
maxValue={1000}
value={matrixcolors.rr}
onChange={(e, value) => act('set_matrix_color', {
color: 1,
value,
})} />
</Flex.Item>
<Flex.Item>
GR: <NumberInput
fluid
width="50px"
minValue={-1000}
maxValue={1000}
value={matrixcolors.gr}
onChange={(e, value) => act('set_matrix_color', {
color: 4,
value,
})} />
</Flex.Item>
<Flex.Item>
BR: <NumberInput
fluid
width="50px"
minValue={-1000}
maxValue={1000}
value={matrixcolors.br}
onChange={(e, value) => act('set_matrix_color', {
color: 7,
value,
})} />
</Flex.Item>
</Flex.Item>
<Flex.Item>
<Flex.Item>
RG: <NumberInput
fluid
width="50px"
minValue={-1000}
maxValue={1000}
value={matrixcolors.rg}
onChange={(e, value) => act('set_matrix_color', {
color: 2,
value,
})} />
</Flex.Item>
<Flex.Item>
GG: <NumberInput
fluid
width="50px"
minValue={-1000}
maxValue={1000}
value={matrixcolors.gg}
onChange={(e, value) => act('set_matrix_color', {
color: 5,
value,
})} />
</Flex.Item>
<Flex.Item>
BG: <NumberInput
fluid
width="50px"
minValue={-1000}
maxValue={1000}
value={matrixcolors.bg}
onChange={(e, value) => act('set_matrix_color', {
color: 8,
value,
})} />
</Flex.Item>
</Flex.Item>
<Flex.Item>
<Flex.Item>
RB: <NumberInput
fluid
width="50px"
minValue={-1000}
maxValue={1000}
value={matrixcolors.rb}
onChange={(e, value) => act('set_matrix_color', {
color: 3,
value,
})} />
</Flex.Item>
<Flex.Item>
GB: <NumberInput
fluid
width="50px"
minValue={-1000}
maxValue={1000}
value={matrixcolors.gb}
onChange={(e, value) => act('set_matrix_color', {
color: 6,
value,
})} />
</Flex.Item>
<Flex.Item>
BB: <NumberInput
fluid
width="50px"
minValue={-1000}
maxValue={1000}
value={matrixcolors.bb}
onChange={(e, value) => act('set_matrix_color', {
color: 9,
value,
})} />
</Flex.Item>
</Flex.Item>
<Flex.Item>
<Flex.Item>
CR: <NumberInput
fluid
width="50px"
minValue={-1000}
maxValue={1000}
value={matrixcolors.cr}
onChange={(e, value) => act('set_matrix_color', {
color: 10,
value,
})} />
</Flex.Item>
<Flex.Item>
CG: <NumberInput
fluid
width="50px"
minValue={-1000}
maxValue={1000}
value={matrixcolors.cg}
onChange={(e, value) => act('set_matrix_color', {
color: 11,
value,
})} />
</Flex.Item>
<Flex.Item>
CB: <NumberInput
fluid
width="50px"
minValue={-1000}
maxValue={1000}
value={matrixcolors.cb}
onChange={(e, value) => act('set_matrix_color', {
color: 12,
value,
})} />
</Flex.Item>
</Flex.Item>
</Flex>
</Section>
);
};