From 7571c4b1ad13d3b2727290ac9f14989125e42034 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Thu, 4 Jan 2024 01:50:12 +0100 Subject: [PATCH] Events can now contain multiple actions, implemented draggable action icons --- QtGameMaker.pro | 7 +- .../dialogs/actions/movefixeddialog.cpp | 19 + src/editor/dialogs/actions/movefixeddialog.h | 22 + src/editor/dialogs/actions/movefixeddialog.ui | 302 ++++ src/editor/dialogs/codeactiondialog.cpp | 14 +- src/editor/dialogs/codeactiondialog.h | 6 +- .../{code-action.png => action-code.png} | Bin src/editor/icons/action-move-fixed.png | Bin 0 -> 20146 bytes src/editor/icons/action-move-free.png | Bin 0 -> 20987 bytes src/editor/icons/action-move-towards.png | Bin 0 -> 11871 bytes src/editor/icons/add (Kopie).png | Bin 0 -> 4769 bytes src/editor/icons/blue-arrow-down.png | Bin 0 -> 7136 bytes src/editor/icons/blue-arrow-left.png | Bin 0 -> 7419 bytes src/editor/icons/blue-arrow-right.png | Bin 0 -> 7442 bytes src/editor/icons/blue-arrow-up.png | Bin 0 -> 7234 bytes src/editor/models/actionscontainermodel.cpp | 54 +- src/editor/models/actionscontainermodel.h | 3 + src/editor/resources_editor.qrc | 59 +- src/editor/widgets/actiondragwidget.cpp | 40 + src/editor/widgets/actiondragwidget.h | 19 + src/editor/widgets/actionscontainerwidget.cpp | 29 +- src/editor/widgets/actionscontainerwidget.ui | 1431 ++++++++++++++++- src/projectcontainer.cpp | 46 +- src/projectcontainer.h | 45 +- 24 files changed, 2027 insertions(+), 69 deletions(-) create mode 100644 src/editor/dialogs/actions/movefixeddialog.cpp create mode 100644 src/editor/dialogs/actions/movefixeddialog.h create mode 100644 src/editor/dialogs/actions/movefixeddialog.ui rename src/editor/icons/{code-action.png => action-code.png} (100%) create mode 100644 src/editor/icons/action-move-fixed.png create mode 100644 src/editor/icons/action-move-free.png create mode 100644 src/editor/icons/action-move-towards.png create mode 100644 src/editor/icons/add (Kopie).png create mode 100644 src/editor/icons/blue-arrow-down.png create mode 100644 src/editor/icons/blue-arrow-left.png create mode 100644 src/editor/icons/blue-arrow-right.png create mode 100644 src/editor/icons/blue-arrow-up.png create mode 100644 src/editor/widgets/actiondragwidget.cpp create mode 100644 src/editor/widgets/actiondragwidget.h diff --git a/QtGameMaker.pro b/QtGameMaker.pro index 1a3762a..b424f6b 100644 --- a/QtGameMaker.pro +++ b/QtGameMaker.pro @@ -29,6 +29,7 @@ HEADERS += \ src/editor/dialogs/genericcodeeditordialog.h \ src/editor/editorguiutils.h \ src/editor/roomscene.h \ + src/editor/widgets/actiondragwidget.h \ src/editor/widgets/draggabletreeview.h \ src/editor/widgets/qlineeditwithmenu.h \ src/editor/widgets/qscrollareawithmenu.h \ @@ -67,6 +68,7 @@ HEADERS += \ src/editor/dialogs/timelinepropertiesdialog.h \ src/editor/dialogs/triggersdialog.h \ src/editor/dialogs/userdefinedconstantsdialog.h \ + src/editor/dialogs/actions/movefixeddialog.h \ src/editor/models/actionscontainermodel.h \ src/editor/models/constantsmodel.h \ src/editor/models/includedfilesmodel.h \ @@ -86,6 +88,7 @@ SOURCES += \ src/editor/dialogs/genericcodeeditordialog.cpp \ src/editor/editorguiutils.cpp \ src/editor/roomscene.cpp \ + src/editor/widgets/actiondragwidget.cpp \ src/editor/widgets/draggabletreeview.cpp \ src/editor/widgets/qlineeditwithmenu.cpp \ src/editor/widgets/qscrollareawithmenu.cpp \ @@ -124,6 +127,7 @@ SOURCES += \ src/editor/dialogs/timelinepropertiesdialog.cpp \ src/editor/dialogs/triggersdialog.cpp \ src/editor/dialogs/userdefinedconstantsdialog.cpp \ + src/editor/dialogs/actions/movefixeddialog.cpp \ src/editor/models/actionscontainermodel.cpp \ src/editor/models/constantsmodel.cpp \ src/editor/models/includedfilesmodel.cpp \ @@ -164,7 +168,8 @@ FORMS += \ src/editor/dialogs/timelinepropertiesdialog.ui \ src/editor/dialogs/triggersdialog.ui \ src/editor/dialogs/userdefinedconstantsdialog.ui \ - src/editor/widgets/actionscontainerwidget.ui + src/editor/widgets/actionscontainerwidget.ui\ + src/editor/dialogs/actions/movefixeddialog.ui RESOURCES += \ src/editor/resources_editor.qrc \ diff --git a/src/editor/dialogs/actions/movefixeddialog.cpp b/src/editor/dialogs/actions/movefixeddialog.cpp new file mode 100644 index 0000000..49c6e1e --- /dev/null +++ b/src/editor/dialogs/actions/movefixeddialog.cpp @@ -0,0 +1,19 @@ +#include "movefixeddialog.h" +#include "ui_movefixeddialog.h" + +#include + +MoveFixedDialog::MoveFixedDialog(MoveFixedAction &action, QWidget *parent) : + QDialog{parent}, + m_ui{std::make_unique()}, + m_action{action} +{ + m_ui->setupUi(this); + + if (auto button = m_ui->buttonBox->button(QDialogButtonBox::Ok)) + button->setIcon(QIcon{":/qtgameengine/icons/ok.png"}); + if (auto button = m_ui->buttonBox->button(QDialogButtonBox::Cancel)) + button->setIcon(QIcon{":/qtgameengine/icons/delete.png"}); +} + +MoveFixedDialog::~MoveFixedDialog() = default; diff --git a/src/editor/dialogs/actions/movefixeddialog.h b/src/editor/dialogs/actions/movefixeddialog.h new file mode 100644 index 0000000..363c7a1 --- /dev/null +++ b/src/editor/dialogs/actions/movefixeddialog.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include + +namespace Ui { class MoveFixedDialog; } +class MoveFixedAction; + +class MoveFixedDialog : public QDialog +{ + Q_OBJECT + +public: + explicit MoveFixedDialog(MoveFixedAction &action, QWidget *parent = nullptr); + ~MoveFixedDialog() override; + +private: + const std::unique_ptr m_ui; + + MoveFixedAction &m_action; +}; diff --git a/src/editor/dialogs/actions/movefixeddialog.ui b/src/editor/dialogs/actions/movefixeddialog.ui new file mode 100644 index 0000000..34f5595 --- /dev/null +++ b/src/editor/dialogs/actions/movefixeddialog.ui @@ -0,0 +1,302 @@ + + + MoveFixedDialog + + + + 0 + 0 + 435 + 429 + + + + Move Fixed + + + + + + + + + + + :/qtgameengine/icons/action-move-fixed.png + + + + + + + Applies to + + + + + + Self + + + true + + + + + + + Other + + + + + + + + + Object: + + + + + + + + + + ... + + + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Directions: + + + + + + + + + true + + + + + + + true + + + + + + + + :/qtgameengine/icons/blue-arrow-up.png:/qtgameengine/icons/blue-arrow-up.png + + + true + + + + + + + + :/qtgameengine/icons/blue-arrow-right.png:/qtgameengine/icons/blue-arrow-right.png + + + true + + + + + + + true + + + + + + + + :/qtgameengine/icons/blue-arrow-left.png:/qtgameengine/icons/blue-arrow-left.png + + + true + + + + + + + true + + + + + + + + :/qtgameengine/icons/blue-arrow-down.png:/qtgameengine/icons/blue-arrow-down.png + + + true + + + + + + + true + + + + + + + + + Speed: + + + + + + + + + + Relative + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + MoveFixedDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + MoveFixedDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/editor/dialogs/codeactiondialog.cpp b/src/editor/dialogs/codeactiondialog.cpp index 23e25da..06329b4 100644 --- a/src/editor/dialogs/codeactiondialog.cpp +++ b/src/editor/dialogs/codeactiondialog.cpp @@ -6,7 +6,7 @@ #include "projectcontainer.h" -CodeActionDialog::CodeActionDialog(Action &action, QWidget *parent) : +CodeActionDialog::CodeActionDialog(ExecuteCodeAction &action, QWidget *parent) : CodeEditorDialog{tr("Execute Code"), parent}, m_action{action}, m_radioButtonSelf{new QRadioButton{tr("Self"), this}}, @@ -23,9 +23,9 @@ CodeActionDialog::CodeActionDialog(Action &action, QWidget *parent) : addToolbarWidget(m_radioButtonOther); addToolbarWidget(m_radioButtonObject); - m_radioButtonSelf->setChecked(m_action.appliesTo == Action::AppliesTo::Self); - m_radioButtonOther->setChecked(m_action.appliesTo == Action::AppliesTo::Other); - m_radioButtonObject->setChecked(m_action.appliesTo == Action::AppliesTo::Object); + m_radioButtonSelf->setChecked(m_action.appliesTo == ExecuteCodeAction::AppliesTo::Self); + m_radioButtonOther->setChecked(m_action.appliesTo == ExecuteCodeAction::AppliesTo::Other); + m_radioButtonObject->setChecked(m_action.appliesTo == ExecuteCodeAction::AppliesTo::Object); setScript(m_action.script); @@ -46,11 +46,11 @@ void CodeActionDialog::accept() } if (m_radioButtonSelf->isChecked()) - m_action.appliesTo = Action::AppliesTo::Self; + m_action.appliesTo = ExecuteCodeAction::AppliesTo::Self; else if (m_radioButtonOther->isChecked()) - m_action.appliesTo = Action::AppliesTo::Other; + m_action.appliesTo = ExecuteCodeAction::AppliesTo::Other; else if (m_radioButtonObject->isChecked()) - m_action.appliesTo = Action::AppliesTo::Object; + m_action.appliesTo = ExecuteCodeAction::AppliesTo::Object; else { QMessageBox::warning(this, tr("No Applies To selected!"), tr("No Applies To selected!")); diff --git a/src/editor/dialogs/codeactiondialog.h b/src/editor/dialogs/codeactiondialog.h index 7b70437..5af7a0f 100644 --- a/src/editor/dialogs/codeactiondialog.h +++ b/src/editor/dialogs/codeactiondialog.h @@ -3,19 +3,19 @@ #include "codeeditordialog.h" class QRadioButton; -struct Action; +struct ExecuteCodeAction; class CodeActionDialog : public CodeEditorDialog { Q_OBJECT public: - explicit CodeActionDialog(Action &action, QWidget *parent = nullptr); + explicit CodeActionDialog(ExecuteCodeAction &action, QWidget *parent = nullptr); void accept() override; private: - Action &m_action; + ExecuteCodeAction &m_action; QRadioButton * const m_radioButtonSelf; QRadioButton * const m_radioButtonOther; diff --git a/src/editor/icons/code-action.png b/src/editor/icons/action-code.png similarity index 100% rename from src/editor/icons/code-action.png rename to src/editor/icons/action-code.png diff --git a/src/editor/icons/action-move-fixed.png b/src/editor/icons/action-move-fixed.png new file mode 100644 index 0000000000000000000000000000000000000000..cb889d79227af40e8cb4bf250d208368c8bb4601 GIT binary patch literal 20146 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEo+2FmN$2 zFtRW(g48fDFfbyqnHZTFm>C!t+87uZgczB@YC!6w7+JyW9tH*mX()RN0|SEwR1HXv zAtMt5F9QR^90mpkBSt0$5s>W+3=Em=5WDsFlD zNYBtf&)AHC!N|bK#LB?X%D`B`(Adhrz{=E|fsui60m4NL3=9mM4F4D)W`o=a^ApIS zFh7CVFh4mlGB7Yh-3tmCHYBzvlnwF+BNN0-4@L$CCMY{m6J#IE?f-B5f50H%<>u+e zz{tn|au@@{|Jw}C3><81>};$Y?Ck8EoE%&{BD_4@+&q#(!u%q#Qu1=LQZh0MDthV) zN;=9iG8*QZItGR&CMNRgmbMl~HhRV;Mj%5NIXO9bxOpUac_oY#WfYA_2LBH*2y!qo zFfuSRDlsq#GBOJ?{y)MX&%nUQ$_NG!uP`t$GBLBTvaxe;a&iAZ!mw3k%^gsMUYiU(a@1iI53f2sZhkIapFP_Wv7h?MT0JWP%%y_YU1P)6PJ*b zQdLve(9|+9H8Z!cv~qTFb#wRd^a>6M4GWKmj7m;PO-s+n%qlJ^Ei136tZHs)ZENr7 z?3y%r%G7DoXUv?nXz`Mz%a*TLxoXqqEnBy3-?4Mop~FXx9y@;Gk)LRo;JwQ~CcHau@J3jLHx8@L_(G ze^~!Vxc$xgkLLd_{H~wc6hI{-5FL z{eP@~wZ$6D_9Kb^yZ@hIdH$cy{|wjGL}gkm$c(vd_0Rq(MAu6G4*Qqa!3M0JS6SFU z{p+grr9CzC*E-K~_q8!uzVT}PA?N=Le*1q4|7Te1`JaK4|F6}5hA002widB{{x|dA zmiyc4FWX;Rd~0!O!~C!R8TiWVKTP<~aC!Ydm;Vf}gZc%Y|BJ2vr2d~FYRARu`9ITt zT{&5P{mI{q(14|llm6|0FgO2?iu{+?{~0FQ|GLUEPxW^H7k{u@*9BGo-CbWkZ~xJl zqu)07>;IL%{^Q@gtD=Tn>T&!UD`WpN#6PPF{OD%?^!$GYrT+|HSN>=CF!?{j<@x_y z|1-P}?>5_c`LFzc2KoOCuS560J^!oxKg03=48N|P+t~5->EWXI>wko=9q%&!&!AWT zQ~W=}+A!shdT;(SEUE{2uA=Mp-1>|E89x4J__sAL;x`-^|=`(M8e<%!BUEqHiS zOWywVN51y|@PGy1O8$<*{|tJNfQo4m|GmBLy{vuLwCKG%e%eR9`nKx2jcUWJ>DvGH z3$M0Q`p>XD9_-D<|Ah2^mHuZqG5>GYL+OBH_ND(B`s=^0wBNG-<@A5Hph)|>%WD6o z<@vAwocoTXIR1ynept*kNzMOj_@CkU{$E#(vMkTP+yC+XzpbXRf;#IKfr9uvB8acN zfBT=|R~f{{O>Qg_@i>^tVc`%$`t9thR+y5E9yamU{mHPbu441cqV=_!v zG~IIR-~Im?{O*I(Ld@~*eQN(14rzb0|1qU@^;_%z3{Rh@-Q8V(!}9n2rLpUce(e0u zU{L=%|3AZ)7tF^>|1j9{}~>{U)s2WVSWAInf1>y|1)g&|GPGh zG44OZZ=?SVXDPvJas0!-GiT#ZaUX7M*;T1@iO zzu8i+-b>s0$9-+}>Xe%%%<;-_d-&|Ky7$-jCZ1pMI3E%s!Ta|7X9)kjKkh$+*K_q< zzxS)Zj?0ZYe)~bu(bMa{{+KIy1s3K@{$2dfuq^(^_x}u0JN@nd&cC)a>}=xO$XE60 z2kYZM_|3_(|8n|2gB&PrwOrZt?=^%SuG4I}e9!E{W5pq>Hftti?zLZk=Em+Tn>T-t z+kf;w!?ks3nS1W;*E4+Y?7LfD&tA&4+y3aUu%Ou!?>h5KX**eIMwWeFvcjrqXMQ^^l~py1y$X{psIqCrk6^ zJxSX`W7kxM78nFQ`?uey(v)xhE^xZIa{evOg=Xshs`<~b)O$+b zj7v*S|7W-r5A#yU#jM);VzA=Xtkd(WyylfTEa_x3-7 z`tqtz-O_XSrJsCx|8;C{??0RKcdP2fuix685oVWddRq8L{n|a}UdCHKTCyfPd+qIg zKFPALL!~Vr?bYy~@uS8~E@a-4sn6oY?Vs`gXUP4}@NI5YZsqi&=YKZ;XSiMecX^b| z@}AfK89u%L&%pF=YHzgFe}+H1|1%uezce`jJ+16v+WVj3Tk3y?nals(wg0x2q1tT! ze+Iq(3?KAg#{5~^Qy9zMVGk)GXY9zyeSB@1--&xIl}l3Y-APVA`TE{Y>(lRd{@x$| zXl<-l{MVSO@4v!@E6wlxtgXI2Id1XJUwom>-M#-A)-8&OP0v61`re9*u7&2sFCUAF zrg(F`yL(PM>E3|DS!X*`S1LHdrPfsPCFm!OMSESeSLi6^T5b-`#t{|j%OF$ z_dWLh-miN8{|s@vc5IoG{{270kLUjx;@0k+cc$*M<+tTL#!;KHpBGNvQosJdXJ04Y zdGTlGJl}q4)9R(y!t*Dd|Gs}|ap>{D$oZ}<^KDJe#@g}zOF!F_y#3nNbtY%t{{6oG z!+(aauVf|5EC2jwDF1c6Tz1)?KR=FdExEY#T)(*C89BM-U!OjyEZJsp{Js6hTNgKO zK0ovKdB6Kn?^G@o_uv1|@Ob{;s*GSVBw|@gNYntS; z$J_MS=(jgNKVP5q>bbSq_jB3P_Rs$tfBNu!C{dw=&=`I=uEeg`cywT&;B+}`tZzxwj}wPj|P^6nmATDfkz z`mcMo_G`<(@y<8y_kSI?Osd>Y*!r->tNm+xC&s0JEdH19pW)m6{|uSem#(k+?B6~A zGy8vrZT}g5`|TBe9QPb&I#VE2L`{bkQR|{!{5^kc*L;Ec)BFE${|eVE|0Ca<9-O?H zZSUv)E9ZZ$KmIFRwDgaBZ`rKre>VN8Us@!zt}srw_WWg|y^4P;r(To2`E%oskn_27 zKp8VL%6WJF*_XGrvQDdiy8LCJRJprvOj7g4Q#m*9Tduw~UE=}f)gS$r4df5SUk@w!rT%C8e};zt3{hWJJI?*j z&|0~!^FM>`e})J4*Y--?{r2whrM*0I$4`6|%8ROx7JKqobb4{&_WaXxp6|7K^*ZnT z)-zjzxLn#^`Alf(oXNyYj4~6 z$9;*7&Aa)j>iepU*`LoD#)W$I`TRbkCS;Oi8eU$tmv@;tC?sPxZ~XnAVb7O;QZJM@ z9ILPV&(L?dRqf=FWe}>Kaf6m%}d-*@oj&A|ZnO+T8U73WUx zh2QO^Uj1=|7jSo8&)svaI7+r6GRj?erTVXRwe?Gj-pcPSyVX+v>gU&gQ%{{Ud%Ip~ zOR2r{=~ef{{_UFfX0r6pFaNe)Jk0m@zWK|TxqFY9*X*17dhO-=q_+;OnWoP3eAE&>!tqxzfC3@rMx~bij>2v4r`T900bWve~v9#CuU-wUZ z?o|Ht@m%rS@U?m$_dogaK1zIA#m(R6Pzdo_MzJ9(ws9OH=ZJpn%*JYrzCmtTXt!CcdS6%Dg zeQovX^ZD{&hR3CjC%!+QORQaOZF~DaL*>g`-7v*aW#^2}7Km2uVb8i3Rzglm^ewWwWU+Sw=@@%g~&?Y-^!5LOl?bm;@SnH-! zS#Q2Re`%4p!1MgGuW#*M8(8?X&i>Ml)tzN;A79^F`SsGyZr>pS9M1vv*xya(?FV<@IZ`+p6Z3l}i@=XNYrmnEU!{onHMJ z`G2?nGrYC>vc&Ri<$6TT8n?=hD|(*s`u_~zvMS6p2dSR*nLwz_n|(wcS}C82Ik`Pw zZtv^GABB_O+^Mhr70$XcHuuv$pRez~tjRh*Rc=~*TWR{=%9*ozui5OMe0~3=o!m3G z=l(40`Mxs$z46n3@2~H_v`KQ${haXLu;s?~UI!lhonrcLyIyq7?cK?u_cFcvt>^o{ zj#)OJ&F1{<%iFK*&X%8k=KY-dsN4Lq{^k~|D{j_DOMhHfeAdxM^7iMtDPQMH{;ZFZ zs`<~r|2l5=X7|HKLweTrm3=yIZD0BN*3RhDJ~==CR)^Oc=iNS<5a&8~&aZFlq^?~2 zYFTEK?fy5fAjtjc<2lc7E$e#>GG}kOm|5}bTN`7|lIJ|zA@wx<+T}^BWj)hom))N( z-y6QDt9hZy)QKiV$u@Oce&!j2I#5?u?cRNPr=He#*4VqRvyPp%OMh=`U7NLbOXS_p zRb}f|9W;Da{PJ&hRKacw!yVH(USvevczovX^W`7@W-r~|ocDhA<*k9+C+EGhwZ3|> zwEw~1?5j&9j>@z4tqxoLpP}uO{;J1&jT|qnu3i7P|JsDR&wtoQ-90Pkb@oxKTDyawh8qs!TpOzM{{b;T&~-HeO4fB_I6Lw;;`GdmhJc_ ze{8{e*>`o5WqW65uid@R=ga%(z^v-x-}C=e|7TbmleO*MRrUG*&cBXwTkI~IBcf&N zcl&qzzZvz9|1$J@VkYD>OLZ~HUj^}WrJn*%oI zz4eT=jCtRx%DUh`gZ{mxVmJTUUs}>wp7&fJKOrX>GhbXEGoc4xRgV^M3{(dvG_ms3i1vrp$Z&CI1=L|4@%al99hH|K%{GD;=)x zDtF82-?^oK;ZL)OL@OJ12}^T=A{Xq&yeG9~!&`^dS` zvTi;1U;p^`{_FBTu9pAK{%6>>|F^35;`-C|Kls0{_^0xp;f(RWTmKo}OnsF&eOHZI zrT)G3uQxvar}&>?dOoQC=XL8NJGAkibbU!p^c~dd5q-48eO<-$f3fus>M!lt9|4M) z5Be|TRz5O0e{<)*?_btiU)A0GwC3O5eN&Hjc4z#unY1R^wtnq-)A>KLv@Y)1a(nah zuWv(=-^Uq;rN0b$wp4o2)4lWF-rw`(ZB*dP+WOl641J(xt~VQ~;QhL8-zC}G|8h#+ z#+t0ul+&}8x3a(fhk4?^lm8i(L7VFRZ|48X|Ig4@|Mm5SYv=7hUH-Bp+b8+?U+u-O zmiPYM_dfsiC!04fEB-S~yZ__;e}=f#p2^$g!L9$jJG%4k&%VC3czSQ|oT_WaOBPi{ z#2hM}|Mj1{)`vI8&(8TBTCaa^?cLM8^YzzPt(32NQnvGpK>oBh7q-Oi{(0W(W$wDN zcRy{duWR&gw@EjVzB~WZdCTu>lkI~01=~vd_C0!Dc7O8qy~XCfbLaPJ#k@Ozvj5ns z7@4;Dx0XILLAy72D)4{KK}I9Hc{X?LQd$Imr>xj~b!|N6tn z|6BUsY)Hq!e&c_Jm;3)&{%5$p-c@YpKl@9~nf;IdYWuHJ?*5xN{p)`Qp32>s7RTTJ zXZU#j-`;fpAP=&gJXb|N18+JxajRV|J!l#OM8$fA2p8 zm1K-h|1+ePpP&1mVN>|(w&p-PX6qxzLhIKnAK&BrpF!{b2mO~3Q@6saP~9r_6C3bX zoQ-m)AMyVz1D8`z-aWj#`PtXEvEd!k|7`a^h`+ScduHMGr(fSkhHUM7BQ$C5#p79G zm7o4IRKC9bGG^%!X|q2!&sB%#SDKa8?A!aAt>XLJ=Mvx6tE~yHl3(~h`;_7L{cF#x z)--%p2JSx~eY39yHAiA=TcT~w70)UAbv5y_&-1gdoC+`hy75wU<2Gr(|arYjd{(FD@$6D=OOQV&aewZO1RQ_+jq5gXNtKjN-r}geV zZ+_ZVUtag_^X4aC-$$Iem%mN>%<7;wzvu9A2KU~WUw>P)NW1pt&;JZw8#6QK{%5dX zp7lZr+W5ZWG&}7_PfX^EVq^F1`IdjQt#*0;DEnD&Ry^;%*K^6T?<;3*Ha{Hly!Z6B z#n%5BxOVDpEByR#s@z<$nsc?*wb`qpZSQ}&{AI1?;h8cKYrK{kw^o=XKRZ{u@`L~8 z^3!u3@6Eq^1Jq2dZ`=9v!OiW@&eg8AbUiw^WVPFtQmfh0cPb$rpiP(FTmSR-`}*|S zcj@w)d2?Sc+qmyPL*(!M{*QiL_m#S46LVTGIQ-wP%6Z)~GtbMf^*X*ZA@c5XP&aDp zHQ&3dueAE5)R-xAz4SS9RbDP!ZvUk{@BaDxtf~6X;Ps`}&Gufn-Tq5Ex_A4$0kt>g zcKU99Q{*+Fr}W=;L*0dUcR%~`Ha2f|;(T*ZBpA+h(rwcH8@(pXZdVlYewy{>FcXZ?{4H*oBAgS9g6r-(3&x$=?6%x3@xN z;?HARMRVSrmxK?NNo_+Od*cfLrO^G)GLT2yjO))_gblb=A907I#vR!|3!i>`eg9?b z@s9rtPj7>UmK(0rKb`*gulBUv7rqy*Sg!y2%+q|mLQoP2ynT9i`RTs7ua+(R&!F?4 zLH=dHEzjORRpFDKzL#Hctm|92dwSN)`{$QtwcosLxvuKoeFXtppm*bXF+r5jBlxTef-1&uTJ)>&wpR<^?1qK*max# zGw9eqh`+RBrFHo1_(yh+wab_Ot(?8f15_+9{@Z&0w)5Qk=F77ll+^#s1$RJRnmOC0 zKm41$nrmH!y=w~-`)RIRleR}`;Ob7etfLz(r@Pf-e3N)dePKuIlIK^ znz?^-pOp!p+?_AC_4Iu+oBhXsg&wX14a{HD{qpnEKX4&>X|2n}lMRP<6>a}|W%0Kj zP*<04wq4Er>6iCk+i|t#+q(Ha{~4z3Z~wYR(>wUu@rz#bzdk81J3seMRXF#@^nZ!+ zp!Aut?$-Gq{~5R*)#?0aIHUaUcKw^FZ-Q_9xi2wk=3}IRys&fdVY-N`D-VD>!RCL? z%H!w+um90ge|$S=c!hCA|JV5bFY6sX3jAm22elE_aRQ%!?gPTFKbRj=e;wInl<70)F1yDypFAxsxtm^#%ix|tlq}?lfSN5y8CYbMOwsuXg3dm}GnX*U{$J{xiJ#mmhcE>%i2)uFokuBfo9Q(%N|CYV`SE>A$X4 zzBAALX&-ey?DnlmlP7DLD9t_jDEH>0U1yE|Mg5b%wo|)s?)}y>si^w3&oBSFwx!&n zSZ#{^dgU#f|Jfhf(cf(kEzwlV!dMx?nff;P#-HO7e?Q|GMp+%) zg1=$NpZt;I{7q1OyW{kY&7d0i%evd~lE3XiY0BIr^7i?cks-YoZ#S=f^R)P!skG0} zc>DGFON)hW|E&1=d4ASc>D@Y@Jp19gerK}d;Y!h{N7xy zX*O^CM6X!CSYJ3FR32WrX{x*9@AZG68K8B3(r4cNz5m*0=WOe`__(hZ-`?$)O$~g0 z{nsDArKL5`VNLLL-GBcxd^!(mg6}!~Hrl?~^7~rvTKD&L;5maUi#yY{Zi-l1@t+~S zbLpznyH7m^b;c#F!`5Cs_jkUU;k>W?F;`Q|sx7qQ&WV|CS$=%(@$dC(%Rb!8z59F5 z^Lu+9ovMY6sLY2?RISbmtqgqrOhP{2{`HAhPp=mC-}%n~?lVPf^}YG`JlF&4ZKwUV z_l#a@6hI`=6gL&-$VfXy)X1Stzpw-Z~WZvb!@5i;!6h~%bHaly*GdE{JmfQ$^YA%vTc6<&umD)k-QVXgt=l`V@b~#kyDGl?N&gN}wDxcN zzghKIy4zAyXY`Ym^U)`Oh8d~f0OYtl9Q z@BRAEz<>GP&Q+HR(|0x=KeX%muRlD?a__DL&4evq6Zud7(gs`aCGP&8ZC9?@U43$zIIuWHUE&UVwES|430Q+jm!-JgG}!;EjH%kTNCeNk=Wx%>C(A8&Qt^5#Fo>3DEQ z#;-(jp1fIC{PmwQ#u4fNqUs-Sx&P)r!!KA6??wusIVSgE;;-!1otyu5#`@R)7>~Iw z{|XKJb$!PU%cZ}!wQqkN^)d6t`SI;N=G zZ|{GuDqE}SlRit(?D?z-TwfHqm7f?&v}{i2XFO$ zl;6Goq3FNU{}~*Ahu^BX|1*1Y-rf0c=KOtsY0rO#e`3%7I{at&l>eV$!vcQaB}Xgg z|It1FtMNa>ll%V}65WwG4suh1@6Aa1{#W~){lmQaEByZ%)c!O4=0f3wxvuJ!>wfZ| zVe7A;O8d8UQ=iv=*lz!d{XfIx`oFF6NNl~3_-zwkECNl42C*Ek`kenGdj41D{|qPh z|2x!=#GbFEdS$XLS9a~~x}4-&8}v=~-nOspNeAWibM=Sr{AXAp|Ihb7!#9!3ACt@f z94zerRrR0Yjkea5DSdbJ?3Riz|N2AhzU#|>6Tuz!SE(24Uq1fNAoHK$^|kyzI&VN# z(SHWD`rllEAD!hvRn^J){|@c^w^sOO<=yD|!}Sw0UhMz!5v=*O+hvd2`@jF2fABxU z^)>cCB5(d@nBo4<2W0#H4_nRtGn|pO{Lip_{l7zV3NG%PoAYXQ@BY(&`u^R!oc4ac zo4O<|1)qG|65T1)BHcfjX)I6srI)^sx12NE#dC_`fNT@EFi~-wZOBR zFLx~3a~j!EC@x&)_;M@C3@@_wVmrN$<$qM;lR-&M|0ZZEH1_xQ-2V(I$?yJcVSN4z zG2e^aOuWJnzM#hF$L#+MT+e?8|5KH}C7=Ik|I_EEZf>ss%{%A)x0iACt_(T<84&9i z0{OmkD7;rjH~FU9Og#65k}Zdd_x>?5R@OcPH;Rm~uUQ+D^Z0 z5l@{YP9YbK6$^W~a$GX6dv2Vt>~l+h{gJQUPl8T_vMC>DT6IBTcijj3AGXn}4NPCE zwhB3X?|xjnS`^Wn(+b}krKQQ&)w{YnLZ`5CY-6m$q#J0V$`}MYEZy2Xr zANVj?arP!{)=bV;rVn*)_opzo-n*TA>HIW;5GqpB!1xXLdixhgx^GDXSWj?1RPsv@@_ zH?<^Dp&~aYuh^=>RtapbRbH_bNLXJ<0j#7X+g2&UH$cHTzbI9~M9)OeK-aY*v&=}z zj!VI&C?(A*$i)q6L{Unbtx`rwNr9EVetCJhUb(Seeo?xGK4GRO#s87`^C$wiq3C7Jno3LrBRlk!VTY?YL_6ciMohF9bk`1-<)&nt$8 zLUMktennz|zM-Cher~QlvX0^s*Rm4)I*LOo3sUuiQj7CTi;`1a%Tn`7l#z`{Nrvk$ zC@snXdnYAXKQ$*cH#M)MSl>|35XDN+T57lsP!ObN<`#f;Rpb_+s4U4$Lj)FzZ$L6& z?;ty*BDVl;E{bZH-@%H(VPxf!pIi!Zo~Mhg63Bk5l>Fq(6e}>(*w7%=!obo@H__76 zK-a|5)Kb^N)GSRm)zsWD#mK_cB-J1p$tcgf;*!L?qYNJjV{z^xnuJZ+VX^b8Op0Xc~!Y57IDwn{#kd8HKyiIB|P)ZmgtP-q&O8<-eb7#o>d z7#dreSR&~TOD!tS%+CXv30@Ts)((mmEB~U*)Vz{JP&&0$G6aiP0>P@GtnngVtwTq-#uF)uwe z#a0QLTwz)=u_Oh{WYaYBM8hOqOY>w?T@w@2RNX{VgG60(v*gqyizHJ^14}bh(~I-d zO3D+9QXSJ%^Ga-$+%t0vz+t7J0gfn5RMq7fsi0UeFf!6LFw`|P2{AOcGP1BTu!IJf zKJC3|mXcS!{(Xae%0fiWyi zSfF~*Mjuox!Xnj1A0yf!3XsZCJ1zx?SdfdG9hZ$hxG)D5?9ea+m8>+x(Bwu#8x#~2 zMlB&Jd`E+8G`L6#0g@DtrmoT8A}It&QaqZvs1{sYh#q5VUW%`sf3r1!h2CHifQ;#z+ z2v72KaSW-r^>%h-vGnzeZSyyu>6*&mF=2}4q-iqhp}Wr1pIU!*?P?i!p{<3ioJsTl z)`+LGadUc2dHkzLaK4s^2ZM3(uI1CezkSzee|`Sz`l`;a^*x5q>YXwarxm^a|H5bL zKDm9jSFee?S{}*fne>19rG4V9wdJuFs=oeSwBdNj`d6R7e*gN}zWDFo_x1OG)URgx z_w#(c-CEmZ0oRRH`v2Fph(FyuagviJm!{yc2WQiM99FE_=?(<*1-+6nJ#)Qf~ zFQJl23YSG@KJT!J*IF3l@NU0g_?p65wy{vxd`}>RL<{c`EufM)wV`J`lJ?ZT` zBYWG_U!PP9H+Omk-+3uwJ6rMc6|Oi<2QRL*Cu67U@OU;gocTWe)Q@>f_q$ijRk8SN zc`v2OdghI@s+>ya!w-qGx@mq=Q21V(GEK1Nr_+bi`Y+<^U1MSuFNtgqX^`MC=xe_H z{_(#*#_wjE>%{G0P%OyLFU-%M7?`p>@NS}}VbtX7St@h+F22+2&YQj?PQCc<`=F+O zau4smoKj$*uw&Puy*nNI-8wX)v=Stlr!3-N;yUl_CV1|qNt{Q za6qzmg|3)IGoxGfm$$mVen}b5w!JqkXoeeeem?*6CoD5ly|15;eLnl$2OHKYhgO>$ zoq3+~-8&BZdNm8{!%mPXM=g|GyEosi%TD}myEZocgyab<7431 zuw%b_T#Q2|BZHD}`0Z?yfWLM|U2Cpd^0|3UGKl&2_qXVW2j|!iD?U8R`mddT$NPJV z_O(tuZXG{sJ{ufoJnmRA?{9*YtIzWD{(;k{pRj1Fx?3mUy87{Tk-*4_Gkh*Y3AZR7 zD->{Td{fpb-J8C%`CrtQ^-O^l5(4w)Kd%4P^7|q4r_1Wq>DSIk+;8{FSgLSZVDiaV z=2yQL{_&X5e!ugfz~p5cHaEZgo|w)q);-neTEBeng!p|AcIYL}Q(nw5^Z99=DfP;s zuh!qKRquK;_y3=n5B^rq>6Z_jZ>PxC?0#tWTv?yht(hik#P8fan6Tm3zUznIyi-~h zd}O)5wqlKZaY@U{>w@Oy-|hsqe6Z=Nn!D#dyQ0A7owm=9wz}rO&NGx)@JYsUesuYT zS!>SlvFBpyWS;x3 z-QIEQ7pECNDdDQji|3EcxGT%Xe5Ihnc;WjJTb4!ldN3%+EiHp17yBs$Ii3hRqkL!LktV=ro%QRY7+Co09gKO?O z#VgC19$t=IaO9_V&?dPLuS!=p*lf=<=o37wcz5kDo%K!5BKm7Cieuo$1Ysal|+ZA%GwoVgtm2UA`cARj%8lKC6ff=VgsxH%l(i4f9U7i?Z*$v%T9d% zK3R&_MMQD^x;MQM=XtL3ny@j>xX;{j#7b6I*(}lH;_Hdus}`6R*|<%u+qx+%WCR;OmQYhi&yU6E5&Nz2FD*|K8X+)dXqe^~|p zwRJ40Okh=+a;Rlt@2#_HH}A<+?(Lg%zVOfmr--Ej%?FnWty(il<;BrQg*uwG*Jk<& zR{9mx{VRPKzgOwsOZ7#EowEgkZf$w>``gzIdLOG77Pwk+Uq4zQ$I_TuwXeTW=97WS z&AVIoNw+DeN=;BTxEau7c*5i;N8-%8QuEja3VW<29;8a%`~5v$)b7{m_!;}FT(7*1 zin5y>cqQvZ)m^RYg$~(0LHAi4{k0BoB>pTDm~j2I$XPYl<;j2dYE0NHY1E}5)4t@c z8n<&#&<`h@l`IpNiR}A7Lwt#5kE^@ElcIR@tyEWE zeZ#92@1~jkZ|Ty%dU^qYr_Ovod3eI2u){mn`D%avzG9KX_o@yXbzbL71~G9b%+pp2 zmB=K&Dt&VIF56<^%q|(8f<+vLa<{7vMjfbD`O__~b1Ro?X+Wgg!(G>0Py4tmZj|Z0 zFq!jRNtajfrdQ_YgB(JOgbuMyqp1Ae4#apvgEw3K^l6t$VWnH$md*9(L_uUzP z7Ef5~WhB*T3k#`s=cj%?FH3lO4P+8K}G~nc$h^otoKo z!ial@oQRp+q?x>HF20^9FE>d>Uij|^=ECL9&wh6-a!}=5wQBd1ovhJ&<=#D9Si0U~ z+Z=_y!cTK96rOlhdMT>6&G3$W0qb5<)w9o8u3xW6PhYV;Uod{(4c}jOZ{7rKiITYP zdd%?PUDR%$SX~!4W^P~0>LTbO_~{ML@~cWW?jN_eNVqPcc0TApQlqiVB7Hr%$M1#yT8fKb zd3@tn!q$zeLguNgxXEKGm(Q}t{m;T*YobyeU0nn}J!9LhaUndsCA8!|+qEvHjS&m- z@^b}Z&l?4{$nab!FMsiK&Njmx=arl*^L#D(8nZ&({0$HQ!yolW>>y+S+AD^s-ExTm|J8 z?3>PK|LfHQhRyr^FTM=8l2!Itl`H1bd6kWS8$L?Ng%tWkzMJ;_yG2ma6sKOd)e?c6 z_p)wgf2lG%w4VL8deeeme{L>2So(U+Id#>en{^yCZx^q=YVh`(+uyvG!M}g2EMKnj z`*+IMUzb8%rY&5=VJr18E^d*1z1!O8hWEF3o6KFbh@-TwuP}DPrB6Mtw)Zs`%5>#T z|MFwTj}H@4(%bKRH;mHf^qb1|ceVDP?fGjDT~D6&KKM&j%3Quki6VWLlf@zv+7v&& z(>r-l@Y64;najLu^cHb^nxn+g@vHXPU%Q#lZ>pWD>8meKPs|UzabHiY|I_{%K4G>E ztER+Ve8MI9%dW`A?TDe9=B2dBuFIXJ+C-KLl}r-2bN3-H+liMVh4uS`k~o)MzP>(E zMqYSp)E$nGJqjACo&pBh4)S0+CN_TU*a(A7MMcS!`?E-p=F<69pba)#ocNt^Hy%C#qM8=VbGNYrmQs?iA+S-m5Vo zv#YqgJ?glQYO~M%J&FIe?>DrxQd)OizH!0&O$V2RDc`z%*wV_$Z}|%y=bAqmpI=q< z%<@?ysm{swp!ayo^XJ?0E6Un_{kS;oqW9(XQtG0t_il7OkK85Owry?LGUty^xi1wK ztWJm&OYad#*_Z!&nrG9R56&{{7nGb-Sgx+FVCnQ9bQLZX8_q)$_Mb*gNm; zkBpS=c~Q5m;zS<$EN7WMz2*JAhx=-G-*os`D{b<-wks@q>&>s;ZHhl1F5J8By}q`$ z%f#G+jCq|V)33fStFGMK^ExVL1|3-S+q37=IDeCG^zFM8TD*EYF z7HhXH|K+TS`zjm-SuD;jJIWfRtf#NLQFHsVbq_^)Hild;^e8VYI3+amgi&|EX{{+< zLLsyAHeFR0P2icrE0}Mx$@J&>`MFh^TwP(^d#)?nS}5GSyLGX?x%sxtU+?ZFKaAg_ zQ2%q%m*euCef@?}%9liB+q}gM`kVvTPk#4K=zG-;)r&<_oHSEAZ-}XOEK0cezS%IP zmo0LAdh@fpb9JxWyZ4BveaB?Z!o`gr{yx8)7`pA~m%p~3o*m;_YP#smN>_m!Ii@m? z;$j}mn`^6C^XZpqcli2g{~~@J!n3k2`c# zbgow|-p3&j=C;X|Q>icT?z>IZdzKuYw>_(6N@TO{v;SvjJ!lhJbRzE0qeDvTbT*qF z+7z_q>>KTekA)uBuXfox=l#lM&ex^}h^(-=&(WjQrK5ZO)}!`z(dWxkDyK1Ri#TXh z8+!C2S9$owe^0$9g|A=p!T!&IJ-1a?UOy?z9$MD7|EBzuNlsoXu1;IF`%Qpo>(-Va zPNhCw&Z0S@AGM568%3{4Y|qzT@T>6Tg;n3(S4GlbzfiZvyu-nx|qf9DWPOFw^wiL38UAyMI%;umEL|)Y3dMp@67Yv4O6yle_uIm zjZNr*H8;Xmr*?X8_r8`hX}6xy`9kk*!_@XP$+h!exV^SGrhmNn+H(>Rp4$kx0T7G_Wk;hNjvllmMPhn-OjLa~xw)PK8_mOCNoixSiiRCI4mwN>r zT8j$;H+j!g@m{p0@T89O+2<|c;bMDq#Jmp{-`_s}sG&si%C)ca%$((~Nu16Li(7s3 z-L+plpNdZeyt7#HRAkxa{rS5cr@pt{(qPi6;@IbAk;=S;gK4(f`}cyIC69g2H8$l5 zJp3>#VV6&8(#8Y3_iSmsvD-Rirrzef>1!@;l$PziP+orGclGS|+eNdq%55wZtSuB? ze)aI$lCh*_AGb)<BgkJCw9dxef9N3{g1{sKW4o6 zGR1X&e)EQF_s!)4G+d=vbgX1s48xk&WqW(MZj3C|eEw_3dBN+~JG#DR_RjE`cF>Er zeOkcNpF$D3{rmU1oqxU|A}1i~=G#LF39G%IX3X=rymoWjvWpQ9`!5GS(~sNm;%m-r zzm@N$CmK3Uu;wdVyivx2MZmLZwu+g2cH*W(?W=kx6lW?@=-;Uz}tPkCqAHC@K^3+>w`SLS;{gEYBDqC-vKX3aQ{=D?s zr{yP#rH?W$4|BeEKYy;U**fowS%F)k%yyVco!GqjIPbLOx02V29X&n$iMo2q-F3ND zTB$b^C*{mFFg~mHvRmBc>D>9{yS*QF=dSp+^YA56BkyYtp6`BF?47rk6YE@}z`0CD`2bJ@97u}bd@vXLNy1wWAJ&M0Rx^GIm{O!lC*en0`ZEe`9?&f1T zWv;oD%I@7~`1vBHG`_byWS^w zscPYC)#?~(Q?Bl0>$@9f7&RVhNnb^Mm`+1Ac zpBL zZvM@KjdPhb1T)@QEZMi;@NMd~y9+@H~{AYi)o+2FmN$2 zFtRW(g48fDFfbyqnHZTFm>C!t+87uZgczB@YC!6w7+JyW9tH*mX()RN0|SEwR1HXv zAtMt5F9QR^90mpkBSt0$5s>W+3=Em=5WDsFlD zNYBtf&)AHC!N|bK#LB?X%D`B`(Adhr*viC!fsui60m4NL3=9mM4F4D)W`o=a^ApIS zFh7CVFh4mlGB7Yh-3tmCHYBzvlnwF+BNN0-4@L$CCMY{k8)P5M?f-B5f50H%<>u+e zz{tn|au@@{|Jw}C3><81>};$Y?Ck8EoE%&{BD_4@+&q#(!u%q#Qu1=LQZh0MDthV) zN;=9iG8*QZItGR&CMNRgmbMl~HhRV;Mj%5NIXO9bxOpUac_oY#WfYA_2LBH*2y!qo zFfuSRDlsq#GBOJ?{y)MX&%nUQ$_NG!uP`t$GBLBTvaxe;a&iAZ!mw3k%^gsMUYiU(a@1iI53f2sZhkIapFP_Wv7h?MT0JWP%%y_YU1P)6PJ*b zQdLve(9|+9H8Z!cv~qTFb#wRd^a>6M4GWKmj7m;PO-s+n%qlJ^Ei136tZHs)ZENr7 z?3y%r%G7DoXUv?nXz`Mz%a*TLxoXqqEnBy3-?4Mop~FXx9y@;Gk)LRo;JwQ~CcHau@J3jLHx8@L_(G ze^~!Vxc$xgkLLd_{H~wc6hI{-5FL z{eP@~wZ$6D_9Kb^yZ@hIdH$cy{|wjGL?xS92YWrpt3TxUpTTecPvQRzYdvb5;p~_@ zlON0LzYa;+cg(*0KSO`Gi@~LddY-b4AI1M#{bzXM|8J}MAC>qoum3YlwEuPWh}pvb z3_klmzW=w?{I~nRne~tF|INCakp8#+@Z`6Gcj^zh!cF#*Q#}7?7sQBy=D_oRHvMNf zzW>+NRQ=8K@BU|ae8rnpg)8H&{X@n749nxeu3dHM$KpKu3!mrz%Kp!AZJpig;G3Jj zTb`@${?D*BCT;Qhx1atqT-;m#bou35y9#FdytaS+=j7Z};cNcgh5s4!?0<^?XIL9l ze<<`ngI_$D6UXpR>E*v}h}*0G3F-eT{m*b>{@<*xOAl{~zy3#9w9|cCzu5DCG4-GH z|1(6bb$!%(^FM?0G5eS6|1(7GtMV5t{m}{F8>)`2TLD`_|GsM;-z(Jw}bER{%^?sc+kbcW@A~>r z|KHY%`GK>hYny-TI-dNWfm8jjRXr%I_5Y~Ue|ZUU?{ocCkL7p%XE^?!;n$UmtN$}x z=KoXwpJ8om{LSL+U;m~24yp17DThSOm4}buzWbbrP#t`Hb-Miyh$&ZvPOI%-|3hKb z;*0Jb#s3-fAnC#T@BaS`e)qv?BPK`u_xHN@68{;pwoHn>`S|NPt}Uwm#jYyn+JD#o zo4fy$`hSL~{8^Xq?xpXL7<8tc7|u3cOIFZMsfgZN7u zW^VM=ZZJ+->2G#-zy51ao8M)B_OC6zzWv6{-}~bq{R&^)ddPCK=DEZ9`QP6By}tfq zt?laBJFXUP|8BSc_Kl;z`I-Hm1c6rVIwVCefGv^uh zSABYwuwdz#tYvQ^r-z)gFaFQaU;lNL{agEA$q?q2ZIQ>{+kd>ZQgyxm{4eV|E-g8k zJ1hRy{x8S>GsyjCcpdWL)qjTS@A5zXGyG?W+IcK?$Ftc{Ho9i5=gxaw-s*tyCy8ijE^Np8H z4Za-Y^So<{%ysMZ+WqzKKK9g$=DGdee6%J`neXLZzZa*TTzwWVZvTw`KSS<+hHrDL zax14FJ^!=$Kf~?%zsqBm${DZ!&v1JGAMRgara7i-OHPXA{x z_W!%9{%zI=)Wmg#@y)IO41ae2XE?BbY4PNJW*=kaJM19^>*U=zIghVxUnrL;tiG^$ zMeN&8|NP_rGk879|0@5r9+Z)nZ_Rmixqju(`n~sG#?{sq{#*a_>-#V3_n!LDx%xjt ztRL5A>C(#G>F@qlU#k@fzvRZHb>eB>lM8Bp?>v@RdpbMk-Os<)VKV%i%O%fguh>xk zbxu`%)YGG$M`OiVqQoTsGfbQR<89LYi2BukpRfP$S9{+!-`_ir8HPoBeK!34Ci(CD ze|sw?o~fO(_xbal5o*)usP4)W7^A|F`Px!VCMp|MLH5 z`JdtX>Pt5&EB?MK{&)UAL)@Z$B}?AQzy82+VdImkx%;O-t+{!wx>j3k*WJppzw_t6 zulIVg`bELy;^k$8~=ie9hf2;rX^>LcS_x6>4D=Vdgm!IjEp6++dzWP5y-+zX$ufzQ|oS*&sy#K>r z*B5y&d@lb|{>StG3~}?traw*pe)Ifq`@dDEmX%66o&NQQD?}>Y#N<7wP5^7w`*c0+ z{CvyvS#R_Dr*Ga@9Fw-Z@ZahuU*CUO+Pv0k6X#LosXJnKSAJa;YI|f}+C9Ub?<=%l zE|?WHXHC(zJ0GLWw*M~w_u3X*9!E|Iw9wQx@H@WjrTNXz`^*2{fAs5meX8Eu{|tIo zeEHY)?dLYUvii>u%lAvjN_D;QkDdP+4C;U9|7Y0p z`qJgSmCF$+GG5`kHNPaHP}^1tFSCv`;j@rYt_dmn8)c*`K zm;bwK|7|NnwLUBn_V2ZS^`AlhWo&&%{nOi^`o3@9e}-xG{a@CdQTl#j-f`B|bAH-? z(0>_MU;RhExBS=kKO4a%Og>9X? z@9lpEGsC{C8+45SGw9lXy!B#b_tP>}r|05Nf7X7Ub!pSiWB(Z@U*3Oh{oNan)8E_H zw{1x2KYiTt{MKyAV_RI)h4)>4Uw^Ic{pBC~wqCy#lXw5qW#@? z=fCOi_S$#9ej9H;BSC-FzipqbG_Tky3D3RC`r-KWAO9J=&TrmxcmMagxv$RN*?IH$ z`l_Gti5j6-UO(Gqv;2rWGy|UqkB4RKaK-o~3HB}f*FB#dT)h6ne}+GM>JQYft@_$< ze&&z*s890z{~1mn|HJ<4`kE-u?e&u9w4eNFG}pCX+qcK==+BCyNpZ1nZhlI)eDAk! z-|eUW-e3Q*Z|ae(sOi7f-vO2Rmv8Mb`oprywtnrOvsxh@rn=sL!{6<#?|%6zv}s~ z-`iEOJ2f zliI#TEpX$dOznQ_f6RZgFK=1@Gy6w<)Ms7oe^LMBukF?MwtrpE|2p1y?yLRll~*-h zR^@RiS!1)^`r>0NcsZ9Gc5eTF2EG3bAM{^FTvb4=URNJLZI%YG zZ>nhj7rXyK{G}bQFV3CcTNbAv`P=>v_pfl>qM5hPuPseX%@kB!_&jP;{mSRR?_b*S zSbYD>xYkv!|5iWy`u58@qsLEg|G54_vNrnA{p-Q!S8UaL`Lf@5zW?jk)IHMMYi_)} zwWB+G?e2a4eqZlo7QO#mam?`k>zJEeQ^L)^URYI@B3@NjR`>n-kNRI0UHU&m`OAA- z-mfuy`tS4gA9YjDd5cf)E1sYAYlffckFmN`F}Q_t9^aOSBajA34 z^TK3sA}kRTliqXwUb4hL`L#&Qa;v=A{pR2I%|HD0`?{Pm%i#Fy(v)1}=_9c^<`>)sRzx)2{I-X~G_peV}E4;dYZ{>DGff+Yh@?7@W zeR}n0MTnE`R^u)MvN$zB{k}z4F|<{|sJV3M9(I>aWk7>lrEWYwa_e`FDSP{}s+#Ubs8` zbWi$T|CRCYKJ71k{U_c(>u}oV>SWPhdfc3E9Nbj_c9u6{0mZO@;3Yagfn&B=6?_3@nZIdom_=IzhFzV-K>lm6sy zX4G?wpY~BdR;-#h_2S*7ef|L(&QJe+KmOsb>g(e5$^H7@=j}iIWxfB7+}{<)jAQox ziTw00KkmNQublnjs*C?^x6E>s%Z4QNRTb+t&Y%2st@Mq;&CkBRjrlY2XT@{N^{ba% z4PANSi`u-}+jTL?_f`kG=1uZCG3iLqV|)GA{?owLuk;JOJ1^5h`;H#h?#*ZOUtW{^ zY+wEIk9~aA@=Uh!KlkRY-h4Uv`0Vq`zpmrSQ=eod(JnPKX>3RPdreEHhsr$|N_x?Xs`=q7A)`pcIRLRnMY;##v@@U|{3;!9GLDK!i z^`HMU==^8+`0CR%xux%u<5G&Nu2_Du%YR??D}4GZgSQaBem(uO=DdDSvhBaA2eLM# zpZdACx>ozGQPnx^ss9&-uH-MNRzC&GX;X|IYo-u;s-?Q=Xsy z8Fu}9|FO1qm3-&hXZ5LtJ(c%=tJamyOqi=Rt3Fz8s^(oeM_8SN+SrV<+maxBQS*NWx%nUL|4!S}99L62zyE!`*Ee}#Q1|f<|9^(m^~%@7 zLEVN2@t5{ZR>_|K>$BzRHkm(T8+m`*_W7Xh)$#ufzpnb_2AAExgWS_`zh!^( zZ`R`JPS*AD9dpCZcF$gWyUr)s_OmuPA%lHT#3LI3`jm95L_`@gKr zom}^>uqQk|HF5Wuzt5L{_?s=`rhZdtvGknzH~urcT>dg}#-DvZ&u=aJUS?fZ_xbvd z?Ed|+`{M2PU)pr|QSFAOazPgB%$`5}o9)FLp7$Q=p640sR$l1&uIRaVQ*6HEe+G9* zNB7EqhPUrQJyfs;EObmAq-UeNO%2{|w;3JhkIW&E5UGjv4=n|C@Da(Uvy8IcCDMlV@&E?#dPU@%wt% zk-2RRKYzQ+-~G3B zt&i<{#qE5u#t~ivZ`}${O}aJ3ciy7*P|&--D;ZzQX@Eu;e#rkj9cRB@rglE4Rd{oc z*UaDg_V@oyeY)%Fy!XoA=iht#W&OgFS;vg8|GM*R-MW6&9slHyEnFM@TX$dld*kcd zFKteKAHO(w)|9+{)3x5;wn=aQ_xbXV>?mD%%fJ5_zw!t$R!{%7c`|N8oBxc|BO>i^(&{>$}=J$2vz zGsymDczu21-(BzXUw<MJp1bTKluMM#O>94CA-@$=eh0bDf??G zYpTG7^NpWZ>#zTm^qb`_sk(o9|7^=|tMn+b|uiL!)_Wmd53h(V$Qakgpjm%FwfpYoC&%Ny zp18a1?VPGhOYgn;GvoN)pq-Yte_To2@bBymRqYUJzfEV0>^Oh= z*LCMa^IzwuU*3Ohm-eZ^C}C+Mk1w@1VS%+;{zm+l&yY}9xxsqRxf{p7uIrP|y}hsg z(!OHBS?4BS|MiD&#wDN6_HX2WRYF3pKC%Atd2m>-4;Qn9^!Rua`+sKsXXv{w|LxEI z^*@sRSI_hMrDphVBE)R1$9|u-{rhft{sX8hb@lzDPk;8$wmhG|v_NXjk56^+pf2jy z4;H_s-v9diNpjGv&SOSzkDJ_@RepbaPqL}$+V!*dKR;%8YhUZBQ*WMay!?W*e@pS- z`>&(s3s(F)`=4Rk{@D z+!wm(9iQ-{89Ml~F&k+t=cij~EB;=0!?$>Wp1-p}3AcOy_PbC2+&ETUtG)3fck-J% z_0_+^Wh?E>YWD4Yy`638`4X46$qiR^jGuyvg}SLn??(Tu2B(q>>z|*W{s~lDn-_}D z-2UvC@vVLT8JOb&`}h9MtGueTOX60|j?Z@Se*YPwzMPed`FUR-)R}ABc6r}-P|fw9 zVSVhqnf%kA{keJ0x;C5VR>72#f7`UWGUsO5$7%K6J$HA$`ueK2=(#g~8qcqKW-9Cc zHy+X8K3+>2*l`}Zq@D#1^C{bGK`RDJ&yz9#Ep z-lw{p>WxKd<}# zd;j6D-`7+}n7#kG`SRAXThYm9|JbiBOS71%@q7QZBSC%3y_et0`D|D7Tz22qV}GJ0 z{vH3%u{g3^x_PMW?+kVFDudiQPCEw{*cltjA^S`OjX03;I(!YJ$ zv0VT4nL{g&+`s$y^iSLBznarFzXNxr7q0xza9aQPuMjb#T63*|TroT}a1w%Jl8Gx7EGB{$n-o?6Yrs!nZab)XI8usCb8Q<=%~5H#crPKNCDY zb1^x2zVY{Y^ACSrcir#u#%KS&U;a_I@5{#-Coc6)a1s~xzg&N<4lMTd;@|%KKU@B4 zeOoR`+p8?dfFI@^ArLZbnZ*<{5!_)nszWv&li~r_7{F{C7eA=UT z``7k$aXmBrHW%Ip)ceoi4^Po+&$GSVZ)VT+Z2cSa%KE)u|H&`kTbO#Y+wc6Z`zLly z>6hEN?bEkEKhIT%Oxqq^{%79Y*UPV%{DG+~nr?P4?mlR&>9>^W;wZCpVLzQWC4b%J zpyL{`bLakh3+f{N)B5;3dhPCi{(fJtM!d54Y+ni<-TYMevufJ?YxmNwyoz|QmwI=5 zPqOXn-Yc`^!sYf~TEF#Q{nP27rrx!6^#MEXKK(Oq@4u-h8xLD}-M=36%IjI-uG@d) z*Op3!9;GbwbeTLd4IqE>zMeX^MAI~-_HL# zX*aJ;{hB}aYYYD~h}Az6{LhfP|C`sJ_hOS~zBrtGY%5|M3aLZ2y5$16N0t9`mOb{_ zsF;r${~7w@f5?AXZ*tZB*Zd#iU)KA6R5*XL{z3hvJ@-R>e%kzJsQwkceX4!+ug?an zH$JnP|7X*m`lTrcew!E0d9=+muwVV-zp2gfiyvNnIWK3sx$^E~b^g~DO#591o_q?+ zpZWIJWv!_k_Z~e{O#}6`HYUOn->Pc`@9uxDDqDBjciVr4=+D2(eqGno7ku+LB}TdE z+1%yzYyZAq{^4)!>y2Bs+}{8E%iGYLN4NLS_q)2Of4fci;pC6Ovp4t;^< z&%pibv(2g9bM@N)GwA+jcwm2RZ@JHZhH3lTzpht8N~3H0&HMdd$J-y_djIQ_mBF){ zlB>c6@@{{w`nK}VpL+h+9%<)4{M-7;eqkl{j0uKx8B`8r*vI-z_#<#KmYpnEBx})9WT|>|K=54T~_IObpQ12&(0O!n#+6b z?tS&w(YIQ+|JpzQ`u0mZS5D8nm;EL)Bs6*Dk*mE^_q_)7##Y^l&Aa`n>ie3jxjP@t z4wn-2d-P1l>Gt-**lqp)8FcqQu)nsWJ8|y)*77Q&`t{F$@4vQVv)B~-^~zq=^IDhp zf1Tg{b)EI2^M4NhXL!5)-^tjeU60Q^zx?aE_{aQz3I7?s-Tu#zvi@vg|9xAFoQi8m zLrj}tff{C7C`M?wX=6nvsPJU{tKEDh;qKEv_xA3a`a%vi=A>W9_jbRT)wgwbRP)o7 z)TI}nERELr8NcW2Kl!DFpQC<8*VR0~wRh5Q|MReFO?t)48}I=AeP_QxP}sj+Kjmt@ z(z#t@b~opppKW{^QHKRp(yk{b!hLYki#+GIf%n`t8iW_m=+| zviAJ(6TM>6^QI~#s?GTK`ajkG8P@tvkGS0r?R`B;+;{FhXomBu?A>E!pf=2j$dt;h z|Mm;#XT2%&T=(@qgBzrqa&?iZ?SF<($0hzVWdCPa8|VD(y#Bw)=XPH==B}!J51PjL z&k(hB?c}4{>tBBq$u*`af+GFR9A;V5VSry0M)q`emD}VeE-!}j2lT5#w z6>rn7eS3@OKfN%Wdwc)IkNw|39l)oTv!u8EdkvZT32U2gR|9SVZ=4s%ap?W8KVG48 z&j(ob!OF5Vvsd2*4O#sOZTLRB@b~^}o7AopZifzZ?R=5C>U;e4Mo2|g^kd)N ze^XE0ne+Bf)|2g($4~ycR&4gBFy66k$%DR3>)z#B@6Maty0>x5XPfi$C64E>%?(@B zv|Cks;?1b^Ge7@Y*Jkg%lxz6B=0C&Tw_jK2n4JGQf8UpX^6U4OiG@|0|NCrtJnLu7 zc>~|*UoW4O1ue^nT4w(FWsE#@#3}#p^0=gvKIocs+3!HWJf62d_j^4n<(9n{|K7H~{blTI zz3QuyYrp6I+}NM>rC`Q(-!{(WaS z|KWdz*Vl?)+S=Dc`UI~HejW<^xBtYGslsQ%eQ*C~(5?S?|KDEyZ}opo|1%t~|Mm5y z{7v~U_y04<{AYN5sXnFta{ZrTPy^Wh*2jPQA9j3G=gm*)Zb`tdCr~wB+x1aNldqho4J={_Q_ewB)=+u6g;Nt>7^GGXLiMFSnuH*CmKB z^OJJ_YYy(deZBa1-Sn^j85rg#6&Sp%uZE8E@0yD=$oeNL%=q_va9~H9eTz1)`)qmq z!}Ym6XQxb^{`H5{p^n?uzPta``(52AQ*qvYso?SLHvgs?h<*xvy>s&>!wrma=^u;1 zrR)9w44K!LU7ra}uiHWC^;96PVf`x%_(!77!;56ypdYgzz5n4_zv(~2g}STX=9~YE zdUJbw`fqjn>M!f<|1-4i{Lc_z|7Z4phBq3_mov?-&-~AD=+1wJ74rXl|1*3OsYm88 zzGSoc{#VPG|9AY-%KLwG&;M%t&+z2_e}+VNWKP&B6K%QnZ}s2ydu49_&yfFRy&bAW zC_JsbTbfRMQEiq#`YU9SP5EE#bM_DO>aXzsXHfgk@S6*ToX>jt z{!8w^`1c=s{xh&&zPG6!Sy%5q?RUrjcoz2ms`}6HMtd`N-(2y9Ld#~x`SYjCzl{IM z|DR!fnE2tp^_TX4lK;;Tx7c2I^M3||{y#JSGrZ9}{HP8*89mwlZ)??i%hmZm@;@1V z(`eme|DVAhqB&|?l-%9_3@;_m**Cv_A9?@7=K5EH{~16!Z0j`N{AZY9Rt!@7x79W0 z(dyp)>rZ5LS)cai*ROwXJg1&Fv$F2%v&E0@*+1j_&oH_EZ>v6X0LJk~U0U((?3Ex} z!G-7S@-Hp=ZT`D{X@UHQ?e?$OA?lIYs$m{w?hCr>zx`+M3e5j^{bgMBe+KU2e+%k= zn*V3G5s1tQ{&tC5`C^z%z4*(Z*5g&5<9|fY|H}NI;pF~*hx(D&n~QUFs?s#G&+JDI zR+Pw?IB#}bDpLBrh-^=|@uTg*?*DW^mlgspRM$8q`_GU!_4$_ow)5ZqGyJu#2d%1+ zM_QfI>&lSxpCSK0!{zPZ)jEMli(ewHjB5MO@R~Y7!g~Ane}?Uq^}B9vwm&-Ox!k?0 zUR@f@|8IJBvm9VxU~I{Bb`J1#c2+1T%1_J8No8QDm{U8^*5h!1NUMLa>&32SSr-|j z5cS;|qQ|3Jl|neSI<4kY)BoG7#_QSDz4$>?!H4vXuO2*Fv$}b;0>{4w3u_C_T^^m^ zRa?aj<0|&_e|~4Vr(9maM9XLMu15{aZl_tz6xh5obmMbTMwW~H63bH4B#S3aY09s? z8*F|xc1rrs?|&niv+gB1IH>d)AKubw-jQyW+x*$CaK_Y>sXyja99qIHWM35f@kej* z#ni_1wzED}^DKOH#H=G;CWIN8K9VSOxmt2ce3RVjIomC=r%GktoxI;*%JuMRJN>dn zJav*dgyxpBg>&n^A+N4|PL2|5wVrhJ@f)dhv!bsy}1*ha55Fny`o zD&+9J`*BSVqwQ{o&F?JkAMd+t!`O8Gz|?!+!le(qQGfY$o0ugN+xEup*V~r8VVrJ# z;KO9a*_*UkGdWwCKGeD0pTgXh*SOC#KW}aE96JWdS)s4kEG$@#bx+y*?(@5Q=XU{u3XIPA-a9KE%MlZlpi<;HsXMd|v6mX?*7iAWdWaj57fXqxx$}cUkRZ`+oP*8vxUXfei>kBtNuNWE% z$@#hZ6^RAft&-L6DxATL9Kokz0VGvLrJN5m+d`0m*>9 zgY1xs+yc0{D5_z82P+1Lk(En+aw*7po-VdZAp5OS@{==DtiViTLxWTc14}dAL`zcx zT@y=FOI-_7vozgQQ**-mY7-j8t5jbnpo&2rWu);B$`+z8k?se8R1`)nVy-Kn1k#pkWnd_DON`2X=bLW z2Ijh{W(EejCaFnAx)$aZNxEsq$(G5c1{P+C7M5V6Qj)FQ@{4j4OKg=ga}(23^$YUS z!4jYVw{i^dv{f?FGeC$0f}}evwWv5VKM!Okc!va7J1APL{EISE^GXsy>C{%q5G-DiTVUl}l$uzQUlfv` zpJS^8auRrN1zg%UwInemu_VzYu_V=239;KE1h(5k8?^ZX;sB6wzWFJcX_bUj+krBN z4J67vGK)*{iz>lFkQ^19S_t7mxH*|1)d~s<;7nnam<;hkabj62B(mUA$r*`x>8UBU zO3>sA(~^lLDOe_(rkN)iCh1z5C!6Y;n3$&OCYl-~>YAG+rzTk>nOYiHnt?+BZhCQk zT1k0gQL1BlYF>%0l6z)u0XVD_G{6z1iK@ChBNY@221Z7@28OzZCLxCARz?<92A0qO z)2F=`%~H|~5>rzxbq!1m4RuY7k`i?-lG03dO^i$}O;Qt$EfbB*Q5{XD7fnE3G%yCI z2?Hxr3;KC6IW5i5!ooaF*UUUQQP(6nIZ@XlHN{xhFxkk!#KI&k*~G$>>RtqGGD7vD zjXtR4hoxH^eTNiT0F@UnIvAc_3d4&nk_|Jf(|bT-?V@B=G*5pma`@X>_5f% z%k5AJIPg#AtWp?6;lvO9W8#gA&u4eFZ6pCDQVv_iz&F2~Gf9s$9`BW`IJ$U2P z?)>(qlO_tMqwmaP$#}a%I&)pVY4_8|4&kRRW?J)=DckMgUg58jbidt6;Y|7Ahpv1X zJ?pcM8u3f`37y-&Y)-A;jvZV(q&>TW)(A&#Uecmb;xaLLpFm99N!`cuqn}S_T5Gy_ zr%I>nE8B&zRlt!tdelp>Z!{zel$&M&7AIqv^*s(%^h^y`}Y=N|v_ zIrzkL?vp8M5ox#ESZ@ik2(b@f}#+LN<& zkNh$|``h*7jS21Vdyh4(DthzfVZnX-w428yzxU7gd3buM3J+6{=gHzu%ZVN@S5FXl zHhXE1ef8J5D*8-r!TaCV|DE&UrT2m7+*`Y@=Q5Z5>We#mT=hVK&Q969d-tU+zLm>< zUi#qk^j^V27WLzOWv_PZ{Jc{^U!jZT?UkY(?|CEAnjS_JRX!~~R;zx8kM)?=w3#aU zDp9{TNx7SP-O7K){8z?dP4-D6{vFb;H9w_3zg|9JbMeuyZ?}D9cstF!uKxNa^9>nK zGq#HaX>H=Eiaq|)`tZBHhnL0Y-;iQn#Bonf%J2Two?~5`i;w2$Wi0KxTyAvO#S>2YS;j|V>rgbd?7 z7G2o1Kl-8{Z?}(OyhjgfvV8l6zXdyFz1)P4<_HFaW%YW;y<})KoU|xJXWFcrPDV5B z^8eH*-gx4M&aHL7`NN|>zuwBA62zwM@Z?&LE?4#&^STMe0c$OeUClkUetz_y>-Ne2 zKE6(V?B6Gw|BZLrXW0yPX>+(K-kDugz?E9{Ql7ycHNfwpSg6@3} zBPKp&JlGq3T3YVN#h$yF|Z-T}pprQdn|(TJzpnWv4fsQOT59u+`1;;lnQB4CgN?#}zD?tJc!JwAGT`U7uPooc_hyu0J2&!?B&b=Q8( z|2O6H<9613ez7f=CjC@eH1&%1Bi6u&yxaMD?s6EfFKZB)7kM<%ca}udN>v`2V;skV z8@G1tZ9Ep?I4fj{=T^Ik#s1a{HB8@5OSYI6-Lq~L>vm`U-OG&+UOiiOs5;}%$A?XI z=FXnpvD$|YD7EOfFYa7$x#?tx(d=rW@T*-0E8^qWq)&QsY(K;lci;r~#SEjvs+TFRc zRKEF~wQQU+K~1!|&N0&S)T#WhyS{0B`s8KP{qX(%dku58x3^t>JgMB>vN_IC=4ynt zhW1t?mY#_&3lsB~KYE*ZqCiKJ>%VokQ<9H^z>+POXN5&QbYXvZ?0#8;;f6EJ>)s2U zJEvS{8CxILOuBI?S9+K1$&z(1N-L*%+qlf! zyKeE+s>G!lqKh++C|%AD{b6_GBzJ3Rli%%2@2%8=PjLUQK5yq;b+^I%H>W$hq2C+j zJ8!J{HcWWRxY+Z+)2qpU?k?DW`gOyi9O2fo-XAs$f>Wj@Yz*;v-nB~T{HOM3ThmON zyy7_W-l<$`i@BSzNW;~Zap~SX#S=vb?|K-{?biLOsc&N~(`S0x=kbeXj{WjX$GA?N zdR^PUKOmte$!6-2iOwh0i#X;o#`|mb`f*!R=-P%Vp-q_!+sf)I(``e|gf9#7@+@j;6_x+oA1%gifx1GLao_B_R zC~v{v{(E;f&XEh>W2WS3+=dJCBJaa7XoVL6Zz3vF#Nu$d=#|>RIH;R3VnULE5`hSk%wUZmKiFzW=VbGUg^?9m?ru+6-!x!mG3R|zudpdP#nuX^M*($|So4Xbp8!y?{t+22?_oB3@ zW%tiIp(#R>c05TaKY4uegqJaa(;i0sk@5XgHe1(*q0`A(C|qRevUSeOJ~zC+J>j(W z*|Pz8g3|gccIbXxrm^7iCnxXFou(Z-Ww{o4T=HVRbj0|w$~wb+SOF zpmOcC8A}r<*#CDwTK{jylP4K&*1B?y3-UJ|3=1mSFuS-@yYw^!7N8@+Cj4_z~ z`^ck(nFmVb3Jd2JmCY+Cll$=U(02hdj!WP9q_}GAAG=TN|8644a?tJm?;=f(EiNks zG~e^P?hrNkw)R)5-puu7q0CFA*?vB}JIB#Jx={4(^A#szj9qZl3bt7TBvgU zR8ZW3r=^#r__t4)S7#m_zsBH0Me6eR9ZnWEHp{%b`sUq~lH00YW+&gXrks$_IMwje zD8-_0hcvs-b1uz2>EGG<9Pe+iU%{~@bsLAIuhY46led2Ky}!Zm-;=cu4}1Dro5tK_ zi@AHsRHrYj^Xm`ar$3$56}XtUOsmusABx2+K=tpxNq)B}Id8oWc zUaG$4Nkx6mkITQiE4jsIvqN&Fr*=9UWe^dme(xp z)sp8NmxpdPUorEX%HfUr`^%M&W(XNXx0FP&7OFUC6zDHFyftw3wi(wM_13FI{hn4X zU@_@L{>qCg4?bBvdGn|8as8iwPlq#)&EDIyYFf=+&Wo=KpJpyMW#28ix6i%Z$)q`? zf9`{r9s3Tg-Lh=eQ?B}oGlACyTDwmAY&>HUx^~`MftSl?E7fUFof_VhwtB|fEv@|z zmoCy^ojmi|pP=| zjlZw>t;jm)w|*v;}r_*~cL`|8rYoC7aYVk0}pF5_8h|F8tyIgwdc16SQ!uNuY zz5h1dWntn*o@En^}%ukL! z-u5%<{*k?LBDpSo?Xd|BCvz?f=e+ten>qgv|8l!$_hn6w{jQvQYlS$ksaN8}TbH~J zyzQv&ot3tt=y6L@YKcIH>BlTB@55Q|liS~09f+^3S6z}~+VCUdz@GE(%%tW$eUf|j zW#PGtb#D773%i>>*xm~(>R8IIfr{U&;9dXx%r{Aq}-5x8<#+I!5d1}~-Df}zdqU~o^gnMlX zpS=A!)8!>;%fpK{te)v3dU>kNd~yH(%N(rl>u~OswOhVpdV9lruAiR$b=NmuE^5skUAAMF@5(ICX}@#k9y2XW zS&?PG=AjHrqka5>yOWu^!sjfwy>W|>vyk)_qw`+6{*x9uNJn`dT@e52nL>h%=<6HR zFW#>D^tIe*a?M^o4K7ci=&m4xdA}5oTNKH>`Kfm~W6?F{%f9Ivr&;6kmE0ybJd7}& zr!}SI&ATf+zrJd{e{r>X(xykA3zu;oU+jGPqT|_n3zkfs^1bXJx3fdGx3;e3ozo|Z z-v6}V;%qwZ9Q3(W-5_;oSWV1DFWFGlA61VHYef!STp0IVT>WycnT3pZ-A~;Zd1EQ= zEp3;}yUc$}B`2DMotggcM%xdYkd@!q`pVtw9=v+&dG2AH+wRbH2_LkdF;Cf|5_ojM z^oMg4E|g8>R$6m6EOyq;eW}l^jjU}Q*T25Nl~%mbFKlsVQoe#=o9TwEzWw_|b&P$d zZFJ2nFIU;l_00Re{T!daQ|q&?ZMb~vL4UuxKeUrJ{=c?%*={4=< zw{7`$@~-!OOin)id%LK-zmZ?RI8W8htlzWm8>^q#wf&wr+s^R;eyvGQ;kmL!}t7-7Ec|(Z{EB>Bypxo@-UHo^t2dzwe4W{QKwf zN%QNY3aa)f@MV7rGMwA0V^qJq^SS11Y4t-FCLJ?<8|Jz^bkC_D;`a?MwlrUxX0hgF zX;IchcgEG6?wP{ZY40e}@l|wx z|JCc?xlKO^yNiUmB>HNvydl4YM_tiX(=%DWP~Z6d3BTRX3iO}9NO0UgS&;3k){;Me z4*tztucp7Yvb*4Q&DUGASH#s`kGO2MTYmwA|AI|t`#)~qB=PI+oIMw=Y<0=5|GMhb z;pF=N{;opd8apKmub*1*q&RHvy$9l!4_5A8{ZD_|V(v}-#Zrn{2OiCtuOxV8eooAv z)78!V?^plcAJe3HW95DAcQ0!{AODs7cjLdMuj?5Uoget0xU9Shw8X~K)z4*}Q$iB} DQfpe) literal 0 HcmV?d00001 diff --git a/src/editor/icons/action-move-towards.png b/src/editor/icons/action-move-towards.png new file mode 100644 index 0000000000000000000000000000000000000000..b70df8c563d46f609b2e299a2c2d002eb9c45ae4 GIT binary patch literal 11871 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 literal 0 HcmV?d00001 diff --git a/src/editor/icons/add (Kopie).png b/src/editor/icons/add (Kopie).png new file mode 100644 index 0000000000000000000000000000000000000000..5ff86296a591b72412f7aa831f43561ae6a12ddd GIT binary patch literal 4769 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 MPgg&ebxsLQ0Mq0!5&!@I literal 0 HcmV?d00001 diff --git a/src/editor/icons/blue-arrow-left.png b/src/editor/icons/blue-arrow-left.png new file mode 100644 index 0000000000000000000000000000000000000000..2385b653becf5293bcc3422ba88dcd12143ea640 GIT binary patch literal 7419 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEo+2FmN$2 zFtRW(g48fDFfbyqnHZTFm>C!t+87uZgczB@YC!6w7+JyW9tH*mX()RN0|SEwR1HXv zAtMt5F9QR^90mpkBSt0$5s>W+3=Em=5WDszNV42%qn3lJ^>ne{HA^&|rWV@sy9bAYF_vqC{p zep+TuDg#5soZ5-D9)|-&TKz9~DT%ULcUYvX@GA=pJRa4m6vDC9X*Hjk{@-RbUeB)X z#SfwiKBRAa_2AK()y=CFIQ}(QSX*fB^631o+A3xkSFxx6^E=Buy}+pVxT=!>Z3?u z$kmcl;+y1F&)IH~Jyk0E?&SRjbFPO^+v%6h;;ECwDdeKDVqp(g&XJ7ko*O4D``prB zf8(q7lb{o!Y|6)(R$WloUH8HMhi&v~1Ivf1t-=o1yC2u|Fx}nlu=$;>0WrfRwK%ybv!En1KTiQ< zW@1u)X^E|p5|@I40@Uz|+yY-;xbb<#&`?Ou&(*I;EYLU9Gtke?)koG*T;f_*f?r2* zNM%8)eo$(0erZv1s%u$lUWqcY5h=-V{RO2(IbiRkBKUR~3CeMB z9iSjc&&(|V>#E2tKv7wenT7}~6yJbkz}`W2NJVY|+*}mZFu#KpgTu(mB|o_o}Qevu^Zeo&wNwSfViG^X38In<+ zdBr7(dC93DqbhO>^fEJ3tjrCQ4O7jMjCGBT%uRJojFJp=EzB*9b(74KQj*P$lTyqr zOp%Q6FUm~M%uCEcb`{8|l*|+>OJifB6pNH(T@y1?V_g%&G*exR6yqe_v@}c8#6(NO z)D-hXuu&<=R&M!4xrrsVN}0Kd>8bh!dFfyYP=H%G26);k8R;1yL;`XWOVaX-a&47- zGV@9+5E3Doxv9Y=iJ;IlG&e9Yva~QTFgG0>P@GtnngVtwTq-#uF)uwe#a0QLTwz)=u_T4G#3UorR7(q8^TbpmT@!;O zbKS(GR7>5oq?8mR3IUQ7kEX8C;36pmNK!nSx~LXhT!`*eYF>)1 zQn`}79edXeTLuOOwj^(N7l!{JxM1({$qWn(oCO|{#S9Fdmq3_tg=^Oj1_lQ95>H=O z_7{xI0&My}cK7UKVBneI>EaktaqDeVcE0TO(%9c;?o@kriFi&F(F_twooXaM>Fb76 z&uMFKbc(L<)m2>gRwb9~p!}`6jE4(2=PJ2&@5<%c?fS4T$NmXBOKy`wZV;>PtwoI! zt=6SRPjj6)Wre!tq-Uz{e;a;3H)rqf#B+D7Yi22_t}>`-csQrHQZN15t?c!+=Xe@> zw_P;5<#szmI(M<{i?r{&lkS?Yxb}P3wg18O|u#D%OquK)SW?W3i;zcsVTzm)GW zIvvhXGrfc3fIYLvn(JS$GWXT&{q|(4$C0|trQVnImWsHvT>C6{g_-64u`~5y!NRp~ zpL8-u*MFVqo)F1(rs=#5W7+)&dTIY|xBc?HU-9pHpGnQ%GlDspYnWZG{g0Dl_`$s9 z>DO)3mIdqEmS3rQbn)(n9M;MJubB1RuI&4Kqh2qc`E>p6@*LY=x6j)*{+s6)BYk?o z)}3r$BGnWw{m*jA{+rscZ};}{>i0Lr=ebA(mB`8)Jt@`?*G`T{@twh?REKf z^_J7ug-(dZGT%P`@BAG08@0{1w?4DaU9sM}`dN4XwRv@A_LnThuOGXtG0o=w2j=VR zckN$eF8-~S>Hhhsf2&HpAJ1Gr&oZn2-;2XDI>ZaAwc0lw7x-wnxl!k8G0OqJTc3T~ zGyFQ^BHK77Zd$>Ua7nsu^PYDsSKj?r*4lkfc+Jz^w{zF3pW9b3hmY^gf!b?W&YmLs=Ogkm=;hKK?oSbzxwyx6@cq!kLc{YB#&evND_wv8B`F*I+B=25} zcet>}^V6XQQfxc;=k+QHWwPt`n!b2@^WEelX?%+pO)+THVY+tpex{ho71xIru7BRM zE1yUS-?wDTd&hnG*Jk}!km}{J`&toy`nsQd6+`FT}dZ72qO^t`Y=IX5L zP3QG!ycWZ_CQ|FO$#0ho-3yP-U*xHfd;IX7+MAsIb?Z5A)i%F9^XGW!)~)-CU(NhG z+t0q5Vdk9niytGWoPM)>^lnD|WL6yt`YjruBw)O|LuSyguohV{v0CZiUHo}HV- zTh3mV5AV71w=| zw`KVM(-^-G}1mHb1$<&RH1GtI$8f$RF)hL#0Q!6yX%7BbW+a;E7ta-C53 zsZkAC)e`diyD96NeFuGSJ-*-T^7g%q<&De#{;WLwA>!fPg_%#f*D=P&ZV+I#KXShP zLYKcosJy|0qYY0_MMXFs5M88@@{G-8L6B-w(8<*?F1NKA?rSMEZ{51_e*Lc-2c8A{ zzjs%9o%G|Ej!d|-pw@%Go4KyYM;!@rWxe{eekzBUL$>41OQXAyTfwk;SXm;Z2A{=9AL{~nCH=; zAlvcG#ntI_72AVdO?wtkJh$`2lNb>h{#52W@hYKn{U$beBxpMxQ97d3(!qOU+xiIy zV%~3MVrfto&=1#e7tUl~x~c8Cq0QM1Q@C7b@d!q^FfJ1^Shz;==OQ<)=ZbU7C+cTR zF%4hUcJqqFRE-};1*YE7=bSz3RDeoHgoDbefD)-y{2`f7{ijW@H9TaTpS}9+kLsw` zkA6Hk)0na>;`-gIY`3=+KK5g~SyP#3w|LfS9Twe&<&4XZcs#ZBIXA7~w=lb~v8u`@ zy*ZN{W`FWn;t-(Vx^KAzv+8EeRRYpoyxj*rOZc5UJngLE7SrPenLnn5>sZ-4KAPM8 z{Rs1(hvt_j?mM`@IJW%Lp`{nEe_~C){=Cn&>0kS{2W$D&46LR(`kryq5p&cLYD|q( zSgN3~L#n{`Kq2co_6#$xMy83g9`jG#JC|d@pBlBz?Fy-7Jt7^>0&k|ZvZ#pMie?Z9 zQ~Y~!m8d{iQrzr5TBi=#R+Svn@w)Z7EIKvI3Z&4 z$<^_qXvHjrB@SMVCzz)AH`p&@ZI>_Sa-G8y9`x6zX`g>sdbaGgt=AGVo-7O35j&^& z^PT&%jsItHDlklYvQFDGc84GDUh&I6KdtNZ7rHw)S~|1-y_rR-qtfGFYAZxMBHhk$ zdHw8C&}iT(2vQU}bYSX7p;^HW8Y13Y>$N=2*g0=l>vTYOeZ-0R&Y%9cYgfMCD8w{n zX1e1R-Ie@mp?AN1{y8a2cDB#E%sVmJvQjUYCOX-~wuu={40T|b$5WBoAl)R;V0K)F zmBrFN-B$G&|1&!;VF{+FBnhdVYrBu$u~a!9&n39wiPpg=&o5^M@2u3Fc{+2`>wCHj z?X2u(zS*uTTAOpfEN4}3qE%$u>x1koMI6Fh-!(Ed{NxGJWBX%*yt}`(>`^_5L|=uiyT5wGzwcy*LmpuU3$K>f?U3eRmR7_$L^89y&O$>P<%XFV%Bv z{;=dIz0t2~xhXMEvi;nlo@Z?wQ>HXaFHtSHbJfa0Y+}ET5&H$zhacttIptbUm6QI? zR{!h$(&hUK9u>ZR@;J7lTBCR3ZPpC|Czw|x^>}HPY`eB#ZD7IQYZf<(c^MT~E`IfG z*@fS=KcqPu73K@36thl=sV`RRejM?cdE(J0Aum5a+0VOj+L`&szcz-~eUpFs+)t+7 z2MOX)JW`smva**~v${=agoG>u`0T3NT`j20%X&tZW_&S(mK zKj#&{?B`*;Fgz8%M!Ns`yMOby4_?2 zbM4y#TSukGiRI}$yQUoba3Uj2-2SKGC-Y^~8J@0f==pg+@^@Z=B4S?9{$| zn&GPViCViKTkQpRb${A%rNU9K%Xn)0^g4g{Tj^@cCjBn@dFa{Oxw#%oizRj%&3YL0 zi+z&pJfr*9y&2+sIJNtJ?Nvxn4UF$$`2V?RQOl#b-7&jASJjwZwl|)gcUfn~j2Wjk z%>M5ld^}Z>^@GxZN>he+SM9ymi_{c6X3}4;YHZ@fTPv?-)Oz>w$D4U;_wwBMy>E%0 zj_ZM0%60oWBD#8>b|iG9dG4$4mg4^t)Sbn?qD|rc^CLfh7;!}yXWaSv|K6S5+fsgR zsosB+aZz5yx%PW6?pteDF4zh00OW4z-8Su8eNf91hlaD41wa!?p00i_>zopr0Ef-a A=l}o! literal 0 HcmV?d00001 diff --git a/src/editor/icons/blue-arrow-right.png b/src/editor/icons/blue-arrow-right.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee2b48597b9515904088b7eab849b9046a048b0 GIT binary patch literal 7442 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 U;?+Itqd@aZp00i_>zopr0Jd$r3IG5A literal 0 HcmV?d00001 diff --git a/src/editor/icons/blue-arrow-up.png b/src/editor/icons/blue-arrow-up.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc1fd085094d6039f4ea6545dd65e3f36ff9936 GIT binary patch literal 7234 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEo+2FmN$2 zFtRW(g48fDFfbyqnHZTFm>C!t+87uZgczB@YC!6w7+JyW9tH*mX()RN0|SEwR1HXv zAtMt5F9QR^90mpkBSt0$5s>W+3=Em=5WDs&_g42%qn3lJ^>ndR$QD$BsY*plh&9N_8ftWZ#t zpO%@E%D_-Dr*@*P$Ke2xR{zUgN}{aR9Tq7o{K^6Yk4LpCg>YC<*R!j8 z@q?&>59u3UJ$STcb@OTkj(-gn))tz(JUYLtwu%|XRqW~i{LXSuxx9jjmd|FVLWj$_ z#&dl-Zr)jS<8K#3lY|3@vC-xpOHZ$Z+xNX&Is28~vCV&e|65~cns2C}Aas0Y;;kdn zM=sCacCd23#UZavUNwF;d6!r_<#(>D_;YOMi%kcNmDAL0{bdxzx@Fgt7--Lw`Y2Ku za<$}?_$Im4bGBP#PnF8PJ9)psoa^D!cKT(rc^L!1AGLtFXiM?#DGfOm}xXY<_2P|9IbJ8^)&d z2d3Wp7A}3@jrz;4+r(^{er<2;e!Xqk8^-C@2QExjoV`h#HIuWI=|i2{{VB|B`HlBX z^Yhjg&#_~WoE7?t&BB7^Sl5)j?>@hqcW&q3+m~nE=TBNtv_QT83n&d%WQIhPMELqx zCFkerC8p#jrRr7W7Jwp*!N$I#ATc>RwL~E)H9a%WR_Xoj{Yna%DYi=CroINg16w1-Ypui3%0DIeEoa6}C!XbFK1^!3Zj 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 HDWM4f^`cn; literal 0 HcmV?d00001 diff --git a/src/editor/models/actionscontainermodel.cpp b/src/editor/models/actionscontainermodel.cpp index 82a1597..fd48f85 100644 --- a/src/editor/models/actionscontainermodel.cpp +++ b/src/editor/models/actionscontainermodel.cpp @@ -34,15 +34,39 @@ QVariant ActionsContainerModel::data(const QModelIndex &index, int role) const return {}; } - //const auto &action = m_actionsContainer->at(index.row()); + const auto &action = *std::next(m_actionsContainer->cbegin(), index.row()); switch (role) { case Qt::DisplayRole: case Qt::EditRole: - return tr("Execute a piece of code"); + if (std::holds_alternative(action)) + return tr("Start moving in a direction"); + else if (std::holds_alternative(action)) + return tr("Set direction and speed of motion"); + else if (std::holds_alternative(action)) + return tr("Move towards point (99, 99)"); + else if (std::holds_alternative(action)) + return tr("Execute a piece of code"); + else + { + qWarning() << "unknown action type"; + return tr("ERROR: Unknown action type"); + } case Qt::DecorationRole: - return QIcon{":/qtgameengine/icons/code-action.png"}; + if (std::holds_alternative(action)) + return QIcon{":/qtgameengine/icons/action-move-fixed.png"}; + else if (std::holds_alternative(action)) + return QIcon{":/qtgameengine/icons/action-move-free.png"}; + else if (std::holds_alternative(action)) + return QIcon{":/qtgameengine/icons/action-move-towards.png"}; + else if (std::holds_alternative(action)) + return QIcon{":/qtgameengine/icons/action-code.png"}; + else + { + qWarning() << "unknown action type"; + return QIcon{":/qtgameengine/icons/action.png"}; + } default: return {}; } @@ -50,6 +74,30 @@ QVariant ActionsContainerModel::data(const QModelIndex &index, int role) const return {}; } +Qt::ItemFlags ActionsContainerModel::flags(const QModelIndex &index) const +{ + auto flags = QAbstractListModel::flags(index); + flags |= Qt::ItemIsDragEnabled; + flags |= Qt::ItemIsDropEnabled; + return flags; +} + +Qt::DropActions ActionsContainerModel::supportedDropActions() const +{ + auto actions = QAbstractListModel::supportedDropActions(); + actions |= Qt::MoveAction; + actions |= Qt::TargetMoveAction; + return actions; +} + +Qt::DropActions ActionsContainerModel::supportedDragActions() const +{ + auto actions = QAbstractListModel::supportedDragActions(); + actions |= Qt::MoveAction; + actions |= Qt::TargetMoveAction; + return actions; +} + void ActionsContainerModel::setActionsContainer(ActionsContainer *actionsContainer) { beginResetModel(); diff --git a/src/editor/models/actionscontainermodel.h b/src/editor/models/actionscontainermodel.h index c3eba7b..878062c 100644 --- a/src/editor/models/actionscontainermodel.h +++ b/src/editor/models/actionscontainermodel.h @@ -15,6 +15,9 @@ public: int rowCount(const QModelIndex &parent) const override; QVariant data(const QModelIndex &index, int role) const override; + Qt::ItemFlags flags(const QModelIndex &index) const override; + Qt::DropActions supportedDropActions() const override; + Qt::DropActions supportedDragActions() const override; ActionsContainer *actionsContainer() const { return m_actionsContainer; } void setActionsContainer(ActionsContainer *actionsContainer); diff --git a/src/editor/resources_editor.qrc b/src/editor/resources_editor.qrc index e46a314..19f3e97 100644 --- a/src/editor/resources_editor.qrc +++ b/src/editor/resources_editor.qrc @@ -1,5 +1,11 @@ + icons/action.png + icons/action-code.png + icons/action-move-fixed.png + icons/action-move-free.png + icons/action-move-towards.png + icons/add.png icons/arrow-down.png icons/arrow-left.png icons/arrow-right.png @@ -7,7 +13,9 @@ icons/background-file.png icons/background.png icons/cascade.png + icons/center.png icons/check.png + icons/constants.png icons/copy.png icons/create-executable.png icons/create-group.png @@ -17,12 +25,20 @@ icons/delete.png icons/duplicate.png icons/edit.png + icons/event-alarm.png + icons/event-collision.png + icons/event-create.png + icons/event-destroy.png + icons/event-draw.png + icons/event-step.png icons/exit.png icons/export-resources.png icons/extension-packages-file.png icons/extension-packages.png icons/file.png icons/find.png + icons/flip-horizontal.png + icons/flip-vertical.png icons/folder.png icons/font-file.png icons/font.png @@ -30,11 +46,17 @@ icons/game-information.png icons/global-game-settings-file.png icons/global-game-settings.png + icons/grid.png icons/help.png icons/import-resources.png + icons/info.png + icons/isometric.png + icons/lock.png + icons/merge.png icons/move.png icons/music-file.png icons/new.png + icons/object-file.png icons/object.png icons/ok.png icons/open.png @@ -47,47 +69,32 @@ icons/publish-game.png icons/redo.png icons/rename.png + icons/replace.png + icons/room-file.png icons/room.png icons/rotate.png icons/run.png icons/save-as.png icons/save.png + icons/scale.png icons/script-file.png icons/script.png + icons/sort-x.png + icons/sort-y.png + icons/sort.png icons/sound-file.png icons/sound-file2.png icons/sound.png icons/sprite-file.png icons/sprite.png icons/tile.png + icons/timeline-file.png icons/timeline.png icons/undo.png - icons/object-file.png - icons/room-file.png - icons/timeline-file.png - icons/flip-horizontal.png - icons/flip-vertical.png - icons/scale.png - icons/center.png - icons/grid.png - icons/constants.png - icons/add.png - icons/replace.png - icons/info.png - icons/merge.png - icons/sort.png - icons/event-alarm.png - icons/event-collision.png - icons/event-create.png - icons/event-destroy.png - icons/event-step.png - icons/action.png - icons/code-action.png - icons/event-draw.png - icons/lock.png icons/unlock.png - icons/sort-x.png - icons/sort-y.png - icons/isometric.png + icons/blue-arrow-down.png + icons/blue-arrow-left.png + icons/blue-arrow-right.png + icons/blue-arrow-up.png diff --git a/src/editor/widgets/actiondragwidget.cpp b/src/editor/widgets/actiondragwidget.cpp new file mode 100644 index 0000000..26b0f2d --- /dev/null +++ b/src/editor/widgets/actiondragwidget.cpp @@ -0,0 +1,40 @@ +#include "actiondragwidget.h" + +#include +#include +#include +#include + +ActionDragWidget::ActionDragWidget(QWidget *parent) : + QToolButton{parent} +{ +} + +void ActionDragWidget::mousePressEvent(QMouseEvent *event) +{ + QToolButton::mousePressEvent(event); + + if (event->button() == Qt::LeftButton) + m_dragStartPosition = event->pos(); +} + +void ActionDragWidget::mouseMoveEvent(QMouseEvent *event) +{ + QToolButton::mouseMoveEvent(event); + + if (!(event->buttons() & Qt::LeftButton)) + return; + + if ((event->pos() - m_dragStartPosition).manhattanLength() + < QApplication::startDragDistance()) + return; + + QDrag *drag = new QDrag{this}; + drag->setPixmap(this->icon().pixmap(QSize{32, 32})); + + QMimeData *mimeData = new QMimeData; + mimeData->setData("custom", QByteArray{"aaaaaa"}); + drag->setMimeData(mimeData); + + Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction); +} diff --git a/src/editor/widgets/actiondragwidget.h b/src/editor/widgets/actiondragwidget.h new file mode 100644 index 0000000..aa1c66b --- /dev/null +++ b/src/editor/widgets/actiondragwidget.h @@ -0,0 +1,19 @@ +#pragma once + +#include +#include + +class ActionDragWidget : public QToolButton +{ + Q_OBJECT + +public: + explicit ActionDragWidget(QWidget *parent = nullptr); + +protected: + void mousePressEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + +private: + QPoint m_dragStartPosition; +}; diff --git a/src/editor/widgets/actionscontainerwidget.cpp b/src/editor/widgets/actionscontainerwidget.cpp index c253910..78286c1 100644 --- a/src/editor/widgets/actionscontainerwidget.cpp +++ b/src/editor/widgets/actionscontainerwidget.cpp @@ -7,6 +7,7 @@ #include "models/actionscontainermodel.h" #include "dialogs/codeactiondialog.h" +#include "dialogs/actions/movefixeddialog.h" ActionsContainerWidget::ActionsContainerWidget(QWidget *parent) : QWidget{parent}, @@ -27,6 +28,17 @@ ActionsContainerWidget::ActionsContainerWidget(QWidget *parent) : m_ui->listViewActions, [listView=m_ui->listViewActions](){ listView->setCurrentIndex(QModelIndex{}); }); + + connect(m_ui->toolButtonMoveFixed, &QAbstractButton::clicked, + this, [this](){ + MoveFixedAction action; + MoveFixedDialog dialog{action, this}; + if (dialog.exec() == QDialog::Accepted) + { + // TODO insert into model + emit changed(); + } + }); } ActionsContainerWidget::~ActionsContainerWidget() = default; @@ -50,9 +62,20 @@ void ActionsContainerWidget::actionDoubleClicked(const QModelIndex &index) if (!action) return; - CodeActionDialog dialog{*action, this}; - if (dialog.exec() == QDialog::Accepted) - emit changed(); + if (auto ptr = std::get_if(action)) + { + MoveFixedDialog dialog{*ptr, this}; + if (dialog.exec() == QDialog::Accepted) + emit changed(); + } + else if (auto ptr = std::get_if(action)) + { + CodeActionDialog dialog{*ptr, this}; + if (dialog.exec() == QDialog::Accepted) + emit changed(); + } + else + QMessageBox::information(this, tr("Not implemented!"), tr("Not implemented!")); } void ActionsContainerWidget::actionsContextMenuRequested(const QPoint &pos) diff --git a/src/editor/widgets/actionscontainerwidget.ui b/src/editor/widgets/actionscontainerwidget.ui index 9c3067e..9b5242c 100644 --- a/src/editor/widgets/actionscontainerwidget.ui +++ b/src/editor/widgets/actionscontainerwidget.ui @@ -6,14 +6,14 @@ 0 0 - 400 - 300 + 678 + 667 Form - + 0 @@ -49,6 +49,18 @@ Qt::CustomContextMenu + + true + + + true + + + QAbstractItemView::InternalMove + + + Qt::MoveAction + 32 @@ -64,100 +76,1477 @@ QTabWidget::East + + 0 + Move - - - - - ... + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + - - - - ... + + + + Reverse Vertical + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + - - - - ... + + + + Set Friction + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + - - - - ... + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + Jump To Start + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Move Towards + + + + :/qtgameengine/icons/action-move-towards.png:/qtgameengine/icons/action-move-towards.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Speed Vertical + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Set Gravity + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Move Free + + + + :/qtgameengine/icons/action-move-free.png:/qtgameengine/icons/action-move-free.png + + + + 32 + 32 + + + + + + + + Jump + + + + + + + Reverse Horizontal + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Move + + + + + + + Speed Horizontal + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + true + + + Move Fixed + + + + :/qtgameengine/icons/action-move-fixed.png:/qtgameengine/icons/action-move-fixed.png + + + + 32 + 32 + + + + + + + + Jump To Position + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Paths + + + + + + + Steps + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + Main1 + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Rooms + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Objects + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Sounds + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Sprite + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + Main2 + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Info + + + + + + + Resources + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Timing + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Game + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + Control + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Variables + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Questions + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Other + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Code + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Execute Code + + + + :/qtgameengine/icons/action-code.png:/qtgameengine/icons/action-code.png + + + + 32 + 32 + + + + + + + + + :/qtgameengine/icons/action.png:/qtgameengine/icons/action.png + + + + 32 + 32 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + Score + Extra + Draw + Move and Room + Save, Load, and Mouse + Draw+Sprite+Background + Date + Breakout + - + + + ActionDragWidget + QToolButton +
widgets/actiondragwidget.h
+
+
+ + + diff --git a/src/projectcontainer.cpp b/src/projectcontainer.cpp index 4fcff5a..d1fe88e 100644 --- a/src/projectcontainer.cpp +++ b/src/projectcontainer.cpp @@ -313,14 +313,56 @@ QDataStream &operator>>(QDataStream &ds, Font &font) return ds; } -QDataStream &operator<<(QDataStream &ds, const Action &action) +QDataStream &operator<<(QDataStream &ds, const MoveFixedAction &action) +{ + Q_UNUSED(action); +// ds << action.; + return ds; +} + +QDataStream &operator>>(QDataStream &ds, MoveFixedAction &action) +{ + Q_UNUSED(action); +// ds >> action.; + return ds; +} + +QDataStream &operator<<(QDataStream &ds, const MoveFreeAction &action) +{ + Q_UNUSED(action); +// ds << action.; + return ds; +} + +QDataStream &operator>>(QDataStream &ds, MoveFreeAction &action) +{ + Q_UNUSED(action); +// ds >> action.; + return ds; +} + +QDataStream &operator<<(QDataStream &ds, const MoveTowardsAction &action) +{ + Q_UNUSED(action); +// ds << action.; + return ds; +} + +QDataStream &operator>>(QDataStream &ds, MoveTowardsAction &action) +{ + Q_UNUSED(action); +// ds >> action.; + return ds; +} + +QDataStream &operator<<(QDataStream &ds, const ExecuteCodeAction &action) { ds << action.script; ds << action.appliesTo; return ds; } -QDataStream &operator>>(QDataStream &ds, Action &action) +QDataStream &operator>>(QDataStream &ds, ExecuteCodeAction &action) { ds >> action.script; ds >> action.appliesTo; diff --git a/src/projectcontainer.h b/src/projectcontainer.h index b42437a..ae50290 100644 --- a/src/projectcontainer.h +++ b/src/projectcontainer.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -85,7 +86,19 @@ struct Font } range; }; -struct Action { +struct MoveFixedAction { + +}; + +struct MoveFreeAction { + +}; + +struct MoveTowardsAction { + +}; + +struct ExecuteCodeAction { enum class AppliesTo { Self, Other, @@ -96,7 +109,14 @@ struct Action { AppliesTo appliesTo{AppliesTo::Self}; }; -using ActionsContainer = std::array; +using Action = std::variant< + MoveFixedAction, + MoveFreeAction, + MoveTowardsAction, + ExecuteCodeAction +>; + +using ActionsContainer = std::list; struct TimeLine { @@ -141,7 +161,26 @@ struct Object int depth{}; bool persistent{}; QString parentName; - events_container_t events; + events_container_t events { + { + EventType::Create, + ActionsContainer { + Action { MoveFixedAction{} }, + Action { MoveFreeAction{} }, + Action { MoveTowardsAction{} }, + Action { ExecuteCodeAction{} } + } + }, + { + EventType::Destroy, + ActionsContainer { + Action { ExecuteCodeAction{} }, + Action { MoveTowardsAction{} }, + Action { MoveFreeAction{} }, + Action { MoveFixedAction{} } + } + } + }; collision_events_container_t collisionEvents; };