From a0812dc10f11ae35e1bce694de8bc38003b123a0 Mon Sep 17 00:00:00 2001 From: thrust26 Date: Wed, 23 Dec 2020 23:07:00 +0100 Subject: [PATCH] added file browser to GameInfoDialog export code cleanup updated docs --- docs/graphics/options_gameinfo_cartridge.png | Bin 3454 -> 3456 bytes docs/graphics/options_gameinfo_console.png | Bin 2801 -> 2804 bytes docs/graphics/options_gameinfo_controller.png | Bin 4494 -> 4496 bytes docs/graphics/options_gameinfo_emulation.png | Bin 3630 -> 3632 bytes docs/graphics/options_gameinfo_highscores.png | Bin 3565 -> 3567 bytes docs/index.html | 2 +- src/debugger/gui/DataGridOpsWidget.cxx | 2 +- src/debugger/gui/DebuggerDialog.cxx | 2 + src/emucore/FSNode.cxx | 1 - src/gui/BrowserDialog.cxx | 133 +++++++----------- src/gui/BrowserDialog.hxx | 4 +- src/gui/GameInfoDialog.cxx | 37 ++++- src/gui/GameInfoDialog.hxx | 7 +- src/gui/RomAuditDialog.cxx | 2 + src/gui/SnapshotDialog.cxx | 2 + src/gui/UIDialog.cxx | 2 + 16 files changed, 99 insertions(+), 95 deletions(-) diff --git a/docs/graphics/options_gameinfo_cartridge.png b/docs/graphics/options_gameinfo_cartridge.png index da6f4fdc4409cf8582a8356dc9d02f4c6b16dc32..772f1334bec9d0d080a8d7f05832b8b5c70cf179 100644 GIT binary patch delta 389 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 delta 2451 zcmZ8iX;hO}8jgY!XwXlqNEyn=Y5vDqApZV4JR>S zux-putyhZ!V6d;S4#&{$c+LXdC+)uZt{&r^37cw#FX_F5;FDTJKy5; z8jZl^bYdQ@X!Ga31@Sw3lnUTK014pBC!IQZm)6MOfzKBQLJJ1ll((;0hX_u6B6F$71TL0dD71{$3{DC}`@%D>?OCVEwZ zc?!3A>OO#P%PUm1=g+KU9qb1e|1crs{5;R|-UYF%c8t`<1=L|p7BX%+wWA`GcFKF0 z&oWJWVEIdbuv?-d**%))$6?|Txo|Jj-{E&}P;*B3vwXzW#ion4l5m3RK9X+{>e=Hx zfb`wM{&{yWo7RPy+rttTtSNKRa}+TAgYS>i+!yfl;Jehbd3-{uOqg)8$wMvW1GQDS z-A;F(#-y|r4E-Zh*~K#Y30yc4{fJFA6k%$&^zUUCHD@FGea&vB7;e1qg-_d^9xSJH1ffOpE%5;vUPPD{9rDfEoN9i=Z1@kPr%`@!J zrNDnQSkkCb|5b-Q;0QVt?*Vs1^HQ7?h4?Hn(r1mq{_U4qfnZKAHu@0w(nu)atB)~~ zxRWB0hfd-Z?qp5lwV3Bmnio~TV?84Iog~Fyt9aM-T!(d&mlK%@qdR!$NN!3E-6O0@y& zYruG@o@MQcG8unOx9O^DC~vY4dtBSG#R!aNpKrdcM5~JdVMFD=dyrq zNlI8;DQ}3x`)tKCw&2IN&TjgTv%kETZlbD2f-N;P$wbVNr7YR3Mk-fII}{>VE;Fp~ z>=0y@M9hTDXVb3g^RbVP@W}*ZE11_ri1-@&JnVHv&r{^ve}`ooZI>#wFQ;znR`ED4z7lNxar=+ov9GY_jmKFR!H`H94IW({*`zd{E%(jhW6%mELAyJ!5z9ISYlFu{}rgm+1=!z?ExI%Mf@{SRk3xyQlxHqH7hs z{4lwffVRGD@o`meKGb5N=&u(fAHt4midY{KPBy4B^=;1@ghh5JFo#Au{h)VVXWoKd1C$$v$ya|P;QJ(Y#*To9~Y(F4O!|8U?un zV;Gd#6BQ)UoH^DKWEsz8^N?w}d+{&V4P*SRv3Y#n#sSx$bsNS+USQDmK243LW1p%h zCCxvu6-#M?w!@nKX~;xlU*fF`1BEm&*+OC0e81KKkXFfZLg)k)Qtr_eDXpmAk>{68 z4Vv|n@Q^KyuHz63bM2*2qcC2DX*%+#`=O59z$Q*0)KD2P)uastEKnX8kJ)Ca(dIh< z=-bP3N*U0bDp2Dg2ML!hH1E9AcxjO2SA>dt6-{3IUwW`@RX1R%*c>k3G9g85)KB20 zpI7->CF;mT-0q1ui*y}Tjr1Ospp9(@7DxoY$rauBFW>av9Px&k(wXkAdXV%Xi*h^P zddUETh0uP0*X^y*$x5m_dCOp8&5Zq@EiB&PCK5YK*TG`Gg`}XNDfB z=a^{dEz9$qW#$X7n&*mLP3;JURfv+U4tMik@)Y0h diff --git a/docs/graphics/options_gameinfo_controller.png b/docs/graphics/options_gameinfo_controller.png index 6b8740424429ef7e86ba52c72c8694754293d8cb..63b5548a3f776df9c2c73d0de8bc05c365f08d5d 100644 GIT binary patch delta 2814 zcmYk7c{r4N8^=X8Y4nUvWyq5yB}-+bnBfev)QN~vRJL&lCB}>`+ml8fB^f5!M`Mp{ zWy{XkWjQ6=&@qGzO4iphH{(z3=bm_gsc5LnQ+Be0)Itjze+= z5Bd0nd69uQD8V`A8TDaulpg;xyCaIQ4kM}o}(rWAcd-@Em`n;GS)-y4N_e(6ZRx#4(3ezz;J^wrU;N`e{ z?j|?A$-Cmg>ke=6JGmJbLi5ptW)($Zfh?6sJf2n$U2UNhTs}Xc* zneIVa-g85l^h#tmNMvXGM*9*5jXHzY5$1$gsH|MZx=YK<37IJHY!LY(z7#F@?!FQS zeNSorsnUG=&{>D=$y*m>x1%8953IJ0vE%Wp+53ST^*eq8x)~tn+*;|{o+a=Lg#N}# zX~`iiCNt+%qLtZFU@(O!+8#^v5rS`c%ZwNM74gi#qFybz-thYg0RtY0NPkQGWn)F_ zk6AtU)r17W(F3L_TJ?@C5vtOfn3@ z*+&6}YBagq5Sn2psh;&VsU9xk?EvRaOiHSko(JVNLu( z0)prcVFxay;x@-p?6%_pRlN$4h8u91HSrU)GDY;8Yn1F4FvNF?=AdbyulT1q!_M*g zAL@NVG2-rJ?}yElgfC8)Rar=vN2K_&KR!T-A?eWH3F)XO++z+xU+=KO>;j%oBJYrX z$CgK0#45Ar8bFKBV+^%ibH~f{ipLaU3n>frNdd^_?P>K9`Tup*?@)ill&ttx!--UH zkO-WWUNSjihuUP3iYDjymkW@HC6gz3?Jj$iYu#SYV0xOO;t_ z8dwh8$RB8tPA zT@v+O&VF(Vqq~7Xz4RrozPm!Eu=_ec&aVL7A@OmIIrE1s&l6i}Y`i`_X;Tw8b<>Y1 zL%~)rWd0bkFm3-NXW9^Sp&trOKN4FclA=*nE75O4uP4&yCo>B>eEMmN)0wK9U28B# z$AIiwB&p$Y&M;N3T^=!8vK!Z@`LWX1&*|LQ$iCEelF1XO8=9)w(yux#9@{NfC}Y_7 zcCLOOu6xghETHQrm488-dXZ`>2q)j_Dn>Wdef4?7ZTaAT#wpNL0?fQPcDipPFGzz>a3I{)IP0mJ)6xcq0p6@zUO$p zEwsEy#Bx^cX3TNZ??^r#n@j=ho2W%C>?P>MXUUr7?gbW8le^4eM7e`o_}Hd~G}vzy z;JBHthP}4psNr2FG9?NyPL5EQt-WWi?JIdqG0>4rAH()%a`N77(su4vfhxq07W`x` z8@kU4g;Iu7xjYjubn^WgQMe?{+T)G2NB&Kv#E6+qcPPs#c{3?$y|0>{?60#8tY00e z#E0}J%#awJ4v~3bAQS(B?!`2SlVlPiuBke2CI3M*K3G6DKiJvyw#Sz<`TfpOOcq{Y zoV8NA4skV*Wo{!QnG0eL8E%n#MUzTDWG;yrQuyI@)=I4IA%x5L$PxqW4pV7lC@ls= z=@y6U<^-G|oE=t6%F{?)c=@2w)tG$}uHb$$N8COk1P7*W`l&HAdcrU^QKaO{eM#d5 z1na`L1xTD(pun=Nmw%004*JWL32fRYl}Rl0CfVF2ljJ>(b6G;&FFgS-Ej%5byXahH z3%cwY_)s_ApZA}lIA+L$#=XW~@f5{CK0EA?cOh(>r#Ts)aSD|=eVSe1VO^*brp$8f zB!0VDsA})*#~$)A%z*~1T0Mr30*aG|)}I-<7o4Kx?h2I2Mth$HbFkEpuLr_19W|km zYTt=KLO_)i9sxhTRVSU4!dv-TK-t!9Did!e{;K*QEOY$VKer|N#39`?$s${_e^3mu zw^ly3@Kid^T&T6u?pKDSCHU{X{3`LvkyEO56(;s$y0zC*Bowxb{BtXj;Fs@HP($z2 zSHIo?zVKSNWUi}))M>yS_1#ARh(NOhqbZ}lQH5( zW(`8{wTzyQ_hQtW4UExi(m#~pCVNcBLKOcR)A2*#Q_5jBwL$DoG`Xw>mjEp^X*IG> z<)IxHpu~{@ce%%Z3Gtrmk3nGk0nN*QUEYOZWDLnJ&U|2!v_aiQ7mG(H?kLo0#iCUA z#Rp=vO?EG(v=L2i0vst|IeXMDVLsN4P8r@MCEFlDP-M0a!o@>06dSCD+uTv+S|x}d zC&=L87c9%jrq2;gZZe83>r*cIhtJG1Ei0RN5IsjUh$%m6du1HL_AAaBOf!uNSPoa* z=cR7~u7mfS&iho=o@MU`N`|tIVAbyaz`f|&C`PaQyY}FMUz5QfmE969<5Gb3--!Xc zg`ZNpbV0P0tqGp?w6e;(j(=&O66c*TmWEMAK;PS=n=376tJ#bOMjMA@ zL@q-ibn7-^E_t*tIwxIUQZ!aoh%K@jBSbOfp5K6`Hq-gFr@{-lswH}dq}a9{J>RQi zeYnjICbyR-sQFdb<+-qH17gKkn z4QICMOStA=gg;n}K0R58H`@hTG84x}rf<-7XC!MGsy3Wd?7?9zJy*t%mPG{GZ4l|h zHFQGEFFl&+Y$kW-Bit=~B=wgb4ThaLF s(*N8TbyND6+qO|y?WiNM)?_YI(~cpxmRyRt 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 diff --git a/docs/graphics/options_gameinfo_emulation.png b/docs/graphics/options_gameinfo_emulation.png index 8da3b8c42aeaea886f842f82b68aa9a2f21f044c..b67ca95f7561b2b22a036d3bff944dfa8f057578 100644 GIT binary patch delta 3256 zcmZWrc{J4PA0}yT=sVIvHP&lxrAW4BXk-_%XejWFL?S{)8`k!kL1{G91iT*TqCygfuI5gsp4(t&t?*BGt}4rbnnH?)3r5|SJ_rmosd z~?A(B~#Hw5Oq+-CiskX*Ill3)| z_X20j;2^J$gpG%hwYzo`#Gq=0{_AM1$GscgX#n5Cc{Fu>3K|M|+SP)rhGdwsr;| zJw~*{xh!b;y4+~sYq~Z=`@X+8n=nE#c*TNv?pq5LqJA+DR?no<4(;& zmitLlL#>lRr+lk(kBEYL3ApY_@rN;!0(1_fJpH|3-trJD`Zn-euOiT$lIurOY9ZnU zfqvDj9s$iUnXtWzxczJ6(@urG&4FPnBeDa83r6@f#<3hK82h9Zt2lGH6fCl zpq9iG64l*KxDly$v*!>DyhP|SF-=Lh(kSJ z569LYXRNlLK{eGQxpp{au*62a1D*$ckScaW=#43xAqKd7qb|&kd+*tD**PNyGTyuA-HlbeUoD+hg*2aWQEOF{++eT=7%uD&hC2hgCJ5Z6v6y-R*l0qE`OyqzN2C<`TAK`6S^uakIUw?KKX@-_Jx^TL|6WQ? z_>l9-V3NwSR-W?^o51k`Ev9R;h35|-ks{_xsfg<+f?Vm^wi@T7tcxeN>c5SZAA?i zHw~b;EY6H1xJ1@5)jv+(ShpC{e7p8vI{Z~+Lg8YuRuz~b3qROL$ErQ?LVvHIPL#*F z*a2bC;CS-c8~FV`aXOZ6Pqvn#s_63N3(-ni5l3da`qMEMknk5RSv_B>+w}*3oMXtB z^DEMb46SEb(ASra9l|6Zl!;!7>JCHQUhpbgO0Flj@@@jt#k$rRsuds|!BarQ8#DtgYt|AX{b0mW zlyFHQ$slSeBg%c| zSKDOne5>_nRa)m{)iC7*3QiSFySWc>Dj~jap&A)a?A zuq}~SaqZ&h_H@&wkMd$~2TGVlILYD+E;lnx-Zev*Ub1^rG^3R_Cpl<%0aVa3K;LP{ zE=~JVJ7~{G`FM-eZ2+*n+dZSoW%(lc`JgS8Wa_tm$?h|*Q<7^HIC<(HVEv|z`?rJ+ z_73aL`!+_yiQjm%Rv{Fkf?X@*FwxXx#BVqL>yi)KJ`z9#57v{Q3lcYy#Ci-PEy z{AHy-Jyp4Ra%tsw#v!=gO<-mk9XvPvf}%2a^>Ve9mxOdmB;KB`gi_6EINdVok#J7D zPdc(8f-pFZfja_PKU&D(PPD34sdFNe(9zIQ&zh&BSy`UWr+PvW6Q_0G(G*5u#1`qp z6B7ZbYEKPaDg3P`hUm=LzLaQg#Arlh{0@^#vTZD3v$&TH;+19-w5gFKWV^)589Bd! z$iJDE@JIxVzy8<|szt$WieBpQSbl8?JjkB1LQlOax_5bQ)pf9HGRVu)q6V@C(e022 z)DxG?qwi}DK4E5Y`EOHC)pBr62zs?-f$ntSN}9|p#|PZhNRf1C_2c~t^B+ctF^F4!9!8d-PnMO>1vZO5Id}f*5l~Dy(#|E<+1Afb|>bsnZHN7wPvIj-VRoMgJI^TeB#df%mvQJ6OLsJ;b*2R?N9hL z(O6eDw#SP=Ecqikj;7C_Fbfu92z<5foB*7h@!{imI!0;yM+!T$fpq&k+aL1aMfTC|T*+3}VL9 zf8=N+6Hen?xep*1mA_Kv&-H&4Xv{}8dVv2Q6cQ5!$6tDCsjmEPWdHs<5I3va=ZSwj z^-OO34Z3kQfgY3Heo_ohA{_W9seYce>36SExul_;qi$xKL9bc%?nTToAW@n&ei78MGB?&V_G?>zfAQ?HLvHHg$RNwBxEmkJDyn4n;3 z*$$uM31&w_sE1_R)Ae^9$Q#NFk|*wDRFRba(!gwZwce*`n?%@vVXs$A$qXvJnU1Bc#N>&L^}oGbU<613c!Jq>@Z|F z@8w4o^5I4bh4>WPwI#eWI#q*zmQ$ArtUd6{1?6{IV@Pb>Pkf;NMJhA09}?Uw WU&}ej#rcuI&M`B#GNKqbh5ZMxDPINv delta 3254 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 OE)!$Za}+~|C;tZ9-uZQQiXqJ zt1K%TF@*T0?EdPf?5}d)G^@q$Q1#cihO6)ey!eA0Yl_eCN)_>S;XB4hk2b;Y6W&;Z zFI-sxv#a_)Oo0>8gHCtwa=WOWU1 z()LBkf9eZR8$C0*w#V;k@jI2AIjU-W-ATmw9fmIt#irlhi}0_r@U>04dVI#1asCN@ z#`(MM`X2oHwl7+r!&i;B0^d|!XZ7(r-1+4Z-(>x&o?lluw0>8Cug|O)zG*->e%SUE zJ`-=)#`sm|{h-O$w|&`(xt?G3-@WV6ap$*QS!UAd@A|qe{>;lB>-@IoXTf#P<`=yz zm*xD|{Dhwt-SH7V;S>J;@E44c&&#swasF0C_|UKj9~u_nL&Itwzh!-V{2vvaXk~P{ Rvbg{N002ovPDHLkV1i0+$t(Z> delta 369 zcmV-%0gnFf8|@pAa1Ox$01m+cxRGn^000eJv3?p1e^*1s;v{GdSK;@Jb^Wztslq?A zRhHF^7(#qgc7OF#_E))Yn$^SaQ1#bo4Oig{c<~20(iETJRVw1^!gq|19&3W%Cw#F6 zUpTS?W>@uzc*lh2SRY65rCZ7by+}E}^g)x@2p?}{7`|#N0>)Oo0>8gHCtwa=WOWTM zYWt#WfAs~Zjh>l&TjO`N_?=45991>G?j&OT4#$@VW7F^NCHU7__}U^}Jw9X1IR6Ac z>-=4JeFuJh+ZS!m;j6}5fp03Vv-8Cug|O)zG*-y{IKmS ze6~G))pAllow all 4 directions ...Allow all 4 joystick directions to be pressed simultaneously-joyallow4 Use modifier key combosEnable using modifier keys in keyboard actions-modcombo Swap Stelladaptor portsSwap the order of the detected Stelladaptors/2600-daptors (see Advanced Configuration - Stelladaptor/2600-daptor Support)-saport - Joystick databaseShow all joysticks that Stella knows about, with the option to remove them  + Joystick DatabaseShow all joysticks that Stella knows about, with the option to remove them  Erase EEPROMErase the whole AtariVox/SaveKey flash memory  AtariVox serial portDescribed in further detail in Advanced Configuration - AtariVox/SaveKey Support -avoxport diff --git a/src/debugger/gui/DataGridOpsWidget.cxx b/src/debugger/gui/DataGridOpsWidget.cxx index 2a62ec60c..e4bf5d247 100644 --- a/src/debugger/gui/DataGridOpsWidget.cxx +++ b/src/debugger/gui/DataGridOpsWidget.cxx @@ -34,7 +34,7 @@ DataGridOpsWidget::DataGridOpsWidget(GuiObject* boss, const GUI::Font& font, _zeroButton = new ButtonWidget(boss, font, xpos, ypos, bwidth, bheight, "0", kDGZeroCmd); _zeroButton->setToolTip("Zero currently selected value"); - + ypos += bheight + space; _invButton = new ButtonWidget(boss, font, xpos, ypos, bwidth, bheight, "Inv", kDGInvertCmd); diff --git a/src/debugger/gui/DebuggerDialog.cxx b/src/debugger/gui/DebuggerDialog.cxx index 87481234c..8abf382d4 100644 --- a/src/debugger/gui/DebuggerDialog.cxx +++ b/src/debugger/gui/DebuggerDialog.cxx @@ -489,6 +489,8 @@ void DebuggerDialog::createBrowser(const string& title) { uInt32 w = 0, h = 0; getDynamicBounds(w, h); + if(w > uInt32(_font.getMaxCharWidth() * 80)) + w = _font.getMaxCharWidth() * 80; // Create file browser dialog if(!myBrowser || uInt32(myBrowser->getWidth()) != w || diff --git a/src/emucore/FSNode.cxx b/src/emucore/FSNode.cxx index d9de7e0a5..212828379 100644 --- a/src/emucore/FSNode.cxx +++ b/src/emucore/FSNode.cxx @@ -59,7 +59,6 @@ FilesystemNode& FilesystemNode::operator/=(const string& path) } return *this; -#undef PATH_SEPARATOR } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/gui/BrowserDialog.cxx b/src/gui/BrowserDialog.cxx index 25b35aee1..3b1ee48a7 100644 --- a/src/gui/BrowserDialog.cxx +++ b/src/gui/BrowserDialog.cxx @@ -81,14 +81,19 @@ BrowserDialog::BrowserDialog(GuiObject* boss, const GUI::Font& font, buttonWidth, buttonHeight, "Go up", kGoUpCmd); addFocusWidget(_goUpButton); - _basedirButton = - new ButtonWidget(this, font, _goUpButton->getRight() + BUTTON_GAP, _h - buttonHeight - VBORDER, - buttonWidth, buttonHeight, "Base Dir", kBaseDirCmd); - addFocusWidget(_basedirButton); + b = new ButtonWidget(this, font, _goUpButton->getRight() + BUTTON_GAP, _h - buttonHeight - VBORDER, + buttonWidth, buttonHeight, "Base Dir", kBaseDirCmd); + b->setToolTip("Go to Stella's base directory."); + addFocusWidget(b); + + b = new ButtonWidget(this, font, b->getRight() + BUTTON_GAP, _h - buttonHeight - VBORDER, + buttonWidth, buttonHeight, "Home Dir", kHomeDirCmd); + b->setToolTip("Go to user's home directory."); + addFocusWidget(b); #ifndef BSPF_MACOS b = new ButtonWidget(this, font, _w - (2 * buttonWidth + BUTTON_GAP + HBORDER), _h - buttonHeight - VBORDER, - buttonWidth, buttonHeight, "Choose", kChooseCmd); + buttonWidth, buttonHeight, "OK", kChooseCmd); addFocusWidget(b); addOKWidget(b); b = new ButtonWidget(this, font, _w - (buttonWidth + HBORDER), _h - buttonHeight - VBORDER, @@ -101,7 +106,7 @@ BrowserDialog::BrowserDialog(GuiObject* boss, const GUI::Font& font, addFocusWidget(b); addCancelWidget(b); b = new ButtonWidget(this, font, _w - (buttonWidth + HBORDER), _h - buttonHeight - VBORDER, - buttonWidth, buttonHeight, "Choose", kChooseCmd); + buttonWidth, buttonHeight, "OK", kChooseCmd); addFocusWidget(b); addOKWidget(b); #endif @@ -115,7 +120,9 @@ void BrowserDialog::show(const string& startpath, _mode = mode; _cmd = cmd; _cancelCmd = cancelCmd; - string fileName; + string directory;// = EmptyString; + string fileName;// = EmptyString; + bool fileSelected = true; // Set start path if(_mode != Directories) @@ -123,13 +130,7 @@ void BrowserDialog::show(const string& startpath, // split startpath into path and filename FilesystemNode fs = FilesystemNode(startpath); fileName = fs.getName(); - string directory = fs.isDirectory() ? "" : fs.getParent().getPath(); - - _fileList->setDirectory(FilesystemNode(directory), fileName); - } - else - { - _fileList->setDirectory(FilesystemNode(startpath)); + directory = fs.isDirectory() ? "" : fs.getParent().getPath(); } switch(_mode) @@ -144,7 +145,6 @@ void BrowserDialog::show(const string& startpath, _selected->clearFlags(Widget::FLAG_INVISIBLE); _type->clearFlags(Widget::FLAG_INVISIBLE); _okWidget->setLabel("Load"); - updateUI(true); break; case FileSave: @@ -158,7 +158,7 @@ void BrowserDialog::show(const string& startpath, _type->clearFlags(Widget::FLAG_INVISIBLE); _okWidget->setLabel("Save"); _selected->setText(fileName); - updateUI(false); + fileSelected = false; break; case Directories: @@ -168,11 +168,17 @@ void BrowserDialog::show(const string& startpath, _selected->setEnabled(false); _selected->setFlags(Widget::FLAG_INVISIBLE); _type->setFlags(Widget::FLAG_INVISIBLE); - _okWidget->setLabel("Choose"); - updateUI(true); + _okWidget->setLabel("OK"); break; } + // Set start path + if(_mode != Directories) + _fileList->setDirectory(FilesystemNode(directory), fileName); + else + _fileList->setDirectory(FilesystemNode(startpath)); + updateUI(fileSelected); + // Finally, open the dialog after it has been fully updated open(); } @@ -182,76 +188,15 @@ const FilesystemNode& BrowserDialog::getResult() const { if(_mode == FileLoad || _mode == FileSave) { - static FilesystemNode node(_fileList->currentDir().getShortPath() + _selected->getText()); + static FilesystemNode node; - return node; + return node + = FilesystemNode(_fileList->currentDir().getShortPath() + _selected->getText()); } else return _fileList->currentDir(); } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void BrowserDialog::updateUI(bool fileSelected) -{ - // Only hilite the 'up' button if there's a parent directory - _goUpButton->setEnabled(_fileList->currentDir().hasParent()); - - // Update the path display - _currentPath->setText(_fileList->currentDir().getShortPath()); - - // Enable/disable OK button based on current mode - //bool enable = true; - //switch(_mode) - //{ - // case Directories: - // enable = true; - // break; - - // case FileLoad: - // if(_fileList->selected().isDirectory()) - // { - // enable = false; - // _selected->setText(""); - // } - // else - // { - // enable = fileSelected && !_selected->getText().empty(); - // _selected->setText(_fileList->getSelectedString()); - // } - // break; - - // case FileSave: - // if(_fileList->selected().isDirectory()) - // { - // enable = false; - // _selected->setText(""); - // } - // else - // { - // enable = fileSelected && !_selected->getText().empty(); // TODO - // _selected->setText(_fileList->getSelectedString()); - // } - // break; - - // default: - // break; - //} - //_okWidget->setEnabled(enable); - - bool enable = _mode == Directories - || (!_fileList->selected().isDirectory() && fileSelected) - || (!_selected->getText().empty() && !fileSelected); - _okWidget->setEnabled(enable); - - if(fileSelected) - { - if(!_fileList->selected().isDirectory()) - _selected->setText(_fileList->getSelectedString()); - else - _selected->setText(""); - } -} - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void BrowserDialog::handleCommand(CommandSender* sender, int cmd, int data, int id) @@ -281,6 +226,10 @@ void BrowserDialog::handleCommand(CommandSender* sender, int cmd, _fileList->setDirectory(FilesystemNode(instance().baseDir())); break; + case kHomeDirCmd: + _fileList->setDirectory(FilesystemNode(instance().defaultSaveDir())); + break; + case EditableWidget::kChangedCmd: Dialog::handleCommand(sender, cmd, data, 0); updateUI(false); @@ -295,3 +244,23 @@ void BrowserDialog::handleCommand(CommandSender* sender, int cmd, break; } } + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void BrowserDialog::updateUI(bool fileSelected) +{ + // Only hilite the 'up' button if there's a parent directory + _goUpButton->setEnabled(_fileList->currentDir().hasParent()); + + // Update the path display + _currentPath->setText(_fileList->currentDir().getShortPath()); + + // Enable/disable OK button based on current mode and status + bool enable = true; + + if(_mode != Directories) + enable = !_selected->getText().empty(); + _okWidget->setEnabled(enable); + + if(fileSelected && !_fileList->selected().isDirectory()) + _selected->setText(_fileList->getSelectedString()); +} diff --git a/src/gui/BrowserDialog.hxx b/src/gui/BrowserDialog.hxx index 9ee401ad6..1038398c0 100644 --- a/src/gui/BrowserDialog.hxx +++ b/src/gui/BrowserDialog.hxx @@ -58,7 +58,8 @@ class BrowserDialog : public Dialog, public CommandSender enum { kChooseCmd = 'CHOS', kGoUpCmd = 'GOUP', - kBaseDirCmd = 'BADR' + kBaseDirCmd = 'BADR', + kHomeDirCmd = 'HODR' }; int _cmd{0}; @@ -69,7 +70,6 @@ class BrowserDialog : public Dialog, public CommandSender StaticTextWidget* _type{nullptr}; EditTextWidget* _selected{nullptr}; ButtonWidget* _goUpButton{nullptr}; - ButtonWidget* _basedirButton{nullptr}; BrowserDialog::ListMode _mode{Directories}; diff --git a/src/gui/GameInfoDialog.cxx b/src/gui/GameInfoDialog.cxx index 3700caf5f..fc2c08c47 100644 --- a/src/gui/GameInfoDialog.cxx +++ b/src/gui/GameInfoDialog.cxx @@ -29,6 +29,7 @@ #include "Paddles.hxx" #include "PopUpWidget.hxx" #include "PropsSet.hxx" +#include "BrowserDialog.hxx" #include "QuadTariDialog.hxx" #include "TabWidget.hxx" #include "TIAConstants.hxx" @@ -92,7 +93,7 @@ GameInfoDialog::GameInfoDialog( myTab->setActiveTab(0); // Add Defaults, OK and Cancel buttons - addDefaultsExtraOKCancelBGroup(wid, font, "Export", kExportPressed); + addDefaultsExtraOKCancelBGroup(wid, font, "Export" + ELLIPSIS, kExportPressed); _extraWidget->setToolTip("Export the current ROM's properties\n" "into the default directory."); addBGroupToFocusList(wid); @@ -660,12 +661,27 @@ void GameInfoDialog::addHighScoresTab() addToFocusList(wid, myTab, tabID); } - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GameInfoDialog::~GameInfoDialog() { } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GameInfoDialog::createBrowser(const string& title) +{ + uInt32 w = 0, h = 0; + getDynamicBounds(w, h); + if(w > uInt32(_font.getMaxCharWidth() * 80)) + w = _font.getMaxCharWidth() * 80; + + // Create file browser dialog + if(!myBrowser || uInt32(myBrowser->getWidth()) != w || + uInt32(myBrowser->getHeight()) != h) + myBrowser = make_unique(this, _font, w, h, title); + else + myBrowser->setTitle(title); +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void GameInfoDialog::loadConfig() { @@ -1350,16 +1366,14 @@ void GameInfoDialog::exportCurrentPropertiesToDisk() try { - FilesystemNode propfile = instance().defaultSaveDir(); - propfile /= myGameFile.getNameWithExt(".pro"); + FilesystemNode propfile(myBrowser->getResult().getShortPath()); propfile.write(out); - instance().frameBuffer().showTextMessage("Properties exported to " + - propfile.getShortPath()); + instance().frameBuffer().showTextMessage("ROM properties exported"); } catch(...) { - instance().frameBuffer().showTextMessage("Error exporting properties"); + instance().frameBuffer().showTextMessage("Error exporting ROM properties"); } } @@ -1379,6 +1393,15 @@ void GameInfoDialog::handleCommand(CommandSender* sender, int cmd, break; case kExportPressed: + // This dialog is resizable under certain conditions, so we need + // to re-create it as necessary + createBrowser("Export properties as"); + + myBrowser->show(instance().defaultSaveDir().getPath() + myGameFile.getNameWithExt(".pro"), + BrowserDialog::FileSave, kExportChosen); + break; + + case kExportChosen: exportCurrentPropertiesToDisk(); break; diff --git a/src/gui/GameInfoDialog.hxx b/src/gui/GameInfoDialog.hxx index c217bd689..d3af6775e 100644 --- a/src/gui/GameInfoDialog.hxx +++ b/src/gui/GameInfoDialog.hxx @@ -27,6 +27,7 @@ class RadioButtonGroup; class TabWidget; class SliderWidget; class QuadTariDialog; +class BrowserDialog; #include "Dialog.hxx" #include "Command.hxx" @@ -78,6 +79,7 @@ class GameInfoDialog : public Dialog, public CommandSender void setAddressVal(EditTextWidget* address, EditTextWidget* val, bool isBCD = true, bool zeroBased = false, uInt8 maxVal = 255); void exportCurrentPropertiesToDisk(); + void createBrowser(const string& title); private: TabWidget* myTab{nullptr}; @@ -168,6 +170,8 @@ class GameInfoDialog : public Dialog, public CommandSender StaticTextWidget* myHighScoreNotesLabel{nullptr}; EditTextWidget* myHighScoreNotes{nullptr}; + unique_ptr myBrowser; + enum { kVCenterChanged = 'Vcch', kPhosphorChanged = 'PPch', @@ -180,7 +184,8 @@ class GameInfoDialog : public Dialog, public CommandSender kHiScoresChanged = 'HSch', kPXCenterChanged = 'Pxch', kPYCenterChanged = 'Pych', - kExportPressed = 'GIsp' + kExportPressed = 'Expr', + kExportChosen = 'Exch' }; // Game properties for currently loaded ROM diff --git a/src/gui/RomAuditDialog.cxx b/src/gui/RomAuditDialog.cxx index 65b4d0c33..60b627f8d 100644 --- a/src/gui/RomAuditDialog.cxx +++ b/src/gui/RomAuditDialog.cxx @@ -223,6 +223,8 @@ void RomAuditDialog::createBrowser(const string& title) { uInt32 w = 0, h = 0; getDynamicBounds(w, h); + if(w > uInt32(_font.getMaxCharWidth() * 80)) + w = _font.getMaxCharWidth() * 80; // Create file browser dialog if(!myBrowser || uInt32(myBrowser->getWidth()) != w || diff --git a/src/gui/SnapshotDialog.cxx b/src/gui/SnapshotDialog.cxx index 80af8ec1d..c983c1d5b 100644 --- a/src/gui/SnapshotDialog.cxx +++ b/src/gui/SnapshotDialog.cxx @@ -183,6 +183,8 @@ void SnapshotDialog::createBrowser(const string& title) { uInt32 w = 0, h = 0; getDynamicBounds(w, h); + if(w > uInt32(_font.getMaxCharWidth() * 80)) + w = _font.getMaxCharWidth() * 80; // Create file browser dialog if(!myBrowser || uInt32(myBrowser->getWidth()) != w || diff --git a/src/gui/UIDialog.cxx b/src/gui/UIDialog.cxx index beb6f576d..6ba10d9f8 100644 --- a/src/gui/UIDialog.cxx +++ b/src/gui/UIDialog.cxx @@ -706,6 +706,8 @@ void UIDialog::createBrowser(const string& title) { uInt32 w = 0, h = 0; getDynamicBounds(w, h); + if(w > uInt32(_font.getMaxCharWidth() * 80)) + w = _font.getMaxCharWidth() * 80; // Create file browser dialog if(!myBrowser || uInt32(myBrowser->getWidth()) != w ||