From 319d0e232e515cc7b31a7030e6f0e68b7a5f0192 Mon Sep 17 00:00:00 2001 From: Luca D'Amico Date: Wed, 7 Apr 2021 22:44:07 +0200 Subject: [PATCH] UI redesign: now use QTableView (#12) * Switched to QTableView in Unpacker Tab * Switched to QTableView in Packer Tab --- CMakeLists.txt | 12 +- ndsfactory/ndsheader.h | 1 - sanitizers.cmake | 55 + screenshot.png | Bin 89263 -> 63386 bytes ui/dialogs/about/revision.h | 2 +- ui/mainwindow.h | 6 + ui/mainwindow.ui | 1343 +-------------------- ui/models/ndsheadermodel.cpp | 190 +++ ui/models/ndsheadermodel.h | 25 + ui/tabs/commons/headernames.cpp | 45 + ui/tabs/commons/headernames.h | 56 + ui/tabs/packer/packertabfunctions.cpp | 216 ++-- ui/tabs/packer/packertabsignals.cpp | 6 +- ui/tabs/unpacker/unpackertabfunctions.cpp | 104 +- ui/tabs/unpacker/unpackertabsignals.cpp | 1 - 15 files changed, 548 insertions(+), 1514 deletions(-) create mode 100644 sanitizers.cmake create mode 100644 ui/models/ndsheadermodel.cpp create mode 100644 ui/models/ndsheadermodel.h create mode 100644 ui/tabs/commons/headernames.cpp create mode 100644 ui/tabs/commons/headernames.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 8213eec..f96faf6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,10 +6,12 @@ find_package(Qt5Core REQUIRED) find_package(Qt5Gui REQUIRED) find_package(Qt5Widgets REQUIRED) -set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD 14) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) +include(${CMAKE_SOURCE_DIR}/sanitizers.cmake) + if(EXISTS "${CMAKE_SOURCE_DIR}/.git") execute_process( COMMAND git log -1 --format=%h @@ -32,8 +34,13 @@ file(GLOB_RECURSE DIALOGS_SOURCES ui/dialogs/*.cpp) file(GLOB_RECURSE DIALOGS_UIS ui/dialogs/*.ui) # Tabs +file(GLOB_RECURSE TABS_HEADERS ui/tabs/*.h) file(GLOB_RECURSE TABS_SOURCES ui/tabs/*.cpp) +# Models +file(GLOB_RECURSE MODELS_HEADERS ui/models/*.h) +file(GLOB_RECURSE MODELS_SOURCES ui/models/*.cpp) + # NDSFactory file(GLOB_RECURSE NDSFACTORY_SOURCES ndsfactory/*.cpp) file(GLOB_RECURSE NDSFACTORY_HEADERS ndsfactory/*.h) @@ -43,12 +50,15 @@ set(SOURCES ui/mainwindow.cpp ${NDSFACTORY_SOURCES} ${DIALOGS_SOURCES} + ${MODELS_SOURCES} ${TABS_SOURCES} ) SET(HEADERS ui/mainwindow.h ${NDSFACTORY_HEADERS} + ${TABS_HEADERS} + ${MODELS_HEADERS} ${DIALOGS_HEADERS} ) diff --git a/ndsfactory/ndsheader.h b/ndsfactory/ndsheader.h index 1b6664e..afda3db 100644 --- a/ndsfactory/ndsheader.h +++ b/ndsfactory/ndsheader.h @@ -70,5 +70,4 @@ struct NDSHeader }; #pragma pack(pop) - #endif // NDSHEADER_H diff --git a/sanitizers.cmake b/sanitizers.cmake new file mode 100644 index 0000000..c64489f --- /dev/null +++ b/sanitizers.cmake @@ -0,0 +1,55 @@ +# Build Types +set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} + CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel tsan asan lsan msan ubsan" + FORCE) + +# ThreadSanitizer +set(CMAKE_C_FLAGS_TSAN + "-fsanitize=thread -g -O1" + CACHE STRING "Flags used by the C compiler during ThreadSanitizer builds." + FORCE) +set(CMAKE_CXX_FLAGS_TSAN + "-fsanitize=thread -g -O1" + CACHE STRING "Flags used by the C++ compiler during ThreadSanitizer builds." + FORCE) + +# AddressSanitize +set(CMAKE_C_FLAGS_ASAN + "-fsanitize=address -fno-optimize-sibling-calls -fsanitize-address-use-after-scope -fno-omit-frame-pointer -g -O1" + CACHE STRING "Flags used by the C compiler during AddressSanitizer builds." + FORCE) +set(CMAKE_CXX_FLAGS_ASAN + "-fsanitize=address -fno-optimize-sibling-calls -fsanitize-address-use-after-scope -fno-omit-frame-pointer -g -O1" + CACHE STRING "Flags used by the C++ compiler during AddressSanitizer builds." + FORCE) + +# LeakSanitizer +set(CMAKE_C_FLAGS_LSAN + "-fsanitize=leak -fno-omit-frame-pointer -g -O1" + CACHE STRING "Flags used by the C compiler during LeakSanitizer builds." + FORCE) +set(CMAKE_CXX_FLAGS_LSAN + "-fsanitize=leak -fno-omit-frame-pointer -g -O1" + CACHE STRING "Flags used by the C++ compiler during LeakSanitizer builds." + FORCE) + +# MemorySanitizer +set(CMAKE_C_FLAGS_MSAN + "-fsanitize=memory -fno-optimize-sibling-calls -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer -g -O2" + CACHE STRING "Flags used by the C compiler during MemorySanitizer builds." + FORCE) +set(CMAKE_CXX_FLAGS_MSAN + "-fsanitize=memory -fno-optimize-sibling-calls -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer -g -O2" + CACHE STRING "Flags used by the C++ compiler during MemorySanitizer builds." + FORCE) + +# UndefinedBehaviour +set(CMAKE_C_FLAGS_UBSAN + "-fsanitize=undefined" + CACHE STRING "Flags used by the C compiler during UndefinedBehaviourSanitizer builds." + FORCE) +set(CMAKE_CXX_FLAGS_UBSAN + "-fsanitize=undefined" + CACHE STRING "Flags used by the C++ compiler during UndefinedBehaviourSanitizer builds." + FORCE) + diff --git a/screenshot.png b/screenshot.png index 40e72755b15ed31857572a2eccfc86d23811a293..cb0e61eb25c4441fdeae880f672f05ec339b3f11 100644 GIT binary patch literal 63386 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 z zgPxHp8hYId&dgkYLpz774eD$%;AfZG9PT)pTU_I{`Zm_=SU-1hB>#%Aqt@oR<@qCs zjgX~DNVb3QPua)6e6a<}@1Ah9%eO4PJQF-h?jw>zdT;z{S&V;2LNq=xF*R-=Y+BbK zJ5oBlqrOd>W<{K@Ii+nlVQ7DOEC%{&C9o6|qVtxzba$Oyj(s#A8CX>~I9+v3jO}A+FHMy9R>|h?8KVk`1=3XCb<_+GK zYfWCzbJ_Y4{^6hbZsgIbF$R3%Jn%jLU>_@US*96;w6=(17CJBclQfn0X6E``T>BPA zKghj+r;m-}BksfZq>`HGYWQ?*P#y^_ruhlqufTq}L#~8>=FSS`iz+jSGWVJ-m$mCJ zEGRhMn1_4rhII+X{q^5#J;yczndePsLGzjoWV_;e6MxUXt)&f9{xrRt^q-4L4Ls&{ z-$$$bu>CgzaQf88LG#{`|Bimnc%Y@aEg=6i*5pb72GOkHP&fa{@*<1^K^njRb??T1 z`mCmSiD}ydLgn8%s;})w{O<|Y*38O$v=aXv{df=m-^08i$oOynR>>3kyZvbS(|-yw zXMjCxgZ($b*6M8KKfQ}Ic@O+=vpK8%?^{o>x&g<5BlK1RUE)XCbLZD_SKV_rOEv$^ zb4&_r@DS3~i@G{;xYcH4ByszR-zHO>qEW4-j2n6YdgoL7f6JJR$awJM7Cq%`GtP_; zM#U6p!Eq%1PIcc7I3b3ZdA0}Yqod)zqjNCvCjh$i?Rv1FZpYvk|Hi-Kysf3d{(9H~ z^perOm|Ln&2A}`zvUo_hc2#84f1S z|19b>ee9O~{lNmKvU)`Yf0_W?(z2^I`Icsyv7upj{ELirm)m=0X=?wXR2mSB?1X49 zOX{C*`z)Ke{Jq#z@#F7SHorgeu(Mlw&h|ul-)n0ApV0V#>gFwVIX>Jx25x$*`2hv;#RDncZ{uQ*QE~pV zqc1LJSmaq6+-HW6A23;EN%DCqQa|_AW(J+aZ}JC@qrPntvxDgp^|HjP6K#FJ-;of! z`gX!Y&N$vr)fM+E_y!sD{PVx#O!~F+*6(+iq7`KKlO6T#JvYZYbqk|PbA7G%ipsy* z?7pqn&XEtW!=l-V{5BKp?S?WnVSRaGRTZsu1tx5}nAK*?E81@Pvn{EoPpv}Q3FtDP z`4h$GMpFhkdz^i8=f9KoSAK!rGxf=aK`fucKFPixwdTIy?bdF+fjpKvUz#VHLccz>*CArZVqO-?N`Hn_z{ty zx2I1BY-trt`53jO@gLcJIQ9;+a4COD2)A0h!A#fTTQgj49hcgPq5s+8m<0j>kF1=I z4tZCb%N-49>L{EjpV7>61}=R{;?*L1zvV5M=ewD~%ZaS9E%lz4JKQ03EZ`t}-8*WU z#UG#Wou3zQc3n)Kb(|fn&UB248(;9m+TuEnI24m^$LO45?&-*1p0~G9RaD$P!uTAq z*0xm}MA6DV%Y*yO?=CaXgGAh)5}a$=9g_ye#!4OwGg8H{Jg6}@_gT2pXJl-AJ^Jg> z{KfCVsd=LJ^F&D68^1VT`^*O_%vY3`m&@bHdF4C_g$V2bZmMf27m2$vy!X5x*LCzq zuiW#n#lHRE^W6wG@89Voi@C_tulTEH?R2^-bC`g$i^9&c9EsUxsfz)EFSh!qHFar^agHy63Zq^gUp$>9k6{lW0AF}vS^&rIVy zM>mj$Nb^l}W&a@i#N03zp}3Zf%VN#c0A!wAsv!IlP=9W~HmzC=+iXyTJdj~H+ZEP} zu~uXv?mINdt$H;$eD3%I!xieAJI#a^*8uq65M)dB8dV^CDKJu+0R6tCF$NN_cwg4q z`iNvvGWTA9M6jtSmR{G(%PSzju{OYaw!}}A#)6OWYM3%sh`lfNQY6+E#7&BmBkjxc zJoq`niB6ZNQjCb*;=g-WM;>ni3bV0BSNZXu=QOLmpbtW!fXUy#nvQC8o+SQ=+a{l| zJzK6t2W`aooE>aURI8zOJ<>kuQ2YPu;$e#tBojPCY@_!}g^zL>= zZWma7&i_PGbGp%(1yfOl{qRH{t}z3a?h3L9a`w{$DSBxccCnv!Uan_>O0;t19T%Q~ zH`@r7Zz8U}S}vaYy8#(hg=LTK2lvEE`Y!)4G`0u?3bc1>L)%+24Q+c-&PJ0pr-zs} zTo5Vi%`o$jR)K#!8TY$@}*%Z4w*2ea9a- ziOXt*1>vngu&Pk)U#Yh*S?i0vsQ@_R^R>U}(pJ-U5niD4d_8%sZM$=gXT-TXW zB2Zy~s^D#h6KV6L?o01ga3@o5>g@;RY<|9*ZNzwwe2#1PxgNuEk=5rce|O4ie<*yE zM$#cq@6P4aRu9qnlv^O>?<5@ai_xO*=1G`o$Fz5U9}B2IWMvTUK0D}>a?8BqPV$Rm zff1ir*<*%Qmvmj8KKa9)q?5k&%nBSw(0HTq+>QUlu-Z=e5y==?x zR|4mXlfOm+ z{X8*O*=w)u*fUZsjLPW}_XNC~7IUu8aOU#re=kw%hu<8RE z5#{XucyDpmb$+Ei??N(E1d!)saiX^Kyw|Zbuf4xUrsHCz?Pz{~c$YUI4V8ZKH{3{g z_4+G60OyTw6{>OuobN8|2YH|?g}d$ngO_jKmp3~Y$(GvhB=q1?7JM(;$-dfvyCZCQ zv(GvE@(`C9w7<@F>UFv#H`^kt-2dpLpZp=`6docFbOEnG=ybXFnwA1k$p3J&WqIUp z<@jM)2{Kx>_e)+N*~^5kkg%Dd`i}`D~_X+IxVU=i6Clz}evJ zUZ8#8nZ#@irvgoPYB>g5^1PC%FYjOu$ZGFoi4~2Ut*Qk6mDF#A6P}Bzy&BOM?fJpJyF_>^|F?dj!bJkP(a7j4VHmhB=-tuyx4O@f@gjvz6ZbxXsf!ym75BxlCq^0zEA zr-vOBx5CV?<((>r)Fyigv;TxloW1xJsCmM?Egx1JpaneYts4kZchhR(<5$Q@zjqV# zWlGayyaa=}&cBO-Hz6}+c>&dYOrN@^{0{kr|HSN!zg>%DsM_H6SRsIbVYHU60lP9D0fVyL=6V zlGyq*t(s=>#L7xo0FTEH$)0>Za1`y=|8I>i{9sw%Mhf zUX$WnI~gmF$yOblko z(RQmvGc~)8`OBI9v)B!*t67*^ttTZi+%H#j0)Kaq{O)kO!KyqQt#@aV3ZI&+bz$)z zdhC7p!Bl&2vdZ*qkE#|ZIJrS3+PN6F2>JCJ)NJiN4dtRg^jZHs^VI|(XQf)~4RPPq zV4^ptaU4=jURf?f@<#_y4Itj`^j5m1@rwU*v*Sl#Fnxj@J9%1Pl}=rgcZ8D4im-_R z$3JKi{()=^a5meAu_%_QWVNcHJyXsXsc-(X@7r21#OD934tw^$ue~cLy&3;T_fAnE z{)4t6{|`t0yyjM$x_c5Tfn1V%|-^f_Ptfj<&1K;9~cCi82r1f>1x_SP8u5G)oR91Oc+||sK2VKRWY;dVR2Q%;y+1yv7gn#l;0IplsNi@ z?tTU45K40}+}b;p^zK{@_#lh^x7Z=g0E@VpWkc~nmMb-uhFMS#3#%!S9oC2M3UuE+ zd7)D!$N=dLuKcwMI7Y?-2!`JyBzww4WS z+F>`CZ8~OLYi4TNXxd(Y%INQrAmfhY`A>DWqE8N=JWBkM(~9SZjl5Rn6u(9YAF;`@ z+mi9lkn*ze`%)5&l9>9Ra8@)P0r2OG52=^}EI4)tZN85_cWH8N%%CC9n3ih3)75SF zPbFzX5Af|(ZwHMBwFngt|83UJSFmT!zLjXZ>cWQQ2ov_(U7DQ@b6o>~_+Kk@ zVd}SP{|9(U*`d*;e{c92r1jtdv-jG}norQV&c#umf|dWWcv?X0*pP&axz(%hWd3tC z0kc-{(|wmFQ`}j$6(w)p%S`}${`gBKzSZgrV!Pn<9}CckXDo9eK|SYWfACAZs0Ui zwN_zR`D3hFr`(`*dnT)2MS;p^?%u1Dy6XT=oNM(l{kT)OHfCqJmlrf1ZyTrJ1hCD* zdySt~1e>Jr4GeCVeL4N9g2His-LUiatCBbML&?Ybd};2BUd`2}^-U^$-n`jjn?q?A zThUPj#?JRMgjnIV-!HxmhZtYr@F2;ZgdUo$nQFvhZw!b3@7>+S+r&Q!-5n8|lEX3z zwx_&nTDhHL0IU(Qo#v379&9YALDnn(;LIe?z8YdHfM(9<9^d0prAhgbaTG4 zyu7B2uM^*k6z)3kSJ4$TZ=x9BCI#J1EzSMWt#m;v^&*HwLW{=yJa6)Rv7GBy=$t_5dDa9-TT!E9+~esQf#N;9o{bPr@7e+C#Ese7w4=a3uT_11dDqgs z25|W~MuxMD1=I?#k{xPO3Rd2?f}8lA$EI z|MaEx$|@qe<&{yZ=T?L7?kK>1-sO*)5I0QX)j=MA;+6JU^Zgas(;Judv)QV)^THqQ zaWbKi$QCp@a>n_wxm7Yp+UMh;+XGeIgTLhZ!hWsg$<&6l_qzKzFzPKwS5I)Kpn2oR zg}uti)$_bOamR(fWRRFZvBjG!fBn0j43si7CLLWXU?t+$qi3Sz;IpkaV@FG!hIv-LL<<4*(3e-4?CO zc(F5}&#Rp-`+U!nT53t=Oea?iA2Wq1uc&B0PNb4&Qz-Yz<9Mzm=YwvSaA|5IU?Omw zmkvOP(msh>3_`5so#KYEN#C2?rtA*NKBQf)*M(~b0Ms4fc($v?M7NC)g2Xi*xgOC5 z9mMz0q(5-`gAeK|27D*T^0eLu!!gp}sFl|#7evUq3j*j4*;*hO?UtjSF8VxSfo_k~ zJI8Ur-OkUdHRx#+_VVQpfBjWS);*UMpdq39{;0E!mTer@XpEUb=FKq+9Uq^}Zaa?_ z?Mf+J{3)aDO=adKPOuE{7l79_xVpd%4VV9@arlmTHBU{}{IXWe1APBrC2N~_xCWjz z>)I(3RRAE7!>rn_vmsX8i>b~npIAwUg^1*cPvGH=o zW>Gxd&OXs{t{^&Cop4zqw@ri+?QGBT#IkvpwZa$_vIho=^&Hm{pL53MQ9S+gIt=h; zkpIEvWT#47-ub~bpfT|Q0I|=D&skfKR{duMkGN(fUW}KGC`D|}7ChglQ+@~hlPDD) zUmRYr-Fne^$lf&XoF{jv@U#{n3(Garw8u)(CauqI2FH_X?E?lh%|V_;p(&?^qp$- zN=k|rXj3E~7fQ=pNkaPjx5^RF*s0ha2Ca_N&*n7Kl0V^3c^D|tWM9isZ#U>NT@luF z*atLX72K3c(d@UyZXkdbe89y-^Wkhz?UZGJrt^5ceKR^ohUTU;ogy3_prwW9&GO&Q z_AAz_vK$AB?Z~nc$H6N}N;{)ewQ1DvGeqsGO?0WAVt$=$$!t>O1HlQ1vBJR5t#J-O!Ehe*&ED_87rr0_mx<++QL_I7NYCNBBQGpZaO%_E zinzwk)eUr?bEIq~xVB_o5Po085!C_o>CG|w=gN~FGi$s?1_pnL4Isjk)CHUYM7vN~ zbv2oY_rNhvI6I3fM?4TJR+l;fR_#twDe>M&L0n}8{{yp=n8$~HKP|dEQW;craq@DU z?Sy+5Cj2RNH;BL>+-L`rDw0g`j^&XPS~gx0gj(HtfC;#4G2SD6Ud%_GRc$iR6gydq zvyR{d#$5U>vV(-W7N&m2mr2!Q=R7v#`f^16W@6S?zwIU}CZ2OI_Gz7Od#D*0NvtX4 z4Gt)bdEp4B;rQ2XA|ld#~!;2w}d-(%-H%$bG<(s5)g8t zZ~oT|=JvtnLVTs#igNaXgDFvQcU&#-UZN|m)ksbb}g@lxAfPj zWJy$li4t6Ifk2`Ue%d{1IpOqCa$k`umBOn2&Q^IN1{oM2PJZOUaifnrMP+$ZJ|;#J zFXdsi^!-=NJD`IKWDLQSNhID^9?-) zWURp-2>u?~Vou{_`q)@dg>!{jlT$fT8QsF5BX0*Jf9y6{FeRrp#-mgT1SFsQPZzv8 znXUf#OaLPuu1!%X_5<(QHDkPisN;8;cB<^r`Ecf~mFlmw3XNTRm46 z&fW^){mXCX?zCt>>$6`!DP5Y~_WPrUG!sPt!jn1As(Eb3@$F6V8kgCvzb$YNHlUG9 z9n|&wO)&snU8d%|rLpaz0Pd`RbrN+uhLyzke8gT`c5PKN@Pf*&1#3kM^bMTVI1$G{ zw>VYM{2p@BqN;Z1aBG$Wu?dDTD<E`gMkjWlSIsSMW!-D3Ct8JP&I=U#tngC9wpM z>K4AcEv-Et+&>j$h+@x=e~oDt`vMVcqp3GmPo=+FzI7EZq zwF{34r==HPvhtC0|D%f4&XioF(}s-i5#We$IK~9cPU5&l!U;*lc!O*S^-8 zYtGO2JJ(LTqLBO5P0C1#-l+i))+(el2#px9OVxbFHiTA{X(y$u51T8ikqy zMib0)IISoY1m`zvAo)Zk7_&R-a0nMYTI$RtqoXQNhxwk}(DBXb1^dVY8^BWb9-*jU+IgaZgF^Jj?=K6Oe>f&~+e)o)iYPH@Fd*>*Uuc*?RAUV42YcWd)wmoyZwKa2q4_ znL|B(=1%jNGO#W=m++7n0=S8e16pA52Sr$ksckd8bN1B+^nR;PFfA>U*?I5!&3h=vQ z5DW1gQs3W4?CDbdJyJ+G?(bueW&Szbee=Ypie3fMcmGV^`PaRH|9Z5R@UNw2$*PrG zQA}-=V`Z_6OE0R@j&Dtkru`{cxC?f7ml#}44%v{5&)t9Dh8aZ>zSSqtC`j?g?ktZI z5uvQ^;{D~9@57d}H=>zs=t$ofLT-#k-+g@eAtr|1atF0klO~RDEv{=O{q#sHT7aZV zNrqI^z2SSAXRA=CQNKZgu#306>clv_H2jMA??L9uz_}-DwrXLzm6Cp4RWUJ`kfh;2 z{601BZG|Fi66IsGMEwN=ZmXTeZpPQr{<7lQ~hu zZKZ$HH>R8TAx79&Z3ToMdlS`{X8c%zN-{Q+Wi4yc2w@m?x_>Wbe|Sb-AAe+C$+wQ) zmf@cRWRNDasyQt#@&m?fc~(0LR@w~zU*kf|cwigt> zIiaI}uinInT&5%%TFCnWnU$uidvZ~@QYrkNf^2-vHF-;ww1+%Iidu34LER7h56##b z`Q28!UMp;DE_(=^_gLMI`Ph$aS+vNY=g>1!itcx16MuA)zB@cllz* z{~TJq+U7A1fyui$7nrGAJx9d zRN1T`T6}awkC)UkzbA>E?;xcdm~T!OD*u73Ei=VaU$|s_va>`3U!W-KSBS#2QD;@gcc}l=**J+=XLOaWSkfat+&Z+F1v<2F-_|Rx(~56%N;ge}y!uf2-0%}~n7WvZ&`H>sSp4{f{Mnk%w`Omzs#FH(F_G1qo3HG9 zIxjrWWzq_ZisQI&uFBR=7cvIHqh7$&;oNADnR2^+t@C2Hov4+iWd?(GzFI2@e{6Kh z>e80^kwnUu3-jKMIzd8l%$S&AzbyexomaWHqoxA`a&Pzrgp}erM}DUBL2ByiyJK~^ z+ej_qIyy=HH?!@x=YCd9T?KO-Dq0QJKT{@y-Eg8%0yNJi8a6f( zaoYPTtaV$)wF7u=PsOz?&h46aM&g*YuR_WT4mEDIt=NZsbXiXUp}W~_zBSVw5KT!7 z<5-mbOv)GF(X(RTCEx9LHJdZM+w5_0mf)pT`{I1TM8O}|LyLEf=J=@@R z^%AT*1J>i#Cxd+Wdi-v*)FR!T#x49Yd0Q#h$-=##4lkZg#o_4eCp+V|PA# zmS0(+uik9dE(%jO+x_Ep@%R-#SgUh|yyx6sn^ew=adH~=uxsi0WM&ME7N=!KKY#w- zuzf`2V#1%Ic|P+aHe$!d28J}bO2IIb23w>3iK?`A>`!4bt6y0hw5=xV7Fw!S7Jg!B zx0g$g!=&#+PnKio!qZ5(Y$Z+G8s{)?6F2IZ;&ykB=;*Q^1U*D0B5^qBk!sPxf*#{F zevM2ebmN*SX-J80ihFhzIQb?k*YxAZ2ZV91MSXI=BIfVoEZ`)tazaCDqxbyv*d_^8 zUcm|jxuw!XJyfhJWTh%~tRF7_Aq`VBA`qNfm^LG#Q_D{8Z}uqT_p`Xka+cPvUw73ydiF z(Oo(UQE&^>^Dy|Ft))ZHFn@PHUitK!iY%O%JkI{wGWq7UVX*rEaWRRYePLG3P~LEj z?hbJ`K9~<^WW0OkJ;6OkUOfuhy${3NQ+Tb)qNAxpdqct%YCO*$#&Z*U3X8HaQ=N&i zoVfnsnscnZyKJlasX@8KY5igzTh8jzRc>O%C7&V=%~-z>h_a)h|N%X*UQTI|osb|yL@16Di8zlM09GX32c?S`OvB5yx^B)Fi8E-Z&E z=1UXH#HFjO_kS!bKh~SpW$a=iCD{%q7jQXPTgS=_YC0S2ahbg?ROMmOy$T60cJs7c z2|YC3p7qN6UN$k>Z#GfbIa$5Mooe)$LC#|Sz65K#KG&2HX0Q~<&88aO7HGo~xNWZf zV7)i&*J~p2>fO8l=OI%2%=3>@H>cg?2tPVIo60ikYPDd+ER6K298TB}zn}m}zBaoN zzLk6%gTq@&5Fyhh_G}Hi`fVL@GM>uGkKa`v9tU+v)G^ zG_ynrAmFFZsH##L&-*G*E6rw1#vYAEK;X*8Bx7KRmlBOgXV%VyUo4W$13^6=0vo>) zLbVdct6ZzP)tgRQs>K{U8suKJap+VGV0^JUdvG=}F@Du>gC9TZ&_y zOA)bAO()&ts7OiLy=`j_)WlD^z}Q`J6j0D;&{x;i*VD85Wxa+*EV^bZ;pp_L+~I-e zQxM9{lu~aG&j|V4Mia_&O-+osmSdj0cC(!|DIdr0(;rmsF^oJxKY4Ke;R0Ja$d)i` zL^WaS=Gz;+l%9z;VKJR|+ESQ-9(9t4;^sW3cE7oe&wfz0Jaq7w+HT%rW`iLUV{Qyr zhb!flmsa9wqd?Cx2Ub?`pl2phuT|a#%Mbq+#tSYClz7+pe3y{z1p*X6qs2VZa=ZU^ zN<M?i$18xv}{IB{@w@H85i zfWVx?4vx>r)7d6yBo=ml_A5malC6p6b~mSi(^~Q{V(0VIGWc{2?IWF#4&YZ=>vl_E z9v?eOz5mrZoIn$txS<_$a5HV~Av^=Fl(jXCA!NZ`fCL>0^3O5Q=jS`OwbWMiI9zyOOrvf#*$WY#J;?UQlCQ*H1(f+{kHxV=fhC>m@vvwRs&-&#H zhB?VM4$2%$&w^!sA_qX3!p=vr?=qY(+7ZQt``z$31%Bz~YG|mb3GfTp^OJ;0J6+39 z9Wyy}&-%WXin@7segEF&ZIes5dV!D0ysoL?${x=1T(5XK=pM2}Zf2Fu`2N)@0VX0S zS*naC^%p~22?RXN-#5(LN^l-l6juD2NyiWGhwon1*4M}4#c{lT9)vO2yyyE`F5xW- zlq}@MaO1krRgI6ogg-1cmTew>;vKH8G3tGtw(E1@(VNQkp7&TwNV&i%>ZO*-^2*M4 zG4*>8OSPmREVkwCrcfb<7(ODFAJcqS>*fW+FE4arj(8fmQdyeVPee

