From a5e711d354f6437377f8eb3e2dbd26e6f7ae5790 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sun, 15 Sep 2019 16:10:11 -0400 Subject: [PATCH] Use sign formspec to switch between wide/narrow font if available on a given sign. The sign must have a "foo:bar_widefont" variant, with the horizontal scaling set appropriately (about half of the normal value for the narrow-font sign) Add new corresponding API to anto-generate those signs where desired; use this feature in default wood and steel signs --- api.lua | 156 ++++++++++++++++++--------- standard_signs.lua | 2 + textures/signs_lib_switch_interm.png | Bin 0 -> 5636 bytes textures/signs_lib_switch_off.png | Bin 0 -> 6397 bytes textures/signs_lib_switch_on.png | Bin 0 -> 6193 bytes 5 files changed, 109 insertions(+), 49 deletions(-) create mode 100644 textures/signs_lib_switch_interm.png create mode 100644 textures/signs_lib_switch_off.png create mode 100644 textures/signs_lib_switch_on.png diff --git a/api.lua b/api.lua index 0d8263b..868cd00 100644 --- a/api.lua +++ b/api.lua @@ -434,14 +434,38 @@ local function set_obj_text(obj, text, x, pos) }) end -signs_lib.construct_sign = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string( - "formspec", - "size[6,4]".. +local function make_widefont_nodename(name) + if string.find(name, "_widefont") then return name end + if string.find(name, "_onpole") then + return string.gsub(name, "_onpole", "_widefont_onpole") + elseif string.find(name, "_hanging") then + return string.gsub(name, "_hanging", "_widefont_hanging") + else + return name.."_widefont" + end +end + +function signs_lib.construct_sign(pos) + local form = "size[6,4]".. "textarea[0,-0.3;6.5,3;text;;${text}]".. - "button_exit[2,3.4;2,1;ok;"..S("Write").."]".. - "background[-0.5,-0.5;7,5;signs_lib_sign_bg.jpg]") + "background[-0.5,-0.5;7,5;signs_lib_sign_bg.jpg]" + local node = minetest.get_node(pos) + local wname = make_widefont_nodename(node.name) + + if minetest.registered_items[wname] then + local state = "off" + if string.find(node.name, "widefont") then state = "on" end + form = form.."label[1,3.4;Use wide font]".. + "image_button[1.1,3.7;1,0.6;signs_lib_switch_".. + state..".png;".. + state..";;;false;signs_lib_switch_interm.png]".. + "button_exit[3,3.4;2,1;ok;"..S("Write").."]" + else + form = form.."button_exit[2,3.4;2,1;ok;"..S("Write").."]" + end + + local meta = minetest.get_meta(pos) + meta:set_string("formspec", form) local i = meta:get_string("infotext") if i == "" then -- it wasn't even set, so set it. meta:set_string("infotext", "") @@ -512,13 +536,36 @@ function signs_lib.update_sign(pos, fields) end function signs_lib.receive_fields(pos, formname, fields, sender) - if fields and fields.text and fields.ok and signs_lib.can_modify(pos, sender) then + + if not fields or not signs_lib.can_modify(pos, sender) then return end + + if fields.text and fields.ok then minetest.log("action", S("@1 wrote \"@2\" to sign at @3", (sender:get_player_name() or ""), fields.text:gsub('\\', '\\\\'):gsub("\n", "\\n"), minetest.pos_to_string(pos) )) signs_lib.update_sign(pos, fields) + elseif fields.on or fields.off then + local node = minetest.get_node(pos) + local newname + + if fields.on and string.find(node.name, "widefont") then + newname = string.gsub(node.name, "_widefont", "") + elseif fields.off and not string.find(node.name, "widefont") then + newname = make_widefont_nodename(node.name) + end + if newname then + minetest.log("action", S("@1 flipped the wide-font switch to \"@2\" at @3", + (sender:get_player_name() or ""), + (fields.on and "off" or "on"), + minetest.pos_to_string(pos) + )) + + minetest.swap_node(pos, {name = newname, param2 = node.param2}) + signs_lib.construct_sign(pos) + signs_lib.update_sign(pos, fields) + end end end @@ -646,47 +693,7 @@ function signs_lib.register_fence_with_sign() minetest.log("warning", "[signs_lib] ".."Attempt to call no longer used function signs_lib.register_fence_with_sign()") end ---[[ -The main sign registration function -=================================== - -Example minimal recommended def for writable signs: - -signs_lib.register_sign("foo:my_cool_sign", { - description = "Wooden cool sign", - inventory_image = "signs_lib_sign_cool_inv.png", - tiles = { - "signs_lib_sign_cool.png", - "signs_lib_sign_cool_edges.png" - }, - number_of_lines = 2, - horiz_scaling = 0.8, - vert_scaling = 1, - line_spacing = 9, - font_size = 31, - x_offset = 7, - y_offset = 4, - chars_per_line = 40, - entity_info = "standard" -}) - -* default def assumes a wallmounted sign with on-pole being allowed. - -*For signs that can't support onpole, include in the def: - allow_onpole = false, - -* "standard" entity info implies the standard wood/steel sign model, in - wallmounted mode. For facedir signs using the standard model, use: - - entity_info = { - mesh = "signs_lib_standard_wall_sign_entity.obj", - yaw = signs_lib.standard_yaw - }, - -]]-- - -function signs_lib.register_sign(name, rdef) - +local function register_sign(name, rdef) local def = table.copy(rdef) if rdef.entity_info == "standard" then @@ -819,7 +826,58 @@ function signs_lib.register_sign(name, rdef) minetest.register_node(":"..name.."_hanging", hdef) table.insert(signs_lib.lbm_restore_nodes, name.."_hanging") end +end +--[[ +The main sign registration function +=================================== + +Example minimal recommended def for writable signs: + +signs_lib.register_sign("foo:my_cool_sign", { + description = "Wooden cool sign", + inventory_image = "signs_lib_sign_cool_inv.png", + tiles = { + "signs_lib_sign_cool.png", + "signs_lib_sign_cool_edges.png" + }, + number_of_lines = 2, + horiz_scaling = 0.8, + vert_scaling = 1, + line_spacing = 9, + font_size = 31, + x_offset = 7, + y_offset = 4, + chars_per_line = 40, + entity_info = "standard" +}) + +* default def assumes a wallmounted sign with on-pole being allowed. + +*For signs that can't support onpole, include in the def: + allow_onpole = false, + +* "standard" entity info implies the standard wood/steel sign model, in + wallmounted mode. For facedir signs using the standard model, use: + + entity_info = { + mesh = "signs_lib_standard_wall_sign_entity.obj", + yaw = signs_lib.standard_yaw + }, + +]]-- + +function signs_lib.register_sign(name, rdef) + register_sign(name, rdef) + + if rdef.allow_widefont then + + wdef = table.copy(minetest.registered_items[name]) + wdef.groups.not_in_creative_inventory = 1 + wdef.horiz_scaling = wdef.horiz_scaling / 2 + + register_sign(name.."_widefont", wdef) + end end -- restore signs' text after /clearobjects and the like, the next time diff --git a/standard_signs.lua b/standard_signs.lua index dca41b4..8edef6f 100644 --- a/standard_signs.lua +++ b/standard_signs.lua @@ -9,6 +9,7 @@ signs_lib.register_sign("default:sign_wall_wood", { }, entity_info = "standard", allow_hanging = true, + allow_widefont = true }) signs_lib.register_sign("default:sign_wall_steel", { @@ -23,6 +24,7 @@ signs_lib.register_sign("default:sign_wall_steel", { locked = true, entity_info = "standard", allow_hanging = true, + allow_widefont = true }) minetest.register_alias("signs:sign_hanging", "default:sign_wall_wood_hanging") diff --git a/textures/signs_lib_switch_interm.png b/textures/signs_lib_switch_interm.png new file mode 100644 index 0000000000000000000000000000000000000000..0d4c5581e0b2c2e5352ea4ee3f7dc2b7da4ed4d6 GIT binary patch literal 5636 zcmV+f7W?UmP)dd`{o-sio)-vPSlqKhuN=%R}*y6B>dF1qNVi!QqOvjAI;i`ur$T-Q~k zlp){uR}s+%iRgL&s{!-?Fc@R}PjbT;Tdqq>B60xa089Wl&KUchrfFvZxS>!eh(sdv zz9s+>u~Mm&kW#J@LVR2Z@i##btaBVEZrgTP2x0iX&xr^`)D?ak6h(oeC{oijCmasj zhGA3{MHy99^#x7SUgn%nB$LT9V~pN+1h6bCX501$T-UwVah&@s%gU6?W!&7mln8>L@%u_X_Hup2Ix*U;4-pY+L=eej^0inj_8kDv zXEGVlF#=3XOt3^E!E(8r9*f1kSSpqNu23kfHBFO<2%PiQYf|f72p#nObW!NBSPao< z6wzoDhG9Te)fNH>Az)b+EX#svny_tqNdjh!0YpIiHEOT1+Sbey1Y<3)la%0`H;6$* z#27;?7GvpjdMqA~f6Mp%|1=E4%Vx8*>;xzli|oRM3!zjh^_5&M_e7yk=-zYr1i^z_JO zA%N$3O0ihHe|mcQ$zrj%DhPs0Y92{~MHZ%M8mF{VI2k>Osqhp`)dVTaOMnq&1mDPf z1De!OF)Q$ef5j0z=NyJ%ARLXtJ$)Ma|M(9$2Mz#IUiHsQH3CQgLet>(_QKn+0l47? z@cw@AX!N2>Spcf4B9qBXrqk(v(sliZLI~N{*GE^C07S&{`TXs(v$NmH=kp&FLM-@R zMhvcWaf+S7ZzI3O!PG&NBjtu4s}p27z`^mT@hBb+Jq+LU;n>bR!E??Vt0~f+=N6hZ zEFOdj%ieX%mfSRUJHk&<|OeP=e z>+5@cYHEu0_xICPBS5KC>Y1IL{pWl>|3$}fw1uw3CC6+qi&u?T@vF?QFdd(U1`UiD z2n1rw7Y8U%@R0EkzNCE#PSt_$`YpawRnDX!~}kJw0GjE*MdT!(o}pWWJwHr~fgPO63-F zFLkk||NQy$cU7y^yFJg-IOo((9wr$kX%c&qd+>Vpb@;juUFwibF00_{7UhA^19((@ z6i&r~@A)lhpQdSz;Ldej2q7A=Kwa>vszTE=7={5|*AWB(JkM(gq*5$`QYj>M?Selw z1#kcU<@-KF0L_KX%rKBNO&Bk|gwpIR#NBs88yp0evL!wsB6yz1tJUf~nx^dyg5ZA@ zMG=>`nv0A4SJ<}w8P|1(01)S#HJefe3Z`iqKTG`#zwY}rq%NV73dtmv8wA2uWh)-m z9)`4JL-=*ysOvg}5Xk5AC=?2)R;%zluc6^Y1mE}JI1b9?GIF^bip63h%5DT)oTFMQ zK_ruiKlmVcHrtt0MoJLp2yu?|fddHb*@Iwa2254KYvipjB7);M{g!2YCYQ_gEzWH& z!uMAym784G{VU)1WwS4@Yo94i?2Yfmo7p!(3V{>vNZLmrq*)rfj9rMiF}SYV;_Fpa zMYUQ*p-^c2t#0m{BkB6TIp>g4!m=#n^Lcol*RURSn3W3n@G!zVcLKaa{j8cb&=^DV zt+$~4@|TddJ(o2!WiXs`1VI4Daqh5f`@=+}E|~x`GcySx#9w-z*TWd2dXcZbhzLhR zNAX(vH3&sOA*EwEKLf*uln>#0c|BamotM{Ft5sC1)rP5mFCw**!S{U>i$w?_psH#k zK$AfL+jU{wa}W566`ieQat_V+5kGJM?8p&-2&`7SsFQ#(M!xU&JC3vC?Af!iB@>`r zF82u`b_PK}wc7s08#0bED`S6rKW2;>sHAqZ;1fm|pHe>s)m0$^(Gs~kjsw#)7cANO z(uX4~SY8>nsK5=Jd9{H$xl5%If*`n<#V`in^FaOmFz&o_!90CgNua9G^Ld2#?+2C3 zK$AtQlOPBJCWQDfV{FZm3E=zwTHp8AGsc2;?FWEyeH_Q)$Dm2AqrxW;*7CKuUS1Dh z_>hnd6CVTtY}=lf(n*r2SUJq(j$>-}5DJAO$QO=ccJ?Upr7@UZWdRo~QK?iKu4C>x z1WyQPANdGi7#%KeGB8C!XlxA1=;%V_W>#w;4coT8X~|gt5q%^G0(D-EAArX^jD^RL zQ*sDVs3C+-fP-Tj--c)qg)7~b+Cn|jZ`OQC68X}*D3p#N5n))fVhy6PJ}|~$nmJsU z8OQAG6#UdCBqP~&C4lR?&@`<&5AtV1F-h~8`uRCXRSGlyZim3eaj%>gC=$RL1Z ztmAP&qgW&*)N|*+O%rI!1Zs;(DVdaVg7{J=AXhId3)Fz=o>3Fjzgb>n{ zMj(Thdj~-Pzo}A3AP8UJ!t@~s?=;j}eVs85##L}-t~dn7plJlp`U47uGaz5ia|O+P zk46zGo9$dS&~63tc_`KDymYW8A5KIYmh1wglmoTiK5K7ANL`}His0ZKHUIU>Uzo!1 z$#2nAAw+9*&lqg8j9mFJB2zigIypbR8^}>Ubbnw*uTW!G(b2e6Dyjzrwq80sx3FG~7WTaFxS{zihSr_d
=T%`=r(s#Mu-rVDco$w^BaBFc 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 literal 0 HcmV?d00001 diff --git a/textures/signs_lib_switch_on.png b/textures/signs_lib_switch_on.png new file mode 100644 index 0000000000000000000000000000000000000000..a42eb05d32d7c1c5c0ef2b65d64b2d54915cee55 GIT binary patch literal 6193 zcmZvhWmr_-_x1-EU?>@SC`pl)7EoXaDaoO`1nCr!9&iYeltGZLq2mkE-9w1P&`1g* zAdQ4W{O9-XdGYM))T?vvz0bPVTKDIC(9=<)AY~#2000yk>MAhY9gaJpAR^p#dM-R1 z0ARS%P*F5|w{#HV5^p)5wi<90>ULl?o3-d(ulS)@sUpjKC{fbReYDRs)rTj8kd4pP9H&fkpEinWyodrk>DksGUKRTv>390+>!VHeZ0O` z8m@*&fbgkbP#I`0D#fmt?_(S10`L|HY-!=jpn~oc8r9)yCUci+WxylA7~nft$y!|d zObkBUobNUlAL^#<*0{964!ZL%n!3USb;=u68*9+M$Vb9_E7QlldPWbs zbh`iU-#z0f_IqNrC;HmraUAv`lKqk0w)gK`ElS>3f31XoITi)N0MRXuTZe^3B$_Sa1-J5*Uu*~=5BhL!RVPz zlc{$Mq4(|neE7*WqG_6Z86_W7I3r$(eRw5Cg7&e6s8Rx?cR-PVuA`zU=bp>ZhF=X1 zLJf17;7CLM7pkhN^qAfA^eFH>#wWW)kN3C51Gpwism8j~b;q~0TR2TKDSd2vN;}O&(ik*D&F9Z2eB)eWxDpv88aSCm%p3_xT9VZO?VY_2#?5C=QzPs{tTNj*(Pz9>gCZx&*6 zH{_V3Wveft4~rM03{Eb=QuxwFXzZVtxtpA;Zd&CSiG%8#e}5w#s92%FLBqz~rQ!-f%Mc!$!8j$J2T6a;=$8Ss=r5BIiL1 zO6qVY+w0n*kc5+N1HToX_b4oyrj@4bkt?gh9MSMW$vb>}6dh>;e4-_BbL;f_~S=UA`rPy)qJbQ;XR_G?KHT=xW(a(DaH1t9u;thcat4sg^HKln5iC2vVed5nBkti843~ ztcs9ll>9G}m!*o4a$((5&g^NLcJ}u8N+6teE{G%1VaZt{Y)xW(rx3MsH%-rxklzd2d`A+Q` zAgh`16Oy1x;KLGtT+QJED?vdK?4b3)hb(AC{dUfL|}`DPVRqM(H6eDmaP;h#fsA#EY=-pNX|UH+7FJ}$F#xn*HJ zpDx`!MbT>VU3DcTBv7d61IOxRcbdBWScti}xLDJtf6>A;5q4J-k?dFSxg`h$FlaB@ zFB2}3_)}jg*7Naon|{Ekd{kci4KVwpqCqLzUUiELEY9veq#GzMi2u6#N_x}!gjDSL-hhK?#vy>7)M}UP8 z8KC~-h3&C)1A=zAd9~DcnQ&9ha+kH!$LzeRVu__mMZan7_}tWxwXH-?dm-7{%$>M;=sOO?#hbHi6+g>> zS~6FRM~o{F$ijko#l+^s7EQ%?Ts%*c7h?ySIBU{+OeO^0heU$FV2FrqKhZ(Or)CDz zM)Mc)c}J!(Qt2YvH06e*J}j32T}=(?9X58vA3{Aw5I`xGkz*hS0oDMC{xiXRYD8dm zF(PR)EvF>xW7G)@%phx$d{@$eM{o)#Kz0&Nw19mh)8_GL5{Z|abKcHGG1P= zrNgNr`25u|0O}G&VKhW)p*UMkAO)3-q7tLse9p5CoEGflOS7ytP8r({;(RZin4-?D zS8Y6%mdsU+KkW_%661BqgK>4XTL>i~wS9#*z&%vh9!o9IJ10du106Myj9LnCi~X)9 z@_^YkmE5+|$sEhHnGHR*2W$%zD}0Jhk%S7x{druUAE3u;gGUNx0B(I!K_=K1Q)C3v z?8ac&4SgHrykQ^6XfikFJ**HbS~U57uxatB_E!VJ&1|j|^`3gcH;=bL9GZNNKHo1X{@@oQ zFR7G*M%xYyJ!8RV9|HBXi7zjK$JT#)Ub4)2S!kbW0g7yUw6Z3ZxU4^NIFOvhk^~xY z$}@9ikS7O)lMb*?c14rYHmq5$oQKl-T60>*_KJ}U_U5CaFEV#1VB45Ub@qtR1>%?H zpf{7Ey_)3@o*l{G^VirmeV2fXr(JKLgXxaBY0ZQk!z`aEW2=1^cjbeI2 zn3~4Jj9X8oGUT2Lsa(VtmQ^6ldD*{UQ#`4`V_V45I~Amjucdg9x>h(aUzCIC{M=-sN=vISSKMy_!E@5R%tj7C-N;-4GXYN9(k=7#g*;K9 zMr3Ig`$9?(a<#3dZZ`~+pQe-`!LI-QgVVrPuQI6y0Emb0o*yaD5@%E&?V{!B^{2+X zpZ?zK4}!4AIEu}=heyh?<#?Tf{#GAK*UHoHO{GZrRH$ zo@cIgtLn<1A2m$pSIIQdGx-`>6KL!Q%&caP4#y#$&2gtRic3!F%XXpMrXgu*w{))XDg=Z%@a=I*&ER_6rPQ^bm5R2E z^kHa)=+?A;a9mLYljcGXU1yxYKmIu0!Z->@K?J4E-A;?iIR4x(qaWSV%hzyE-__}K zdZj8#a=`cNWh87xwq~}PBudDGg+tA@k7XfUEUP!iH|v)r0k>j)NYuZ8J>Kxn_|tp- zqLcTk1`*ZA2~IBJT@w;miYD_#QqnlSS59Ige!mj`5>tcU9ebzPsFd|T04@37hc)Ra zil+Yf7#@7B>+|O1Rz2tecL-=RB9(}nGu|V9(`Ni$Sl;@UU@Ip?*S@-QX<0JD^CdXi zE*w%u!eP$mZ)eM}j=gKewFCLuLRhxF#H$D2%)ed{-V?f?e*YSwDX>5z^@?{x=pB?C z5=^0Pp!AvB7H=pX?~|vbMWWO`{@XdC#@|kf({wFEve8*@Q@)Jk-x#-!2o2jtu`7Y> z>3;tG?f?9h0)k~M!fllgPke|S1$3zT8b{%@9(HNHRhzhuPBZc02_$kX!dGU_Sf^s=^bIW3#&S&Pn{>FTbweWnG6q)m%W7+8gyEMm){uO zOK$0Casu0Z#Nzz`R}6VqEE8(>Imwj=e8|V@gM2}mt_z6?B*82+tfz$q7IvQ9r|;RJ zvN_Q%nR4s`X_`4OpCrc;WV9XR^Vs%agbWk~GpjJ)WUs$PNZR+RLu}~@9N%D~QvrDE_<|$0PFlr@#mUmh->+y| ze;t3J%$c#(Ao}d2{v!>#*F{^VTrfMn@)Sc}$NUq0gO+X&qxU$Px6b*ZRbtS%OxvcY zOhx#j=5|p5=eK~00GvTm=avc$IN5xWQL^X)arw*cjG`rpT%Xz8+{6XO@vkhe8so~@ zBW#zh7RK-v0B|v`ct9L;!Z2iG+uho&(IH~`%(Q*b914H0tfb`fSD+WwpmZ6dS3hE3 z-bJY{PI;1O`5ESI#X$CjFl6U6K+h8yO#5nC3TJ0=b`%nw6K56vRFCcbk>P#FT8vBP zu+vw$8iZ(cR1_gl5uTEglDj50q*pudUvBu14|Tptq1Zw306Z~1&iFxPb0b7P&;1dr ztd$~iQiu0x(Q6ThiF}oprY8H^Z?$-Ne?!aX6_vg*-<`8w-QPj-92x12>60zSHr5w< zb7$OxqewZxFQ|%!^kWJ~H%>+cYH=oNO=B`$sbR>c^X{~a(s)6cUT6doV-Yv)gH z&L#)|58tih;c!Q;z1~NLs$3brUn4uY!G~AV)6*2U$4$K04>XUr&d<-uaEOFWO;uH1 zPF~*A!z|QI&b!L~Klp}i2$=XAL0JYJZ4PHe18LH`rWq02OyELzvcYm`p!q9#7qLY>Bt4H8*FY%(><&U$G zBDJKuoz~XY-HXH7EFQnDi)FS28$PQi)jy*ctb2AbrFG%=VJtGfKwJ>2^Q8VK=vK)T zR{9_2kf+Ocn>3M4ABM=WqXRa^YYCA9TG*Q!QJgFLgw^DU0 z4ptAFw!h}x3I<+n#4MitMBnedXS-SN&dbSR^|J~XtNu7$QxS6HpO}$IzKjyWop{CG3+NcAuFXUlY{cNMSHP?2XjtcPX-1y-J z&7!-p0BX4XKm@BKWYCnD_xp&-K}k&%bk*Y#BcyecE1;_=f=R?>K&g0ORt4 z^qb#cr`NA>^ILHdKQicAU07iE>Npu%+OO@t+nOp;>lRZ`2saq*b|C`*@~}U4Vqv6F zO1;&_mEmu%jyKRrxQ*R8KX2effWOP^>Nx)()%!E^EO>RKWqDP4+MhxRq=fI+4eETI$L>JhW&Gl`@E?Yc0I9aZR?>?dSPwjcDRF=ikM5#{C&24A8}OH1#^Sp$C5VR3mPdcO_fr;`RNzW@8Wx$?*FMNiaJ3xD@MYo(|W#CH*ct~uWxj3Z*P8nZZ0?M-)`vy4(eTA$VGSro=>S6;HcHtqN1X_ zZ?D9{8@$%KZXyVXzfDc)Pd8S^{;1;X%mMtz3U9EXUmPX=A3P1c_+!@9(b2Jiy=&%A z8#SD2^p+6zH+DVHeP!S}i@3eoBY;K(L)}WaV%p=OG)LE{@F#q^Kv~ zoo?$*egKB7&8KNTvbL}w6SnEHJbQjbjXDp8je1EkCA`GJ)z#+i+XI_!lfkC#I`l)X z+#M>k&+yC)k}i7V&b<0U7ln+$!RunAOSNRb$9?X9SxpZ!Vf+;RW#U7^W}pAgEi5cl z;)=%2=B7Q)qx;L}&D;E&PCxf<`v36s|50{d%;`O#&&`pEoDLv~`xOAtc%h?GqhuTT EfB4+XDgXcg literal 0 HcmV?d00001