p#&hbcHa& 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 diff --git a/ui/dialogs/about/revision.h b/ui/dialogs/about/revision.h index 731ba60..8be0c90 100644 --- a/ui/dialogs/about/revision.h +++ b/ui/dialogs/about/revision.h @@ -1,6 +1,6 @@ #ifndef REVISION_H #define REVISION_H -#define GIT_COMMIT_HASH "658ca1b" +#define GIT_COMMIT_HASH "0b9b628" #endif diff --git a/ui/mainwindow.h b/ui/mainwindow.h index 8d8c5e1..de2e951 100644 --- a/ui/mainwindow.h +++ b/ui/mainwindow.h @@ -59,6 +59,7 @@ private slots: private: Ui::MainWindow *ui; NDSFactory ndsFactory; + std::vector romHeader; void populateHeader(NDSHeader* ndsHeader); void enableExtractionButtons(); void disableExtractionButtons(); @@ -76,6 +77,8 @@ private: bool dumpEverything(QString dirPath); void populatePackerSectionHeader(NDSHeader *ndsHeader); + void enableCalcCrcButton(); + void enableBuildRomButton(); void generateHeader(NDSHeader* pRomHeader); bool writeHeader(const std::string& savePath); void calcHeaderCrc16(); @@ -102,6 +105,9 @@ private: bool writeArm7OverlayFilesPadding(char paddingByte, const std::string& savePath); bool writeRomPadding(const std::string& savePath); + //QString extractUnpackerHeaderTableData(int index); + QString extractPackerHeaderTableData(int index); + bool decodeFatFiles(); bool patchFat(const std::string& loadPath, uint32_t shiftSize, const std::string& savePath); diff --git a/ui/mainwindow.ui b/ui/mainwindow.ui index 999aba0..5e89ee4 100644 --- a/ui/mainwindow.ui +++ b/ui/mainwindow.ui @@ -6,8 +6,8 @@ 0 0 - 772 - 805 + 770 + 844 @@ -91,683 +91,23 @@ - - - - - Game Title: - - - - - - - true - - - - - - - Game Code: - - - - - - - true - - - - - - - Maker Code: - - - - - - - true - - - - - - - Unit Code: - - - - - - - true - - - - - - - - - - - Device Code: - - - - - - - - - - true - - - - - - - Card Size: - - - - - - - - - - true - - - - - - - Card Info: - - - - - - - - - - true - - - - - - - Flags: - - - - - - - - - - true - - - - - - - - - - - ARM9 Rom Addr: - - - - - - - true - - - - - - - ARM9 Entry Addr: - - - - - - - true - - - - - - - ARM9 Ram Addr: - - - - - - - true - - - - - - - ARM9 Size: - - - - - - - true - - - - - - - - - 0 + + + QAbstractScrollArea::AdjustToContents - - 0 + + QAbstractItemView::NoEditTriggers - - 0 + + false - - 0 - - - - - ARM7 Rom Addr: - - - - - - - true - - - - - - - ARM7 Entry Addr: - - - - - - - true - - - - - - - ARM7 Ram Addr: - - - - - - - true - - - - - - - ARM7 Size: - - - - - - - true - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Filename Table Addr: - - - - - - - true - - - - - - - Filename Table Size: - - - - - - - true - - - - - - - FAT Addr: - - - - - - - true - - - - - - - FAT Size: - - - - - - - true - - - - - - - - - - - ARM9 Overlay Addr: - - - - - - - true - - - - - - - ARM9 Overlay Size: - - - - - - - true - - - - - - - ARM7 Overlay Addr: - - - - - - - true - - - - - - - ARM7 Overlay Size: - - - - - - - true - - - - - - - - - - - Port 40001A4h NC: - - - - - - - true - - - - - - - Port 40001A4h KC: - - - - - - - true - - - - - - - Icon/Title Addr: - - - - - - - true - - - - - - - Secure Area CRC16: - - - - - - - true - - - - - - - - - - - Secure Area Timeout: - - - - - - - true - - - - - - - ARM9 AL Ram Addr: - - - - - - - true - - - - - - - ARM7 AL Ram Addr: - - - - - - - true - - - - - - - Secure Area Disable: - - - - - - - true - - - - - - - - - - - Used Rom Size: - - - - - - - true - - - - - - - Header Size: - - - - - - - true - - - - - - - Nintendo Logo: - - - - - - - true - - - - - - - Nintendo Logo CRC: - - - - - - - true - - - - - - - - - - - Header CRC: - - - - - - - true - - - - - - - Debug Rom Addr: - - - - - - - true - - - - - - - Debug Size: - - - - - - - true - - - - - - - Debug Ram Addr: - - - - - - - true - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Qt::Horizontal - - - - 400 - 20 - - - - - - - - FAT Files Original Address: - - - - - - - true - - - - + + false + + + false + + @@ -958,643 +298,14 @@ - - - - - Game Title: - - - - - - - false - - - - - - - Game Code: - - - - - - - false - - - - - - - Maker Code: - - - - - - - - - - Unit Code: - - - - - - - false - - - - - - - - - - - Device Code: - - - - - - - - - - false - - - - - - - Card Size: - - - - - - - - - - false - - - - - - - Card Info: - - - - - - - - - - - - - - Flags: - - - - - - - - - - false - - - - - - - - - - - ARM9 Rom Addr: - - - - - - - false - - - - - - - ARM9 Entry Addr: - - - - - - - false - - - - - - - ARM9 Ram Addr: - - - - - - - - - - ARM9 Size: - - - - - - - false - - - - - - - - - 0 + + + QAbstractScrollArea::AdjustToContents - - 0 + + QAbstractItemView::NoEditTriggers - - 0 - - - 0 - - - - - ARM7 Rom Addr: - - - - - - - false - - - - - - - ARM7 Entry Addr: - - - - - - - false - - - - - - - ARM7 Ram Addr: - - - - - - - - - - ARM7 Size: - - - - - - - false - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Filename Table Addr: - - - - - - - false - - - - - - - Filename Table Size: - - - - - - - false - - - - - - - FAT Addr: - - - - - - - - - - FAT Size: - - - - - - - false - - - - - - - - - - - ARM9 Overlay Addr: - - - - - - - false - - - - - - - ARM9 Overlay Size: - - - - - - - false - - - - - - - ARM7 Overlay Addr: - - - - - - - - - - ARM7 Overlay Size: - - - - - - - false - - - - - - - - - - - Port 40001A4h NC: - - - - - - - false - - - - - - - Port 40001A4h KC: - - - - - - - false - - - - - - - Icon/Title Addr: - - - - - - - - - - Secure Area CRC16: - - - - - - - false - - - - - - - - - - - Secure Area Timeout: - - - - - - - false - - - - - - - ARM9 AL Ram Addr: - - - - - - - false - - - - - - - ARM7 AL Ram Addr: - - - - - - - - - - Secure Area Disable: - - - - - - - false - - - - - - - - - - - Used Rom Size: - - - - - - - false - - - - - - - Header Size: - - - - - - - false - - - - - - - Nintendo Logo: - - - - - - - - - - Nintendo Logo CRC: - - - - - - - false - - - - - - - - - - - Header CRC: - - - - - - - false - - - - - - - Debug Rom Addr: - - - - - - - false - - - - - - - Debug Size: - - - - - - - - - - Debug Ram Addr: - - - - - - - false - - - - - - - - - 4 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Qt::Horizontal - - - - 450 - 20 - - - - - - - - Fat Files Address: - - - - - - - + @@ -1628,6 +339,9 @@ + + false + Calc Header CRC @@ -1861,6 +575,9 @@ + + false + Build NDS Rom @@ -2032,8 +749,8 @@ 0 0 - 772 - 21 + 770 + 22 diff --git a/ui/models/ndsheadermodel.cpp b/ui/models/ndsheadermodel.cpp new file mode 100644 index 0000000..2c0ed9c --- /dev/null +++ b/ui/models/ndsheadermodel.cpp @@ -0,0 +1,190 @@ +#include +#include "ndsheadermodel.h" +#include "../../ndsfactory/ndsheader.h" +#include "../tabs/commons/headernames.h" + + +NDSHeaderModel::NDSHeaderModel(NDSHeader *ndsHeader, QObject *parent) : QAbstractTableModel(parent) +{ + this->ndsHeader = ndsHeader; +} + +int NDSHeaderModel::rowCount(const QModelIndex &parent) const +{ + return static_cast(ndsHeaderNamesArr.size()); +} + +int NDSHeaderModel::columnCount(const QModelIndex &parent) const +{ + return 2; +} + +QVariant NDSHeaderModel::data(const QModelIndex &index, int role) const +{ + if(role == Qt::DisplayRole || role == Qt::EditRole) + { + if(index.column() == 0) + return QString::fromStdString(ndsHeaderNamesArr.at(static_cast(index.row()))); + else if(index.column() == 1) { + switch (index.row()) + { + case 0: return QString::fromUtf8(ndsHeader->GameTitle, 0xC); + case 1: return QString::fromUtf8(ndsHeader->GameCode, 0x4); + case 2: return QString::fromUtf8(reinterpret_cast(ndsHeader->MakerCode), 0x2); + case 3: return QString::number(ndsHeader->UnitCode, 16); + case 4: return QString::number(ndsHeader->DeviceType, 16); + case 5: return QString::number(ndsHeader->DeviceSize, 16); + case 6: return QString::number(ndsHeader->RomVersion, 16); + case 7: return QString::number(ndsHeader->Flags, 16); + case 8: return QString::number(ndsHeader->Arm9RomAddr,16); + case 9: return QString::number(ndsHeader->Arm9EntryAddr,16); + case 10: return QString::number(ndsHeader->Arm9RamAddr,16); + case 11: return QString::number(ndsHeader->Arm9Size,16); + case 12: return QString::number(ndsHeader->Arm7RomAddr,16); + case 13: return QString::number(ndsHeader->Arm7EntryAddr,16); + case 14: return QString::number(ndsHeader->Arm7RamAddr,16); + case 15: return QString::number(ndsHeader->Arm7Size,16); + case 16: return QString::number(ndsHeader->FilenameTableAddr,16); + case 17: return QString::number(ndsHeader->FilenameSize,16); + case 18: return QString::number(ndsHeader->FATAddr,16); + case 19: return QString::number(ndsHeader->FATSize,16); + case 20: return QString::number(ndsHeader->Arm9OverlayAddr,16); + case 21: return QString::number(ndsHeader->Arm9OverlaySize,16); + case 22: return QString::number(ndsHeader->Arm7OverlayAddr,16); + case 23: return QString::number(ndsHeader->Arm7OverlaySize,16); + case 24: return QString::number(ndsHeader->NormalCommandsSettings,16); + case 25: return QString::number(ndsHeader->Key1CommandsSettings,16); + case 26: return QString::number(ndsHeader->IconTitleAddr,16); + case 27: return QString::number(ndsHeader->SecureAreaCRC16,16); + case 28: return QString::number(ndsHeader->SecureAreaLoadingTimeout,16); + case 29: return QString::number(ndsHeader->ARM9AutoLoadListRamAddr,16); + case 30: return QString::number(ndsHeader->ARM7AutoLoadListRamAddr,16); + case 31: return QString::number(ndsHeader->SecureAreaDisable,16); + case 32: return QString::number(ndsHeader->RomSize,16); + case 33: return QString::number(ndsHeader->HeaderSize,16); + case 34: return QByteArray::fromRawData(reinterpret_cast(ndsHeader->NintendoLogo), 0x9C).toHex(); + case 35: return QString::number(ndsHeader->NintendoLogoCRC,16); + case 36: return QString::number(ndsHeader->HeaderCRC16,16); + case 37: return QString::number(ndsHeader->DebugRomAddr,16); + case 38: return QString::number(ndsHeader->DebugSize,16); + case 39: return QString::number(ndsHeader->DebugRamAddr,16); + case 40: return QString::number((ndsHeader->IconTitleAddr+IconTitleSize),16); + default: return QString(""); + } + } + } + return QVariant(); +} + +bool NDSHeaderModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if(role != Qt::EditRole) + return QAbstractTableModel::setData(index, value, role); + + switch (index.row()) + { + case 0: + { + std::fill_n(ndsHeader->GameTitle, 0xC, 0x0); + QString gameTitleStr = value.toString().toUpper(); + size_t size = std::min(gameTitleStr.size(), 0xC); + std::copy_n(qUtf8Printable(gameTitleStr), size, ndsHeader->GameTitle); + break; + } + case 1: + { + std::fill_n(ndsHeader->GameCode, 0x4, 0x0); + QString gameCodeStr = value.toString().toUpper(); + size_t size = std::min(gameCodeStr.size(), 0x4); + std::copy_n(qUtf8Printable(gameCodeStr), size, ndsHeader->GameCode); + break; + } + case 2: + { + std::fill_n(ndsHeader->MakerCode, 0x2, 0x0); + QString makerCodeStr = value.toString().toUpper(); + size_t size = std::min(makerCodeStr.size(), 0x2); + std::copy_n(qUtf8Printable(makerCodeStr), size, ndsHeader->MakerCode); + break; + } + case 3: ndsHeader->UnitCode = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 4: ndsHeader->DeviceType = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 5: ndsHeader->DeviceSize = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 6: ndsHeader->RomVersion = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 7: ndsHeader->Flags = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 8: ndsHeader->Arm9RomAddr = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 9: ndsHeader->Arm9EntryAddr = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 10: ndsHeader->Arm9RamAddr = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 11: ndsHeader->Arm9Size = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 12: ndsHeader->Arm7RomAddr = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 13: ndsHeader->Arm7EntryAddr = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 14: ndsHeader->Arm7RamAddr = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 15: ndsHeader->Arm7Size = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 16: ndsHeader->FilenameTableAddr = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 17: ndsHeader->FilenameSize = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 18: ndsHeader->FATAddr = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 19: ndsHeader->FATSize = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 20: ndsHeader->Arm9OverlayAddr = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 21: ndsHeader->Arm9OverlaySize = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 22: ndsHeader->Arm7OverlayAddr = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 23: ndsHeader->Arm7OverlaySize = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 24: ndsHeader->NormalCommandsSettings = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 25: ndsHeader->Key1CommandsSettings = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 26: ndsHeader->IconTitleAddr = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 27: ndsHeader->SecureAreaCRC16 = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 28: ndsHeader->SecureAreaLoadingTimeout = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 29: ndsHeader->ARM9AutoLoadListRamAddr = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 30: ndsHeader->ARM7AutoLoadListRamAddr = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 31: ndsHeader->SecureAreaDisable = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 32: ndsHeader->RomSize = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 33: ndsHeader->HeaderSize = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 34: + { + std::fill_n(ndsHeader->NintendoLogo, 0x9C, 0x0); + QByteArray nintendoLogoBytes = QByteArray::fromHex(qUtf8Printable(value.toString())); + size_t size = std::min(nintendoLogoBytes.size(), 0x9C); + std::copy_n(std::begin(nintendoLogoBytes), size, ndsHeader->NintendoLogo); + break; + } + case 35: ndsHeader->NintendoLogoCRC = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 36: ndsHeader->HeaderCRC16 = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 37: ndsHeader->DebugRomAddr = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 38: ndsHeader->DebugSize = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 39: ndsHeader->DebugRamAddr = static_cast(value.toString().toUInt(nullptr, 16)); break; + case 40: QMessageBox::information(nullptr, tr("NDS Factory"), tr("FAT files address is automatically calculated based on Icon/Title address!")); break; + default: return false; + } + Q_EMIT this->dataChanged(index, index); + return true; +} + +QVariant NDSHeaderModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if(orientation == Qt::Horizontal) + { + if(role == Qt::DisplayRole) + { + switch(section) + { + case 0: + return "Name"; + case 1: + return "Value"; + } + } + } + return QVariant(); +} + +Qt::ItemFlags NDSHeaderModel::flags(const QModelIndex &index) const +{ + if (index.isValid() && index.column() == 1 && isValueRowEditable) + return QAbstractItemModel::flags(index) | Qt::ItemIsEditable; + + return QAbstractItemModel::flags(index); +} + +void NDSHeaderModel::setValueRowEditable(bool isEditable) +{ + isValueRowEditable = isEditable; +} diff --git a/ui/models/ndsheadermodel.h b/ui/models/ndsheadermodel.h new file mode 100644 index 0000000..04b08f8 --- /dev/null +++ b/ui/models/ndsheadermodel.h @@ -0,0 +1,25 @@ +#ifndef NDSHEADERMODEL_H +#define NDSHEADERMODEL_H + +#include + +struct NDSHeader; + +class NDSHeaderModel : public QAbstractTableModel +{ + Q_OBJECT +public: + explicit NDSHeaderModel(NDSHeader *ndsHeader, QObject *parent = nullptr); + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + bool setData(const QModelIndex &index, const QVariant &value, int role) override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + Qt::ItemFlags flags(const QModelIndex &index) const override; + void setValueRowEditable(bool isEditable); +private: + NDSHeader *ndsHeader; + bool isValueRowEditable = false; +}; + +#endif // NDSHEADERMODEL_H diff --git a/ui/tabs/commons/headernames.cpp b/ui/tabs/commons/headernames.cpp new file mode 100644 index 0000000..3d641d1 --- /dev/null +++ b/ui/tabs/commons/headernames.cpp @@ -0,0 +1,45 @@ +#include "headernames.h" + +std::vector ndsHeaderNamesArr = { + "Game Title", + "Game Code", + "Maker Code", + "Unit Code", + "Device Code", + "Card Size", + "Card Info", + "Flags", + "ARM9 Rom Address", + "ARM9 Entry Address", + "ARM9 Ram Address", + "ARM9 Size", + "ARM7 Rom Address", + "ARM7 Entry Address", + "ARM7 Ram Address", + "ARM7 Size", + "Filename Table Address", + "Filename Table Size", + "FAT Address", + "FAT Size", + "ARM9 Overlay Address", + "ARM9 Overlay Size", + "ARM7 Overlay Address", + "ARM7 Overlay Size", + "Port 40001A4h NC", + "Port 40001a4h KC", + "Icon/Title Address", + "Secure Area CRC16", + "Secure Area Timeout", + "ARM9 AL Ram Address", + "ARM7 AL Ram Address", + "Secure Area Disable", + "Used Rom Size", + "Header Size", + "Nintendo Logo", + "Nintendo Logo CRC", + "Header CRC", + "Debug Rom Address", + "Debug Size", + "Debug Ram Address", + "FAT Files Address" +}; diff --git a/ui/tabs/commons/headernames.h b/ui/tabs/commons/headernames.h new file mode 100644 index 0000000..10df5e4 --- /dev/null +++ b/ui/tabs/commons/headernames.h @@ -0,0 +1,56 @@ +#ifndef HEADERNAMES_H +#define HEADERNAMES_H + +#include +#include +#include + +extern std::vector ndsHeaderNamesArr; + +namespace NDSHeaderNames { + enum { + GameTitle, + GameCode, + MakerCode, + UnitCode, + DeviceCode, + CardSize, + CardInfo, + Flags, + ARM9RomAddress, + ARM9EntryAddress, + ARM9RamAddress, + ARM9Size, + ARM7RomAddress, + ARM7EntryAddress, + ARM7RamAddress, + ARM7Size, + FilenameTableAddress, + FilenameTableSize, + FATAddress, + FATSize, + ARM9OverlayAddress, + ARM9OverlaySize, + ARM7OverlayAddress, + ARM7OverlaySize, + Port40001A4hNC, + Port40001a4hKC, + IconTitleAddress, + SecureAreaCRC16, + SecureAreaTimeout, + ARM9ALRamAddress, + ARM7ALRamAddress, + SecureAreaDisable, + UsedRomSize, + HeaderSize, + NintendoLogo, + NintendoLogoCRC, + HeaderCRC, + DebugRomAddress, + DebugSize, + DebugRamAddress, + FATFilesAddress + }; +} + +#endif // HEADERNAMES_H diff --git a/ui/tabs/packer/packertabfunctions.cpp b/ui/tabs/packer/packertabfunctions.cpp index de05a6e..a3b4cf2 100644 --- a/ui/tabs/packer/packertabfunctions.cpp +++ b/ui/tabs/packer/packertabfunctions.cpp @@ -3,117 +3,88 @@ #include #include "./../../mainwindow.h" #include "./../../ui_mainwindow.h" +#include "../commons/headernames.h" +#include "../../models/ndsheadermodel.h" void MainWindow::populatePackerSectionHeader(NDSHeader *ndsHeader) { - ui->packerGameTitleEdt->setText(QString::fromUtf8(ndsHeader->GameTitle, 0xC)); - ui->packerGameCodeEdt->setText(QString::fromUtf8(ndsHeader->GameCode, 0x4)); - ui->packerMakerCodeEdt->setText(QString::fromUtf8(reinterpret_cast(ndsHeader->MakerCode), 0x2)); - ui->packerUnitCodeEdt->setText(QString::number(ndsHeader->UnitCode, 16)); + auto* headerDataModel = new NDSHeaderModel(ndsHeader); + headerDataModel->setValueRowEditable(true); + ui->packerHeaderDataTable->setModel(headerDataModel); + ui->packerHeaderDataTable->setEditTriggers(QAbstractItemView::AllEditTriggers); + ui->packerHeaderDataTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeMode::ResizeToContents); + ui->packerHeaderDataTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeMode::Stretch); +} - ui->packerDeviceCodeEdt->setText(QString::number(ndsHeader->DeviceType, 16)); - ui->packerCardSizeEdt->setText(QString::number(ndsHeader->DeviceSize, 16)); - ui->packerCardInfoEdt->setText(QString::number(ndsHeader->RomVersion, 16)); - ui->packerFlagsEdt->setText(QString::number(ndsHeader->Flags, 16)); +void MainWindow::enableCalcCrcButton() +{ + ui->packerCalcHeaderCrcBtn->setEnabled(true); +} - ui->packerARM9RomAddrEdt->setText(QString::number(ndsHeader->Arm9RomAddr, 16)); - ui->packerARM9EntryAddrEdt->setText(QString::number(ndsHeader->Arm9EntryAddr, 16)); - ui->packerARM9RamAddrEdt->setText(QString::number(ndsHeader->Arm9RamAddr, 16)); - ui->packerARM9SizeEdt->setText(QString::number(ndsHeader->Arm9Size, 16)); - - ui->packerARM7RomAddrEdt->setText(QString::number(ndsHeader->Arm7RomAddr, 16)); - ui->packerARM7EntryAddrEdt->setText(QString::number(ndsHeader->Arm7EntryAddr, 16)); - ui->packerARM7RamAddrEdt->setText(QString::number(ndsHeader->Arm7RamAddr, 16)); - ui->packerARM7SizeEdt->setText(QString::number(ndsHeader->Arm7Size, 16)); - - ui->packerFilenameTableAddrEdt->setText(QString::number(ndsHeader->FilenameTableAddr, 16)); - ui->packerFilenameTableSizeEdt->setText(QString::number(ndsHeader->FilenameSize, 16)); - ui->packerFATAddrEdt->setText(QString::number(ndsHeader->FATAddr, 16)); - ui->packerFATSizeEdt->setText(QString::number(ndsHeader->FATSize, 16)); - - ui->packerARM9OverlayAddrEdt->setText(QString::number(ndsHeader->Arm9OverlayAddr, 16)); - ui->packerARM9OverlaySizeEdt->setText(QString::number(ndsHeader->Arm9OverlaySize, 16)); - ui->packerARM7OverlayAddrEdt->setText(QString::number(ndsHeader->Arm7OverlayAddr, 16)); - ui->packerARM7OverlaySizeEdt->setText(QString::number(ndsHeader->Arm7OverlaySize, 16)); - - ui->packerPortNCEdt->setText(QString::number(ndsHeader->NormalCommandsSettings, 16)); - ui->packerPortKCEdt->setText(QString::number(ndsHeader->Key1CommandsSettings, 16)); - ui->packerIconTitleEdt->setText(QString::number(ndsHeader->IconTitleAddr, 16)); - ui->packerSecureAreaCRC16Edt->setText(QString::number(ndsHeader->SecureAreaCRC16, 16)); - - ui->packerSecureAreaTimeoutEdt->setText(QString::number(ndsHeader->SecureAreaLoadingTimeout, 16)); - ui->packerARM9AURamAddrEdt->setText(QString::number(ndsHeader->ARM9AutoLoadListRamAddr, 16)); - ui->packerARM7AURamAddrEdt->setText(QString::number(ndsHeader->ARM7AutoLoadListRamAddr, 16)); - ui->packerSecureAreaDisableEdt->setText(QString::number(ndsHeader->SecureAreaDisable, 16)); - - ui->packerUsedRomSizeEdt->setText(QString::number(ndsHeader->RomSize, 16)); - ui->packerHeaderSizeEdt->setText(QString::number(ndsHeader->HeaderSize, 16)); - ui->packerNintendoLogoEdt->setText(QByteArray::fromRawData(reinterpret_cast(ndsHeader->NintendoLogo), 0x9C).toHex()); - ui->packerNintendoLogoCRCEdt->setText(QString::number(ndsHeader->NintendoLogoCRC, 16)); - - ui->packerHeaderCRCEdt->setText(QString::number(ndsHeader->HeaderCRC16, 16)); - ui->packerDebugRomAddrEdt->setText(QString::number(ndsHeader->DebugRomAddr, 16)); - ui->packerDebugSizeEdt->setText(QString::number(ndsHeader->DebugSize, 16)); - ui->packerDebugRamAddrEdt->setText(QString::number(ndsHeader->DebugRamAddr, 16)); +void MainWindow::enableBuildRomButton() +{ + ui->packerBuildNDSRomBtn->setEnabled(true); } void MainWindow::generateHeader(NDSHeader* pRomHeader) { - std::copy_n(ui->packerGameTitleEdt->text().toLatin1().data(), 0xc, std::begin(pRomHeader->GameTitle)); - std::copy_n(ui->packerGameCodeEdt->text().toStdString().data(), 0x4, std::begin(pRomHeader->GameCode)); - std::copy_n(ui->packerMakerCodeEdt->text().toStdString().data(), 0x2, std::begin(pRomHeader->MakerCode)); - pRomHeader->UnitCode = static_cast(ui->packerUnitCodeEdt->text().toUInt(nullptr, 16)); + std::copy_n(extractPackerHeaderTableData(NDSHeaderNames::GameTitle).toLatin1().data(), 0xc, std::begin(pRomHeader->GameTitle)); - pRomHeader->DeviceType = static_cast(ui->packerDeviceCodeEdt->text().toUInt(nullptr, 16)); - pRomHeader->DeviceSize = static_cast(ui->packerCardSizeEdt->text().toUInt(nullptr, 16)); + + std::copy_n(extractPackerHeaderTableData(NDSHeaderNames::GameCode).toLatin1().data(), 0x4, std::begin(pRomHeader->GameCode)); + std::copy_n(extractPackerHeaderTableData(NDSHeaderNames::MakerCode).toLatin1().data(), 0x2, std::begin(pRomHeader->MakerCode)); + pRomHeader->UnitCode = static_cast(extractPackerHeaderTableData(NDSHeaderNames::UnitCode).toUInt(nullptr, 16)); + + pRomHeader->DeviceType = static_cast(extractPackerHeaderTableData(NDSHeaderNames::DeviceCode).toUInt(nullptr, 16)); + pRomHeader->DeviceSize = static_cast(extractPackerHeaderTableData(NDSHeaderNames::CardSize).toUInt(nullptr, 16)); std::fill(std::begin(pRomHeader->Reserved1), std::end(pRomHeader->Reserved1), 0); - pRomHeader->RomVersion = static_cast(ui->packerCardInfoEdt->text().toUInt(nullptr, 16)); - pRomHeader->Flags = static_cast(ui->packerFlagsEdt->text().toUInt(nullptr, 16)); + pRomHeader->RomVersion = static_cast(extractPackerHeaderTableData(NDSHeaderNames::CardInfo).toUInt(nullptr, 16)); + pRomHeader->Flags = static_cast(extractPackerHeaderTableData(NDSHeaderNames::Flags).toUInt(nullptr, 16)); - pRomHeader->Arm9RomAddr = ui->packerARM9RomAddrEdt->text().toUInt(nullptr, 16); - pRomHeader->Arm9EntryAddr = ui->packerARM9EntryAddrEdt->text().toUInt(nullptr, 16); - pRomHeader->Arm9RamAddr = ui->packerARM9RamAddrEdt->text().toUInt(nullptr, 16); - pRomHeader->Arm9Size = ui->packerARM9SizeEdt->text().toUInt(nullptr, 16); + pRomHeader->Arm9RomAddr = extractPackerHeaderTableData(NDSHeaderNames::ARM9RomAddress).toUInt(nullptr, 16); + pRomHeader->Arm9EntryAddr = extractPackerHeaderTableData(NDSHeaderNames::ARM9EntryAddress).toUInt(nullptr, 16); + pRomHeader->Arm9RamAddr = extractPackerHeaderTableData(NDSHeaderNames::ARM9RamAddress).toUInt(nullptr, 16); + pRomHeader->Arm9Size = extractPackerHeaderTableData(NDSHeaderNames::ARM9Size).toUInt(nullptr, 16); - pRomHeader->Arm7RomAddr = ui->packerARM7RomAddrEdt->text().toUInt(nullptr, 16); - pRomHeader->Arm7EntryAddr = ui->packerARM7EntryAddrEdt->text().toUInt(nullptr, 16); - pRomHeader->Arm7RamAddr = ui->packerARM7RamAddrEdt->text().toUInt(nullptr, 16); - pRomHeader->Arm7Size = ui->packerARM7SizeEdt->text().toUInt(nullptr, 16); + pRomHeader->Arm7RomAddr = extractPackerHeaderTableData(NDSHeaderNames::ARM7RomAddress).toUInt(nullptr, 16); + pRomHeader->Arm7EntryAddr = extractPackerHeaderTableData(NDSHeaderNames::ARM7EntryAddress).toUInt(nullptr, 16); + pRomHeader->Arm7RamAddr = extractPackerHeaderTableData(NDSHeaderNames::ARM7RamAddress).toUInt(nullptr, 16); + pRomHeader->Arm7Size = extractPackerHeaderTableData(NDSHeaderNames::ARM7Size).toUInt(nullptr, 16); - pRomHeader->FilenameTableAddr = ui->packerFilenameTableAddrEdt->text().toUInt(nullptr, 16); - pRomHeader->FilenameSize = ui->packerFilenameTableSizeEdt->text().toUInt(nullptr, 16); - pRomHeader->FATAddr = ui->packerFATAddrEdt->text().toUInt(nullptr, 16); - pRomHeader->FATSize = ui->packerFATSizeEdt->text().toUInt(nullptr, 16); + pRomHeader->FilenameTableAddr = extractPackerHeaderTableData(NDSHeaderNames::FilenameTableAddress).toUInt(nullptr, 16); + pRomHeader->FilenameSize = extractPackerHeaderTableData(NDSHeaderNames::FilenameTableSize).toUInt(nullptr, 16); + pRomHeader->FATAddr = extractPackerHeaderTableData(NDSHeaderNames::FATAddress).toUInt(nullptr, 16); + pRomHeader->FATSize = extractPackerHeaderTableData(NDSHeaderNames::FATSize).toUInt(nullptr, 16); - pRomHeader->Arm9OverlayAddr = ui->packerARM9OverlayAddrEdt->text().toUInt(nullptr, 16); - pRomHeader->Arm9OverlaySize = ui->packerARM9OverlaySizeEdt->text().toUInt(nullptr, 16); - pRomHeader->Arm7OverlayAddr = ui->packerARM7OverlayAddrEdt->text().toUInt(nullptr, 16); - pRomHeader->Arm7OverlaySize = ui->packerARM7OverlaySizeEdt->text().toUInt(nullptr, 16); + pRomHeader->Arm9OverlayAddr = extractPackerHeaderTableData(NDSHeaderNames::ARM9OverlayAddress).toUInt(nullptr, 16); + pRomHeader->Arm9OverlaySize = extractPackerHeaderTableData(NDSHeaderNames::ARM9OverlaySize).toUInt(nullptr, 16); + pRomHeader->Arm7OverlayAddr = extractPackerHeaderTableData(NDSHeaderNames::ARM7OverlayAddress).toUInt(nullptr, 16); + pRomHeader->Arm7OverlaySize = extractPackerHeaderTableData(NDSHeaderNames::ARM7OverlaySize).toUInt(nullptr, 16); - pRomHeader->NormalCommandsSettings = ui->packerPortNCEdt->text().toUInt(nullptr, 16); - pRomHeader->Key1CommandsSettings = ui->packerPortKCEdt->text().toUInt(nullptr, 16); - pRomHeader->IconTitleAddr = ui->packerIconTitleEdt->text().toUInt(nullptr, 16); - pRomHeader->SecureAreaCRC16 = ui->packerSecureAreaCRC16Edt->text().toUShort(nullptr, 16); + pRomHeader->NormalCommandsSettings = extractPackerHeaderTableData(NDSHeaderNames::Port40001A4hNC).toUInt(nullptr, 16); + pRomHeader->Key1CommandsSettings = extractPackerHeaderTableData(NDSHeaderNames::Port40001a4hKC).toUInt(nullptr, 16); + pRomHeader->IconTitleAddr = extractPackerHeaderTableData(NDSHeaderNames::IconTitleAddress).toUInt(nullptr, 16); + pRomHeader->SecureAreaCRC16 = extractPackerHeaderTableData(NDSHeaderNames::SecureAreaCRC16).toUShort(nullptr, 16); - pRomHeader->SecureAreaLoadingTimeout = ui->packerSecureAreaTimeoutEdt->text().toUShort(nullptr, 16); - pRomHeader->ARM9AutoLoadListRamAddr = ui->packerARM9AURamAddrEdt->text().toUInt(nullptr, 16); - pRomHeader->ARM7AutoLoadListRamAddr = ui->packerARM7AURamAddrEdt->text().toUInt(nullptr, 16); - pRomHeader->SecureAreaDisable = ui->packerSecureAreaDisableEdt->text().toULong(nullptr, 16); + pRomHeader->SecureAreaLoadingTimeout = extractPackerHeaderTableData(NDSHeaderNames::SecureAreaTimeout).toUShort(nullptr, 16); + pRomHeader->ARM9AutoLoadListRamAddr = extractPackerHeaderTableData(NDSHeaderNames::ARM9ALRamAddress).toUInt(nullptr, 16); + pRomHeader->ARM7AutoLoadListRamAddr = extractPackerHeaderTableData(NDSHeaderNames::ARM7ALRamAddress).toUInt(nullptr, 16); + pRomHeader->SecureAreaDisable = extractPackerHeaderTableData(NDSHeaderNames::SecureAreaDisable).toULong(nullptr, 16); - pRomHeader->RomSize = ui->packerUsedRomSizeEdt->text().toUInt(nullptr, 16); - pRomHeader->HeaderSize = ui->packerHeaderSizeEdt->text().toUInt(nullptr, 16); + pRomHeader->RomSize = extractPackerHeaderTableData(NDSHeaderNames::UsedRomSize).toUInt(nullptr, 16); + pRomHeader->HeaderSize = extractPackerHeaderTableData(NDSHeaderNames::HeaderSize).toUInt(nullptr, 16); std::fill(std::begin(pRomHeader->Reserved2), std::end(pRomHeader->Reserved2), 0); - std::copy_n(std::begin(QByteArray::fromHex(ui->packerNintendoLogoEdt->text().toUtf8())), 0x9C, std::begin(pRomHeader->NintendoLogo)); - pRomHeader->NintendoLogoCRC = ui->packerNintendoLogoCRCEdt->text().toUShort(nullptr, 16); + std::copy_n(std::begin(QByteArray::fromHex(extractPackerHeaderTableData(NDSHeaderNames::NintendoLogo).toUtf8())), 0x9C, std::begin(pRomHeader->NintendoLogo)); + pRomHeader->NintendoLogoCRC = extractPackerHeaderTableData(NDSHeaderNames::NintendoLogoCRC).toUShort(nullptr, 16); - pRomHeader->HeaderCRC16 = ui->packerHeaderCRCEdt->text().toUShort(nullptr, 16); - pRomHeader->DebugRomAddr = ui->packerDebugRomAddrEdt->text().toUInt(nullptr, 16); - pRomHeader->DebugSize = ui->packerDebugSizeEdt->text().toUInt(nullptr, 16); - pRomHeader->DebugRamAddr = ui->packerDebugRamAddrEdt->text().toUInt(nullptr, 16); + pRomHeader->HeaderCRC16 = extractPackerHeaderTableData(NDSHeaderNames::HeaderCRC).toUShort(nullptr, 16); + pRomHeader->DebugRomAddr = extractPackerHeaderTableData(NDSHeaderNames::DebugRomAddress).toUInt(nullptr, 16); + pRomHeader->DebugSize = extractPackerHeaderTableData(NDSHeaderNames::DebugSize).toUInt(nullptr, 16); + pRomHeader->DebugRamAddr = extractPackerHeaderTableData(NDSHeaderNames::DebugRamAddress).toUInt(nullptr, 16); std::fill(std::begin(pRomHeader->Reserved3), std::end(pRomHeader->Reserved3), 0); std::fill(std::begin(pRomHeader->Reserved4), std::end(pRomHeader->Reserved4), 0); @@ -137,19 +108,19 @@ void MainWindow::calcHeaderCrc16() generateHeader(pRomHeader); - ui->packerHeaderCRCEdt->setText(QString::number(ndsFactory.calcHeaderCrc16(romHeader), 16)); - + QModelIndex headerCrcIndex = ui->packerHeaderDataTable->model()->index(NDSHeaderNames::HeaderCRC, 1); + ui->packerHeaderDataTable->model()->setData(headerCrcIndex, QString::number(ndsFactory.calcHeaderCrc16(romHeader), 16), Qt::EditRole); } bool MainWindow::writeArm9Bin(const std::string& savePath, bool isArm9FooterPresent) { - uint32_t size = ui->packerARM9SizeEdt->text().toUInt(nullptr, 16); + uint32_t size = extractPackerHeaderTableData(NDSHeaderNames::ARM9Size).toUInt(nullptr, 16); if (isArm9FooterPresent) size += Arm9FooterSize; return ndsFactory.writeSectionToFile( ui->loadedArm9BinPathEdt->text().toStdString(), savePath, - ui->packerARM9RomAddrEdt->text().toUInt(nullptr, 16), + extractPackerHeaderTableData(NDSHeaderNames::ARM9RomAddress).toUInt(nullptr, 16), size); } @@ -158,8 +129,8 @@ bool MainWindow::writeArm7Bin(const std::string& savePath) return ndsFactory.writeSectionToFile( ui->loadedArm7BinPathEdt->text().toStdString(), savePath, - ui->packerARM7RomAddrEdt->text().toUInt(nullptr, 16), - ui->packerARM7SizeEdt->text().toUInt(nullptr, 16)); + extractPackerHeaderTableData(NDSHeaderNames::ARM7RomAddress).toUInt(nullptr, 16), + extractPackerHeaderTableData(NDSHeaderNames::ARM7Size).toUInt(nullptr, 16)); } bool MainWindow::writeFnt(const std::string& savePath) @@ -167,8 +138,8 @@ bool MainWindow::writeFnt(const std::string& savePath) return ndsFactory.writeSectionToFile( ui->loadedFntPathEdt->text().toStdString(), savePath, - ui->packerFilenameTableAddrEdt->text().toUInt(nullptr, 16), - ui->packerFilenameTableSizeEdt->text().toUInt(nullptr, 16)); + extractPackerHeaderTableData(NDSHeaderNames::FilenameTableAddress).toUInt(nullptr, 16), + extractPackerHeaderTableData(NDSHeaderNames::FilenameTableSize).toUInt(nullptr, 16)); } bool MainWindow::writeFat(const std::string& savePath) @@ -176,8 +147,8 @@ bool MainWindow::writeFat(const std::string& savePath) return ndsFactory.writeSectionToFile( ui->loadedFatPathEdt->text().toStdString(), savePath, - ui->packerFATAddrEdt->text().toUInt(nullptr, 16), - ui->packerFATSizeEdt->text().toUInt(nullptr, 16)); + extractPackerHeaderTableData(NDSHeaderNames::FATAddress).toUInt(nullptr, 16), + extractPackerHeaderTableData(NDSHeaderNames::FATSize).toUInt(nullptr, 16)); } bool MainWindow::writeArm9Overlay(const std::string& savePath) @@ -185,8 +156,8 @@ bool MainWindow::writeArm9Overlay(const std::string& savePath) return ndsFactory.writeSectionToFile( ui->loadedArm9OverlayPathEdt->text().toStdString(), savePath, - ui->packerARM9OverlayAddrEdt->text().toUInt(nullptr, 16), - ui->packerARM9OverlaySizeEdt->text().toUInt(nullptr, 16)); + extractPackerHeaderTableData(NDSHeaderNames::ARM9OverlayAddress).toUInt(nullptr, 16), + extractPackerHeaderTableData(NDSHeaderNames::ARM9OverlaySize).toUInt(nullptr, 16)); } bool MainWindow::writeArm9OverlayFiles(const std::string& savePath) @@ -199,8 +170,8 @@ bool MainWindow::writeArm7Overlay(const std::string& savePath) return ndsFactory.writeSectionToFile( ui->loadedArm7OverlayPathEdt->text().toStdString(), savePath, - ui->packerARM7OverlayAddrEdt->text().toUInt(nullptr, 16), - ui->packerARM7OverlaySizeEdt->text().toUInt(nullptr, 16)); + extractPackerHeaderTableData(NDSHeaderNames::ARM9OverlayAddress).toUInt(nullptr, 16), + extractPackerHeaderTableData(NDSHeaderNames::ARM9OverlaySize).toUInt(nullptr, 16)); } bool MainWindow::writeArm7OverlayFiles(const std::string& savePath) @@ -213,14 +184,14 @@ bool MainWindow::writeIconTitle(const std::string& savePath) return ndsFactory.writeSectionToFile( ui->loadedIconTitlePathEdt->text().toStdString(), savePath, - ui->packerIconTitleEdt->text().toUInt(nullptr, 16), + extractPackerHeaderTableData(NDSHeaderNames::IconTitleAddress).toUInt(nullptr, 16), IconTitleSize); } bool MainWindow::writeFatFiles(const std::string& savePath) { - uint32_t startAddr = ui->packerIconTitleEdt->text().toUInt(nullptr, 16) + IconTitleSize; - uint32_t size = ui->packerUsedRomSizeEdt->text().toUInt(nullptr, 16) - startAddr; + uint32_t startAddr = extractPackerHeaderTableData(NDSHeaderNames::IconTitleAddress).toUInt(nullptr, 16) + IconTitleSize; + uint32_t size = extractPackerHeaderTableData(NDSHeaderNames::UsedRomSize).toUInt(nullptr, 16) - startAddr; return ndsFactory.writeSectionToFile( ui->loadedFatFilesPathEdt->text().toStdString(), @@ -232,7 +203,7 @@ bool MainWindow::writeFatFiles(const std::string& savePath) bool MainWindow::writeHeaderPadding(char paddingType, const std::string& savePath) { uint32_t startAddr = sizeof(NDSHeader); - uint32_t size = ui->packerARM9RomAddrEdt->text().toUInt(nullptr, 16) - startAddr; + uint32_t size = extractPackerHeaderTableData(NDSHeaderNames::ARM9RomAddress).toUInt(nullptr, 16) - startAddr; return ndsFactory.writePaddingToFile( paddingType, @@ -243,8 +214,9 @@ bool MainWindow::writeHeaderPadding(char paddingType, const std::string& savePat bool MainWindow::writeArm9BinPadding(char paddingType, const std::string& savePath, bool isFooterPresent) { // FIXME check ARM9 Overlay - uint32_t startAddr = ui->packerARM9RomAddrEdt->text().toUInt(nullptr, 16) + ui->packerARM9SizeEdt->text().toUInt(nullptr, 16); - uint32_t size = ui->packerARM7RomAddrEdt->text().toUInt(nullptr, 16) - startAddr; + uint32_t startAddr = extractPackerHeaderTableData(NDSHeaderNames::ARM9RomAddress).toUInt(nullptr, 16) + + extractPackerHeaderTableData(NDSHeaderNames::ARM9Size).toUInt(nullptr, 16); + uint32_t size = extractPackerHeaderTableData(NDSHeaderNames::ARM7RomAddress).toUInt(nullptr, 16) - startAddr; if (isFooterPresent) size -= Arm9FooterSize; @@ -258,8 +230,9 @@ bool MainWindow::writeArm9BinPadding(char paddingType, const std::string& savePa bool MainWindow::writeArm7BinPadding(char paddingType, const std::string& savePath) { // FIXME check ARM7 Overlay - uint32_t startAddr = ui->packerARM7RomAddrEdt->text().toUInt(nullptr, 16) + ui->packerARM7SizeEdt->text().toUInt(nullptr, 16); - uint32_t size = ui->packerFilenameTableAddrEdt->text().toUInt(nullptr, 16) - startAddr; + uint32_t startAddr = extractPackerHeaderTableData(NDSHeaderNames::ARM7RomAddress).toUInt(nullptr, 16) + + extractPackerHeaderTableData(NDSHeaderNames::ARM7Size).toUInt(nullptr, 16); + uint32_t size = extractPackerHeaderTableData(NDSHeaderNames::FilenameTableAddress).toUInt(nullptr, 16) - startAddr; return ndsFactory.writePaddingToFile( paddingType, @@ -270,8 +243,9 @@ bool MainWindow::writeArm7BinPadding(char paddingType, const std::string& savePa bool MainWindow::writeFntPadding(char paddingType, const std::string& savePath) { - uint32_t startAddr = ui->packerFilenameTableAddrEdt->text().toUInt(nullptr, 16) + ui->packerFilenameTableSizeEdt->text().toUInt(nullptr, 16); - uint32_t size = ui->packerFATAddrEdt->text().toUInt(nullptr, 16) - startAddr; + uint32_t startAddr = extractPackerHeaderTableData(NDSHeaderNames::FilenameTableAddress).toUInt(nullptr, 16) + + extractPackerHeaderTableData(NDSHeaderNames::FilenameTableSize).toUInt(nullptr, 16); + uint32_t size = extractPackerHeaderTableData(NDSHeaderNames::FATAddress).toUInt(nullptr, 16) - startAddr; return ndsFactory.writePaddingToFile( paddingType, @@ -282,8 +256,9 @@ bool MainWindow::writeFntPadding(char paddingType, const std::string& savePath) bool MainWindow::writeFatPadding(char paddingType, const std::string& savePath) { - uint32_t startAddr = ui->packerFATAddrEdt->text().toUInt(nullptr, 16) + ui->packerFATSizeEdt->text().toUInt(nullptr, 16); - uint32_t size = ui->packerIconTitleEdt->text().toUInt(nullptr, 16) - startAddr; + uint32_t startAddr = extractPackerHeaderTableData(NDSHeaderNames::FATAddress).toUInt(nullptr, 16) + + extractPackerHeaderTableData(NDSHeaderNames::FATSize).toUInt(nullptr, 16); + uint32_t size = extractPackerHeaderTableData(NDSHeaderNames::IconTitleAddress).toUInt(nullptr, 16) - startAddr; return ndsFactory.writePaddingToFile( paddingType, @@ -315,8 +290,8 @@ bool MainWindow::writeArm7OverlayFilesPadding(char paddingType, const std::strin bool MainWindow::writeRomPadding(const std::string& savePath) { - uint32_t startAddr = ui->packerUsedRomSizeEdt->text().toUInt(nullptr, 16); - uint32_t size = static_cast(ndsFactory.getCardSizeInBytes(ui->packerCardSizeEdt->text().toInt())) - startAddr; + uint32_t startAddr = extractPackerHeaderTableData(NDSHeaderNames::UsedRomSize).toUInt(nullptr, 16); + uint32_t size = static_cast(ndsFactory.getCardSizeInBytes(extractPackerHeaderTableData(NDSHeaderNames::CardSize).toInt())) - startAddr; return ndsFactory.writePaddingToFile( static_cast('\xff'), @@ -330,7 +305,7 @@ bool MainWindow::writeEverything(const std::string& savePath) bool res = true; char paddingType; bool isArm9FooterPresent = ndsFactory.checkArm9FooterPresence(ui->loadedArm9BinPathEdt->text().toStdString(), - ui->packerARM9SizeEdt->text().toUInt(nullptr, 16)); + extractPackerHeaderTableData(NDSHeaderNames::ARM9Size).toUInt(nullptr, 16)); if (ui->packerPadType00RdBtn->isChecked()) paddingType = static_cast('\x00'); else @@ -346,13 +321,13 @@ bool MainWindow::writeEverything(const std::string& savePath) res &= writeFntPadding(paddingType, savePath); res &= writeFat(savePath); res &= writeFatPadding(paddingType, savePath); - if(ui->packerARM9OverlayAddrEdt->text().toUInt(nullptr, 16) != 0) { + if(extractPackerHeaderTableData(NDSHeaderNames::ARM9OverlayAddress).toUInt(nullptr, 16) != 0) { res &= writeArm9Overlay(savePath); res &= writeArm9OverlayPadding(paddingType, savePath); res &= writeArm9OverlayFiles(savePath); res &= writeArm9OverlayFilesPadding(paddingType, savePath); } - if(ui->packerARM7OverlayAddrEdt->text().toUInt(nullptr, 16) != 0) { + if(extractPackerHeaderTableData(NDSHeaderNames::ARM9OverlayAddress).toUInt(nullptr, 16) != 0) { res &= writeArm7Overlay(savePath); res &= writeArm7OverlayPadding(paddingType, savePath); res &= writeArm7OverlayFiles(savePath); @@ -366,3 +341,8 @@ bool MainWindow::writeEverything(const std::string& savePath) } return res; } + +QString MainWindow::extractPackerHeaderTableData(int index) +{ + return ui->packerHeaderDataTable->model()->index(index, 1).data().toString(); +} diff --git a/ui/tabs/packer/packertabsignals.cpp b/ui/tabs/packer/packertabsignals.cpp index 67600f7..f342d03 100644 --- a/ui/tabs/packer/packertabsignals.cpp +++ b/ui/tabs/packer/packertabsignals.cpp @@ -2,11 +2,11 @@ #include #include "./../../mainwindow.h" #include "./../../ui_mainwindow.h" +#include "../commons/headernames.h" void MainWindow::on_packerLoadHeaderBtn_clicked() { - std::vector romHeader; NDSHeader *pNDSHeader; QString headerPath = QFileDialog::getOpenFileName( @@ -25,6 +25,8 @@ void MainWindow::on_packerLoadHeaderBtn_clicked() { pNDSHeader = reinterpret_cast(romHeader.data()); populatePackerSectionHeader(pNDSHeader); + enableCalcCrcButton(); + enableBuildRomButton(); } } @@ -165,7 +167,6 @@ void MainWindow::on_packerLoadFatFilesBtn_clicked() if(!fatFilesPath.isNull()) { ui->loadedFatFilesPathEdt->setText(fatFilesPath.toUtf8()); - ui->packerFatFilesAddrEdt->setText(QString::number((ui->packerIconTitleEdt->text().toUInt(nullptr, 16) + IconTitleSize), 16)); } } @@ -184,7 +185,6 @@ void MainWindow::on_packerBuildNDSRomBtn_clicked() } } - void MainWindow::on_packerCalcHeaderCrcBtn_clicked() { calcHeaderCrc16(); diff --git a/ui/tabs/unpacker/unpackertabfunctions.cpp b/ui/tabs/unpacker/unpackertabfunctions.cpp index cfdc8e3..53cbd15 100644 --- a/ui/tabs/unpacker/unpackertabfunctions.cpp +++ b/ui/tabs/unpacker/unpackertabfunctions.cpp @@ -3,76 +3,29 @@ #include #include #include -#include "./../../mainwindow.h" -#include "./../../ui_mainwindow.h" +#include "../../mainwindow.h" +#include "../../ui_mainwindow.h" +#include "../commons/headernames.h" +#include "../../models/ndsheadermodel.h" void MainWindow::populateHeader(NDSHeader* ndsHeader) { - - ui->unpackerGameTitleEdt->setText(QString::fromUtf8(ndsHeader->GameTitle, 0xC)); - ui->unpackerGameCodeEdt->setText(QString::fromUtf8(ndsHeader->GameCode, 0x4)); - ui->unpackerMakerCodeEdt->setText(QString::fromUtf8(reinterpret_cast(ndsHeader->MakerCode), 0x2)); - ui->unpackerUnitCodeEdt->setText(QString::number(ndsHeader->UnitCode, 16)); - - ui->unpackerDeviceCodeEdt->setText(QString::number(ndsHeader->DeviceType, 16)); - ui->unpackerCardSizeEdt->setText(QString::number(ndsHeader->DeviceSize, 16)); - ui->unpackerCardInfoEdt->setText(QString::number(ndsHeader->RomVersion, 16)); - ui->unpackerFlagsEdt->setText(QString::number(ndsHeader->Flags, 16)); - - ui->unpackerARM9RomAddrEdt->setText(QString::number(ndsHeader->Arm9RomAddr,16)); - ui->unpackerARM9EntryAddrEdt->setText(QString::number(ndsHeader->Arm9EntryAddr,16)); - ui->unpackerARM9RamAddrEdt->setText(QString::number(ndsHeader->Arm9RamAddr,16)); - ui->unpackerARM9SizeEdt->setText(QString::number(ndsHeader->Arm9Size,16)); - - ui->unpackerARM7RomAddrEdt->setText(QString::number(ndsHeader->Arm7RomAddr,16)); - ui->unpackerARM7EntryAddrEdt->setText(QString::number(ndsHeader->Arm7EntryAddr,16)); - ui->unpackerARM7RamAddrEdt->setText(QString::number(ndsHeader->Arm7RamAddr,16)); - ui->unpackerARM7SizeEdt->setText(QString::number(ndsHeader->Arm7Size,16)); - - ui->unpackerFilenameTableAddrEdt->setText(QString::number(ndsHeader->FilenameTableAddr,16)); - ui->unpackerFilenameTableSizeEdt->setText(QString::number(ndsHeader->FilenameSize,16)); - ui->unpackerFATAddrEdt->setText(QString::number(ndsHeader->FATAddr,16)); - ui->unpackerFATSizeEdt->setText(QString::number(ndsHeader->FATSize,16)); - - ui->unpackerARM9OverlayAddrEdt->setText(QString::number(ndsHeader->Arm9OverlayAddr,16)); - ui->unpackerARM9OverlaySizeEdt->setText(QString::number(ndsHeader->Arm9OverlaySize,16)); - ui->unpackerARM7OverlayAddrEdt->setText(QString::number(ndsHeader->Arm7OverlayAddr,16)); - ui->unpackerARM7OverlaySizeEdt->setText(QString::number(ndsHeader->Arm7OverlaySize,16)); - - ui->unpackerPortNCEdt->setText(QString::number(ndsHeader->NormalCommandsSettings,16)); - ui->unpackerPortKCEdt->setText(QString::number(ndsHeader->Key1CommandsSettings,16)); - ui->unpackerIconTitleEdt->setText(QString::number(ndsHeader->IconTitleAddr,16)); - ui->unpackerSecureAreaCRC16Edt->setText(QString::number(ndsHeader->SecureAreaCRC16,16)); - - ui->unpackerSecureAreaTimeoutEdt->setText(QString::number(ndsHeader->SecureAreaLoadingTimeout,16)); - ui->unpackerARM9AURamAddrEdt->setText(QString::number(ndsHeader->ARM9AutoLoadListRamAddr,16)); - ui->unpackerARM7AURamAddrEdt->setText(QString::number(ndsHeader->ARM7AutoLoadListRamAddr,16)); - ui->unpackerSecureAreaDisableEdt->setText(QString::number(ndsHeader->SecureAreaDisable,16)); - - ui->unpackerUsedRomSizeEdt->setText(QString::number(ndsHeader->RomSize,16)); - ui->unpackerHeaderSizeEdt->setText(QString::number(ndsHeader->HeaderSize,16)); - - ui->unpackerNintendoLogoEdt->setText(QByteArray::fromRawData(reinterpret_cast(ndsHeader->NintendoLogo), 0x9C).toHex()); - ui->unpackerNintendoLogoCRCEdt->setText(QString::number(ndsHeader->NintendoLogoCRC,16)); - - ui->unpackerHeaderCRCEdt->setText(QString::number(ndsHeader->HeaderCRC16,16)); - ui->unpackerDebugRomAddrEdt->setText(QString::number(ndsHeader->DebugRomAddr,16)); - ui->unpackerDebugSizeEdt->setText(QString::number(ndsHeader->DebugSize,16)); - ui->unpackerDebugRamAddrEdt->setText(QString::number(ndsHeader->DebugRamAddr,16)); - - ui->unpackerFatFilesOriginalAddrEdt->setText(QString::number((ndsHeader->IconTitleAddr+IconTitleSize),16)); + auto* headerDataModel = new NDSHeaderModel(ndsHeader); + ui->unpackerHeaderDataTable->setModel(headerDataModel); + ui->unpackerHeaderDataTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeMode::ResizeToContents); + ui->unpackerHeaderDataTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeMode::Stretch); } void MainWindow::enableExtractionButtons() { ui->unpackerExtractorGbx->setEnabled(true); ui->unpackerExtraGbx->setEnabled(true); - if (ui->unpackerARM9OverlayAddrEdt->text().toUInt(nullptr, 16) == 0){ + if (ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::ARM9OverlayAddress, 1).data().toString().toUInt(nullptr,16) == 0){ ui->unpackerDumpArm9OverlayBtn->setEnabled(false); ui->unpackerDumpArm9OverlayFilesBtn->setEnabled(false); } - if (ui->unpackerARM7OverlayAddrEdt->text().toUInt(nullptr, 16) == 0){ + if (ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::ARM7OverlayAddress, 1).data().toString().toUInt(nullptr,16) == 0){ ui->unpackerDumpArm7OverlayBtn->setEnabled(false); ui->unpackerDumpArm7OverlayFilesBtn->setEnabled(false); } @@ -90,18 +43,18 @@ bool MainWindow::dumpHeader(const std::string& dirPath) ui->loadedRomPath->text().toStdString(), dirPath, 0, - ui->unpackerHeaderSizeEdt->text().toUInt(nullptr, 16)); + ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::HeaderSize, 1).data().toString().toUInt(nullptr,16)); } bool MainWindow::dumpArm9Bin(const std::string& dirPath, bool dumpExtraBytes) { - uint32_t size = ui->unpackerARM9SizeEdt->text().toUInt(nullptr, 16); + uint32_t size = ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::ARM9Size, 1).data().toString().toUInt(nullptr,16); if (dumpExtraBytes) size += 12; return ndsFactory.dumpDataFromFile( ui->loadedRomPath->text().toStdString(), dirPath, - ui->unpackerARM9RomAddrEdt->text().toUInt(nullptr, 16), + ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::ARM9RomAddress, 1).data().toString().toUInt(nullptr,16), size); } @@ -110,8 +63,8 @@ bool MainWindow::dumpArm7Bin(const std::string& dirPath) return ndsFactory.dumpDataFromFile( ui->loadedRomPath->text().toStdString(), dirPath, - ui->unpackerARM7RomAddrEdt->text().toUInt(nullptr, 16), - ui->unpackerARM7SizeEdt->text().toUInt(nullptr, 16)); + ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::ARM7RomAddress, 1).data().toString().toUInt(nullptr,16), + ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::ARM7Size, 1).data().toString().toUInt(nullptr,16)); } bool MainWindow::dumpFnt(const std::string& dirPath) @@ -119,8 +72,8 @@ bool MainWindow::dumpFnt(const std::string& dirPath) return ndsFactory.dumpDataFromFile( ui->loadedRomPath->text().toStdString(), dirPath, - ui->unpackerFilenameTableAddrEdt->text().toUInt(nullptr, 16), - ui->unpackerFilenameTableSizeEdt->text().toUInt(nullptr, 16)); + ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::FilenameTableAddress, 1).data().toString().toUInt(nullptr,16), + ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::FilenameTableSize, 1).data().toString().toUInt(nullptr,16)); } bool MainWindow::dumpFat(const std::string& dirPath) @@ -128,8 +81,8 @@ bool MainWindow::dumpFat(const std::string& dirPath) return ndsFactory.dumpDataFromFile( ui->loadedRomPath->text().toStdString(), dirPath, - ui->unpackerFATAddrEdt->text().toUInt(nullptr, 16), - ui->unpackerFATSizeEdt->text().toUInt(nullptr, 16)); + ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::FATAddress, 1).data().toString().toUInt(nullptr,16), + ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::FATSize, 1).data().toString().toUInt(nullptr,16)); } bool MainWindow::dumpArm9Overlay(const std::string& dirPath) @@ -137,8 +90,8 @@ bool MainWindow::dumpArm9Overlay(const std::string& dirPath) return ndsFactory.dumpDataFromFile( ui->loadedRomPath->text().toStdString(), dirPath, - ui->unpackerARM9OverlayAddrEdt->text().toUInt(nullptr, 16), - ui->unpackerARM9OverlaySizeEdt->text().toUInt(nullptr, 16)); + ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::ARM9OverlayAddress, 1).data().toString().toUInt(nullptr,16), + ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::ARM9OverlaySize, 1).data().toString().toUInt(nullptr,16)); } bool MainWindow::dumpArm9OverlayFiles(const std::string& dirPath) @@ -151,8 +104,8 @@ bool MainWindow::dumpArm7Overlay(const std::string& dirPath) return ndsFactory.dumpDataFromFile( ui->loadedRomPath->text().toStdString(), dirPath, - ui->unpackerARM7OverlayAddrEdt->text().toUInt(nullptr, 16), - ui->unpackerARM7OverlaySizeEdt->text().toUInt(nullptr, 16)); + ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::ARM7OverlayAddress, 1).data().toString().toUInt(nullptr,16), + ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::ARM7OverlaySize, 1).data().toString().toUInt(nullptr,16)); } bool MainWindow::dumpArm7OverlayFiles(const std::string& dirPath) @@ -165,14 +118,14 @@ bool MainWindow::dumpIconTitle(const std::string& dirPath) return ndsFactory.dumpDataFromFile( ui->loadedRomPath->text().toStdString(), dirPath, - ui->unpackerIconTitleEdt->text().toUInt(nullptr, 16), + ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::IconTitleAddress, 1).data().toString().toUInt(nullptr,16), 0xA00); } bool MainWindow::dumpFatFiles(const std::string& dirPath) { - uint32_t startAddr = ui->unpackerIconTitleEdt->text().toUInt(nullptr, 16) + IconTitleSize; - uint32_t size = ui->unpackerUsedRomSizeEdt->text().toUInt(nullptr, 16) - startAddr; + uint32_t startAddr = ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::IconTitleAddress, 1).data().toString().toUInt(nullptr,16) + IconTitleSize ; + uint32_t size = ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::UsedRomSize, 1).data().toString().toUInt(nullptr,16) - startAddr; return ndsFactory.dumpDataFromFile( ui->loadedRomPath->text().toStdString(), @@ -184,7 +137,6 @@ bool MainWindow::dumpFatFiles(const std::string& dirPath) bool MainWindow::dumpEverything(QString dirPath) { - if(!dumpHeader(QDir::toNativeSeparators(dirPath+"/header.bin").toStdString())) return false; if(!dumpArm9Bin(QDir::toNativeSeparators(dirPath+"/arm9.bin").toStdString(), true)) @@ -195,13 +147,13 @@ bool MainWindow::dumpEverything(QString dirPath) return false; if(!dumpFat(QDir::toNativeSeparators(dirPath+"/fat.bin").toStdString())) return false; - if(ui->unpackerARM9OverlayAddrEdt->text().toUInt(nullptr, 16) != 0) { + if(ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::ARM9OverlayAddress, 1).data().toString().toUInt(nullptr,16) != 0) { if(!dumpArm9Overlay(QDir::toNativeSeparators(dirPath+"/a9ovr.bin").toStdString())) return false; if(!dumpArm9OverlayFiles(QDir::toNativeSeparators(dirPath+"/a9ovr_data.bin").toStdString())) return false; } - if(ui->unpackerARM7OverlayAddrEdt->text().toUInt(nullptr, 16) != 0) { + if(ui->unpackerHeaderDataTable->model()->index(NDSHeaderNames::ARM7OverlayAddress, 1).data().toString().toUInt(nullptr,16) != 0) { if(!dumpArm7Overlay(QDir::toNativeSeparators(dirPath+"/a7ovr.bin").toStdString())) return false; if(!dumpArm7OverlayFiles(QDir::toNativeSeparators(dirPath+"/a7ovr_data.bin").toStdString())) diff --git a/ui/tabs/unpacker/unpackertabsignals.cpp b/ui/tabs/unpacker/unpackertabsignals.cpp index c1698f1..13b3e8e 100644 --- a/ui/tabs/unpacker/unpackertabsignals.cpp +++ b/ui/tabs/unpacker/unpackertabsignals.cpp @@ -7,7 +7,6 @@ void MainWindow::on_loadRomBtn_clicked() { - std::vector romHeader; NDSHeader *pNDSHeader; QString romPath = QFileDialog::getOpenFileName(