From 66679ace2f4caffafda9c6af8fe3d2d780d73f89 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Sun, 31 Jul 2022 20:33:56 -0600 Subject: [PATCH] Add HangoverAvalonia --- Source/AppScaffolding/AppScaffolding.csproj | 6 - Source/AppScaffolding/LibationScaffolding.cs | 26 +-- Source/HangoverAvalonia/App.axaml | 12 ++ Source/HangoverAvalonia/App.axaml.cs | 29 ++++ Source/HangoverAvalonia/Assets/hangover.ico | Bin 0 -> 135757 bytes .../HangoverAvalonia/HangoverAvalonia.csproj | 74 +++++++++ Source/HangoverAvalonia/Program.cs | 24 +++ .../PublishProfiles/LinuxProfile.pubxml | 16 ++ .../PublishProfiles/MacOSProfile.pubxml | 16 ++ .../PublishProfiles/WindowsProfile.pubxml | 17 ++ Source/HangoverAvalonia/ViewLocator.cs | 30 ++++ .../ViewModels/MainWindowViewModel.cs | 150 ++++++++++++++++++ .../ViewModels/ViewModelBase.cs | 11 ++ .../HangoverAvalonia/Views/MainWindow.axaml | 75 +++++++++ .../Views/MainWindow.axaml.cs | 19 +++ Source/HangoverAvalonia/hangover.ico | Bin 0 -> 135757 bytes Source/LibationAvalonia/App.axaml.cs | 16 +- .../Dialogs/ImageDisplayDialog.axaml.cs | 2 +- .../Dialogs/SettingsDialog.axaml | 2 + .../Dialogs/SettingsDialog.axaml.cs | 2 + Source/LibationAvalonia/FormSaveExtension.cs | 2 +- Source/LibationAvalonia/Program.cs | 6 +- .../ViewModels/MainWindowViewModel.cs | 1 + .../Views/MainWindow/MainWindow.axaml | 2 +- 24 files changed, 503 insertions(+), 35 deletions(-) create mode 100644 Source/HangoverAvalonia/App.axaml create mode 100644 Source/HangoverAvalonia/App.axaml.cs create mode 100644 Source/HangoverAvalonia/Assets/hangover.ico create mode 100644 Source/HangoverAvalonia/HangoverAvalonia.csproj create mode 100644 Source/HangoverAvalonia/Program.cs create mode 100644 Source/HangoverAvalonia/Properties/PublishProfiles/LinuxProfile.pubxml create mode 100644 Source/HangoverAvalonia/Properties/PublishProfiles/MacOSProfile.pubxml create mode 100644 Source/HangoverAvalonia/Properties/PublishProfiles/WindowsProfile.pubxml create mode 100644 Source/HangoverAvalonia/ViewLocator.cs create mode 100644 Source/HangoverAvalonia/ViewModels/MainWindowViewModel.cs create mode 100644 Source/HangoverAvalonia/ViewModels/ViewModelBase.cs create mode 100644 Source/HangoverAvalonia/Views/MainWindow.axaml create mode 100644 Source/HangoverAvalonia/Views/MainWindow.axaml.cs create mode 100644 Source/HangoverAvalonia/hangover.ico diff --git a/Source/AppScaffolding/AppScaffolding.csproj b/Source/AppScaffolding/AppScaffolding.csproj index 9c1b8d7a..2dfce40e 100644 --- a/Source/AppScaffolding/AppScaffolding.csproj +++ b/Source/AppScaffolding/AppScaffolding.csproj @@ -11,12 +11,6 @@ - - - $(DefineConstants);WINDOWS - $(DefineConstants);LINUX - $(DefineConstants);MACOS - embedded diff --git a/Source/AppScaffolding/LibationScaffolding.cs b/Source/AppScaffolding/LibationScaffolding.cs index 56f6e781..3d6d0643 100644 --- a/Source/AppScaffolding/LibationScaffolding.cs +++ b/Source/AppScaffolding/LibationScaffolding.cs @@ -14,7 +14,6 @@ using Serilog; namespace AppScaffolding { - public enum ReleaseIdentifier { None, @@ -26,6 +25,16 @@ namespace AppScaffolding public static class LibationScaffolding { + public static readonly bool IsWindows; + public static readonly bool IsLinux; + public static readonly bool IsMacOs; + static LibationScaffolding() + { + IsWindows = OperatingSystem.IsWindows(); + IsLinux = OperatingSystem.IsLinux(); + IsMacOs = OperatingSystem.IsMacOS(); + } + public static ReleaseIdentifier ReleaseIdentifier { get; private set; } public static void SetReleaseIdentifier(ReleaseIdentifier releaseID) @@ -290,14 +299,11 @@ namespace AppScaffolding if (System.Diagnostics.Debugger.IsAttached) mode += " (Debugger attached)"; -#if MACOS - var os = "MacOS"; -#elif LINUX - var os = "Linux"; -#else - var os = "Windows"; -#endif - + string OS + = IsLinux ? "Linux" + : IsMacOs ? "MacOS" + : IsWindows ? "Windows" + : "UNKNOWN_OS"; // begin logging session with a form feed Log.Logger.Information("\r\n\f"); @@ -306,7 +312,7 @@ namespace AppScaffolding AppName = EntryAssembly.GetName().Name, Version = BuildVersion.ToString(), ReleaseIdentifier = ReleaseIdentifier, - OS = os, + OS = OS, Mode = mode, LogLevel_Verbose_Enabled = Log.Logger.IsVerboseEnabled(), LogLevel_Debug_Enabled = Log.Logger.IsDebugEnabled(), diff --git a/Source/HangoverAvalonia/App.axaml b/Source/HangoverAvalonia/App.axaml new file mode 100644 index 00000000..f4f24946 --- /dev/null +++ b/Source/HangoverAvalonia/App.axaml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/Source/HangoverAvalonia/App.axaml.cs b/Source/HangoverAvalonia/App.axaml.cs new file mode 100644 index 00000000..a64b8e22 --- /dev/null +++ b/Source/HangoverAvalonia/App.axaml.cs @@ -0,0 +1,29 @@ +using Avalonia; +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Markup.Xaml; +using HangoverAvalonia.ViewModels; +using HangoverAvalonia.Views; + +namespace HangoverAvalonia +{ + public partial class App : Application + { + public override void Initialize() + { + AvaloniaXamlLoader.Load(this); + } + + public override void OnFrameworkInitializationCompleted() + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + desktop.MainWindow = new MainWindow + { + DataContext = new MainWindowViewModel(), + }; + } + + base.OnFrameworkInitializationCompleted(); + } + } +} diff --git a/Source/HangoverAvalonia/Assets/hangover.ico b/Source/HangoverAvalonia/Assets/hangover.ico new file mode 100644 index 0000000000000000000000000000000000000000..c29a9b6a44f5f99083cd202d8f0b14e8e0c4a2b1 GIT binary patch literal 135757 zcmeF41y~f@-^Z6W5d##1G*D3xJCG1N5DTzSvAYA25UeY9acxBr6BQc;EG+C!OawtJ zI(Fah7k9jSxhklL`u>;a`7k>(XHNX;oXH~+DTq`>8X6)j^+bb}MWTTskw{PP<9YzL zU&1y^%a7|u)*{hFO_9jML%Lo-LA2H$2jGv#yPAqb;Z6#l)(cM;iL4hYh>WlWSs}&8 zbXbT)$oHiBN3z!cfPWH+LYlfmxv7CQ=#*m7s*BaGS9IqtSjmj&Vj0SOUhQtUm;v zKP}FDthoID?=AuO4P$^ZU<@b<7;{Ph#viWJpSl0DaqoND$GoI@vMdIT=Ab`t1&pza zz&zj%27}h1Dqx-H|KD8~9Lu=J_ObtSi;Igpx@F6j=yBu5rP$iqW;SftP;6>yDy~<#D9<1QwtS&;+c%N^WJqw4frGaPi{B8;*{S=>-ZD$Z~(= z@ztfOs;Z=G*RB~jj(q@Sv=U4QwLy+`KpN`M2rTsU^h{7uQOPP#Sy@?PZEY>VHu27# zJ2TImIg@$i%9V_B=gwv9-Mcq~{d22Utt3Kv)??wqg{k%H*O%0-TQ?K=%>pI9CIjrJ zzRLn{$T^v9Ra8`z3>h*+{PgM5G?baa@;i6#EP>o5#>U1H3kwTL-@bjt=<73Iym*oP z{Q2|5L4yW~v&#v2?gAXoe9vu3WkDU1nxx)Mv^MLf*RIv*mL;&`(K8*HTd7hdNm^Q3AhsEULZAp>-=BTM~{^~#kEBHh>QKezEGK!`tc=FCY%o*qCK znsLf6$+# zJ$UfoDvnH=k z-{1dLXlUpooKxLBdGh2#$S4Nq)rl=zwiIXYe^F+>jz3tw?D!+MzLPy2>iyO6SAzx( z{xkksw{9KBUng*^C$Iozvgi9P>o}hFOxwyn{$w9Zo1{JPJefYiSkW3(1wTCg%wA9A zDb$5_&hhq7AAe`BgM9tZlK|`_+h3TP1fydKB9v~5NL1`Ccq|gBkuZ_;&mC)@!{V`8 zSh2@y*vn&hEc0MqS$Rs3ceX!Xr?3Pb;L~*qY>;24fI#GbatX*KAeVq#0&)q+CGguy z07Dv%y$R1Zd0xVE0-g^OUNwUj%V^J~GUAC=k8_&6U{g3Ayr9f%G z>$JR{sw1TWmgPVhz;jNX1MxhC*AAHnAO%WMK=3;JeVXwy7* zZw6RjFR&i4oe}Bj>GyFT`xWkee86)ADY#dkj{6cBxc89hQx+@1Xh2`80dxRm zKz@3xKp9GaI%m9U1gI0X`vmSEy})w|X?l8k-_+LJ$VE#_OM?4a>5m>gib7eZ0Oc?S zFlJN)^bK9WSiyKp|HxCDKz?jH^QMne{_fyFOiauZ=qV$&_Zf53-Y=!$y+Pbh%ZQDQ zeTuSA0Dmw7j0F8bTR{IP0rE@+$V+HD<=heQ+TB@PPfgI&)XY)ew25}@+DS%^94UdH zi}9S0c;m*6V)(mw&6+i0JZB`vvq0i*-MVGnn^aO#`f8rq+S-x>2M#2o4z!0e;2fZT zFm^fvW5D>3>w7?u`Dg!_2Vh^U2W-LOjEsycXiGW{_-sAZ)zu}vdi9b71O$lj%vJ`D zNe5|PAQjt5iopB#?^E&oPsZTEgT-HxFJ-i7(IRnRU|?G5(xoM2>(;HY$YU+&0Lp+I zubY3i(bA1Lp0Sm&r7UOx<|4jbM(qA{onBT3hK7a`>NX)ELAJf=xWAl%I3`}ac(EAq zUxK(VvA4IEbno6>g4oYzqO$Id-@SV`9r;rZ)NLY3#viUvXYjtNY+1r@#s=BnIOa5< zPcSYpPJeeCz_H4JzElsmfYZ2-kS3HTEDIJa$TnoArluw#O%m)Q<;amEnYjOv_57ZY zE;q}PB}+>1teynEk%4}YGI#^xaeq6}-QE2^_vf?ciL|$XJD?BHZojMjI8LzpO8DIu z?12v7^SJ`qGWm>RL_|aa_CH5o|9r)Y6=}2s*)-q#TSG%bGI8R>^w+OnzhM3#DW|-U z=02DOOac3umnE&P)A4SU+tpp-MV$_E%u)Wdl3&KVc#F{d}A`6!A#{C z;733nDR|Z~alwKGuQ3L=fihm_qWuq$ZVuo$l>OB=x1YxV+D;WP6ojBn|B82vKSz%q zrQX>O%?9j)T!Amx4mh4Y01kZz2XV}PunYJB#&vG{&+{SK<$*L00oz|2d~f@ea4g4n z7GTM%SFfHFEn4(nx*s!U4CDGGKwE1ADDV2f2C$##3LJprcfjMifzH4Vuuo%Lf0Dhu z+1HWghuV+hg_zH=CC_0F;CUL{t@x*}D^;qL*)=cfJ7k!}O%2`B^F0gulu^^mqXpl*XP zp81#UHn3`(D8K&e--tV{Dmyt6gX1i5;~>T~VOX&dtX z?b?rPS#hWr`#l>_63E-1lOn%!KVHl}Pf5=QW{zYQ_TVfy6{?YLd^%wfTjrc9} zf9wNuOK$tWLCEuW?EhrPKTT1`JRSew{S9RKY5c=;p5JZ!L;KCE@$c&F<6oZl;++bP z4QOBOz|S22eslaoedxoqb=mVDMXWQgoM1YhzkK!l2k(|p(qd0G@Qt2f4ZaAzc5gh4guL{qx+;WzoeP)8icI`jBS zpfC8^_3wAse;)h|h5()$R0p(&5`Z>L-=I9$F6C@+8~5>Cnr$u)cy3t@@H&hu2m^1j zxBYjx|G|5oxJHP zg8MelkoE%D3s!;|U>q0#dH`NKumkKn*iJ{#4~zozqh(+hIE!{a!Tqlk;oA+_^^Y`X z0BtW6tOm}2wojY;p%_G8U><;eK;7Abtoxs%MveN{{Q%i|@%|^?N6f_ikff-nsFyhA z4u}9Jz+n&sc7s4b865C@6u?iOAZwY#AJf;XPR~(vJWmL4VK=(C_GT zD&V_(pY4|YLq3dQ^h-lPoy`Ziy8q4hVR`?%ZQHhDJ|{49=FBv_bDOeZ!-iy#v})C= zWFH@&RNVhg$Ng_{jT$v1eEtLFe~~g}%1Cg3I2m<_0u=%4r3)B$ScS!Wi{a+AFkMc8RhmU-nZaK^4#vFmCyRe?9+X zZf^cv&p*+(O-xMq{8I+(TzLK|6#28=>=S5zHG!^d-SX=<%B9R{YqW*Zpekqv`T;Mn z9x%>*dj1XX!~g5~w?2LPWD3u};a+0a^KW=2CK2!IXMg^UHa;5+0xbaJ8~ZlKceVU# z^XJMz`LqSb8p@#*U~Di0w25ATeID!nH()#V0LmojHie83do4BCQv zz!30yGs|L`Kh4iS*VeCXLtO-WP{VKPg|esss({*n;~Cm)C(s=@0on@N*BA5z^kw#6 zR)Fp0*iRQQrmF+`TvmMhT3vqSKGctLpk9=KDkuopAMqT9GNIj;1(c1B6#iyB)dtjW zaX=Yz%)vZ{S`zSZc@3*n-pD7=C-f{`ZB_Nl8Tmo_l z$R+T762MsDhyTPP4pAhM$M`G(mmc_}0Tz7LnAd;!{FBH+BEeS+L?R4O9&?E!!ni~N z59u;%k@Z0X{&LSc97{eb&UIm#l^xcFWmdKy(@6j8ek>Yge#}Eyx=Yt{yA+NSmb%j8 zvzG2}Ma8&|dSrdr0ZRpbkb(8oeJoR7X*;CHqP-t$DQ&kP2SF}^oCLXHnUw*Sf?O#; zU9Jmq=kM?R<98xFSR-5k`1G9!{E~ksfd`A!4hLE(E1d{3bm;QI}H zZ-MU}629v|_&x&>*7?qqkcR1bEZ^;5KFpKvJTQO3K3ML5-V4CCe0$$3Kji+a%Ag#j z2>wQ$Q{MDV>YDnXo~a}1i~6HJW#41b#kxK)02M(cP#IK_VkGmM+qvHmFufk&doaTL zFMQXBwn7`BZ3yqdur9O-!5)PAX4U^!$?s1s7jmTB1Q}B2lq=;cyst#rQwP*F-%H{< zO4KoRR~7KxLo>klv>E}v-(>}CKugdHv;ll~jqo?&_7G@m1}fH3>X210B6t(*n^IsHLwPa0que|!MMR# zL3?0~U@XdR3v3hHmetPukm;XLh9D2AY$zl8I^!w(TlzVDt1O^=s{j+w0MMV?fo_0$ z9tx;mSKtlig2liWtN|OqW)J|jfgMtIN|)QQ+zPgUO<+A(1(t(_U^egov>n>g0MG-_ zCKxjqD;RUC0Rte|f(CvU0c?{hklTUOFd+;2g5d9zO+i4vq5m+h($DEzrl2us2|5Gn zoBm0^oe36!)qwh?KKFxQ5C%?zbKoMl46cFe;0CxU1J}9zDqy+`;4C-^Lck%g2hc`n z8?+1Bm^+}|(HWD9?SujW-9(QaA2t6-fnp=>B4 z#&`M;<7xxY9CQKBfO4J==#Ogw{rCU~1=JPwMxEXVk>DAK0x|gJe=Oz#d4uo8y}xwn zQo^ZIrxK4JKb{m45|YFv=Cw(@a^=d0$jC^1-sD|8j)?^?!E^8gJOp{8G76NL3?N`n#+5YbNpsj-LY5xTPW22yV%E$yT zmbL@zcSiwFuozIz^g;ULIdC0N*H6Jq>W#X@H=)z`{j-i8JBn-9uAMda2ESPW+2k62 zFNO1k;~N>0-o1NgdU|@MZ`-yl<<6Zu?_o=?P#*2#5x4~yTTTGl;uf$1%mB1k#wuIT z6flle1mytxwPJwnFZjFb?MLf}HVS%I!f(bu+P?-U1M~rXgfgP6`T>r`7+=={`dBES z-`xg}K{S1tx~6`rRH-7#KKI49==)pJ7AsavVr^|L#{3T%m}4Oce{rbKGeBFs0#1T` zU?Z3hIJWE$?0^NJ9aI7p0NYPnpnN{dkIMd6A1`f}B9?;BGuE@sI-oje4B7+gow8a8 zHiJWeah*Q)1aoY>I(+zWGQK;NN#Fbyo&C(ToI|WbhYsSED_5q*#l^*=uC#?a-~wPD z!I-cJxB%KgM_>u+fNFp-fwGZ>enKcWl4TpeT9@BizO>$~Kl?fM^BRCQ&o;CDEdk^F zL_lBh2f=_bmHzbd+_`g!m{%*4^IH5&J?2H;YHDf{J3Bk^zJ2?W(NDyn{tv+=a1_uE zXxp^$0iX+D`x*BN%fQ%3C@(cY+0i!sC_6xXX|uFp#(TDp{d{>qn`a;284L%rzy@#_ zQ11`v>-hd!YW@24e|w#O$!<8$66OF)OH52;{~*`_LFzL=lsQP1qU=eSoFm;f8l8_*Ay1CHq!=kG)BG0T@PPy3zX`#RH5Q5&=Y1A#Z#2tvRO@M8Dw-N{BqMt`io=VT8YqjLO$wnl+_fc?U8!0Q!V zKsPD;%`rl2U;)fPWk5S%JYX#NEo}hx`jYPJVqXWqc<%$YgEQd4vuDrVvd_#(em}CG z{c?p06(lul)|519(nMloViaFEA6ZFPs590LMgw0PTU}#TtP9CvAXnfPKMlbFYzg0m4|XFn*T; z^n2>w7K{Rm0OLLT`KOq7I3=&fbv*y0{u~`0CDW%*7vp?gjJXdpF&}FN=B>;?d9tKq z{fpqczMRiCsmypawX;`sFsjIsifUj8E+E^*|j!-H!%K0NZ#KW8;_jrY=7^^WA<% zU#eBB7U!Vk_jbkc@$rIwv+FetW#$BRkrQc{Lo*%M2{SS0qnPpIN4~4e^Tu7fc4bQI z#u&h{!2`gt;$1)=ISTv$`%Bt@6{rF<0pi!z0 zjE&*7x$o6I=Xm4Xx=)@wq3o!0LEky)SlIui^s@R-LB53j_2=NeRD4T34f6|m9vVd`_B^UzcgCKAX=R&WVH*fyUy5~2`IX^Y#bEVF|q`&O?71Cv3 z?45yeMh517&&0X87=Fh&jm3NR>=83|;96paG=2!jFfYL#WbGgc+exAn{-%AT;2YEF zn0r#pIf5a~Z-V6)FJAmV$8g)VYu8>P|4^_33J_0D;fF~>0dT+na!rJ%EnmoHyt?A^OpJY&WTagQE7B#agO zMtyF_bByO4L$qquN-}!%XbHamF1~p2BIk}4>_M;v!3GjguMdDrl7yI$>h0|<=5^xS z+5vq1i)k@NrOjUh95YV?JU1`~l=Uy|15mzf+^0PnfQG;kxPvX=Jb2FQwz-uD$8wyX z8~5xecgkEA`X#rg(`PY{fw*74ep&Zxa-09RrlVcpnt#@~686CHB>8;G5>ld&)ZZ~RK6&;FXf*X+d0=b#+_pH z&$L7OJ#`-kUV&H;54b%Q^PYTD%==vZkk1Q1SuO+4paG}=I0jGw`920?M zd)ImG0DVp>Vgl<)Jw25!X%Do4FV4l1+cJ?y3^)r`0gkDf0A0ZGR=$q`QKsPg1@OB# z&;|8@Bk%+}z!mg`u~n;9&6VykcZeA0g^Z&d^F9Q3z+KK|K7Rc8^dC9b%B`G#BpuF0 z#lgYBtp7dm06Yh@V}49ES2FlgI^@BaasjLZJfE@v`alEx3jGVd&;F+js190#(O@+= z1)kzLj9m5kxW6Zc|1f6qde{}|@nKuHZjI5_*8U;ceMzQ2YkT+Z-P2#adUYRdAoSa$ zA1w=cQ2!BN0~iT-J&~^6=d5z`+)dZ6UFrAKJ$)t| z>;anq+qx431IE4^fN21n>v*fd}CAj#+?Xp3Pt{I0`6V%K1EqkV4s9`pK{i!ZI%awv+aH92^0(+ihSg zpbxN)k>Fh(=synmuzl1&W2`mEcm1PG1wj4N<}`pVXb9;0e}RMG9_EKj&Z*5jui-T> zq^JMTU+D8*U>IP2Jwbmk2GACm{}S*w;JL**upZFnD3|Q`VcU<8JwIWc<+0qgfa5V< zmst$vfw^E2V7VcHV*!3dJx5>oS{mf>CHl|5vT%nP#)9)j$kGT z0(TA^IFO_7^ST_ydu-E9>2dTM%CH46166<_s03(ZH37?N02%|@25p2`0oqA^z_JL- zwE*Uzi4<;Y1Ns2k@=kCKyv|9#IqgRtzg+*Q1ASi!6aXbbML=252N;u2f#;k{^K0$l zwb=0R@MNTo1Yv;3(x>R>wSXQd4N3u)qX~G9Q5Nu;hc3_u22yAz`3=iv9Ryf@H9-69 z1YAG>xB~J+|J2J*^?&5A2$Vr#K>Zkl4qz(S4z4|Z{P%1>nxLfp$=f2Y6B(!f50}zea##^>um;1yYH$Wb@%gH+>7V^R{$c^+;#S}a>_9ER@dRy)`V`tBYtMPv zro76F^`u;A1A<(r8~Ugp$V>e*miPn4mR6t|&<2zl^};ytvwVT=W85zes3#N95m0}O z{nzolRF3Dlt5>h)nEwel4wivIfa50GlVHpAdFtnz`ZK2gnZT|;{behMHbB|4AE*fE z7o$O5>i;$Jy9($t>~AUi+Q0zN1}HoB1+2r*fO#`EbNp2mGzERZJa8C1T)cSkSMTxh z`aSN~zC+sEU=Q#D?DyFY+LStAZ2xB6e^N|7|3F=7bJRcmj&e5yKSTd-knc^f8_WRg zcbfsqj&Xo}0d0@v=QYfi{>i?Le%}Oi0*piJz!~tu!NK9H<9<9ZCq}wxZ~<%pV?j&6 zd^G`M7=8bn{63#m{;%R#S3rCH+4`s7+y}v6IT#OU1B?T$fDNEM(Dw2g=F9x4s}7($ z7zGx9eSmiPx@_69U+w$x41f^(dCs>4ID^JO9~1|ap%RemKil;}$Rq(g2N8fVfHuH5 zFcr`b=}Tk4=$`=dW&X4|p4WPVWndRL51!)Lw;b{IB-?O`CGKn03vEegAqe3b0?P2spMZ0RE`hpU?WwgnVcNj05Zo-T}&< z_7Im(uq?uI-vh?;RFJ{ zJKo32fPSBXP_PK}0la>w1JuDE*Z0fy|7CyAZkKq6jr{d3HC5X=HR z_cI0BfcjSka{d3|dj67)%Ju(e`|p?Zn%nL2`2WAHfBE?De_Q`}E<}F*_XB-9#ztSe z{*zzVfPTjHA3d~9e*Gs0+klLC{`{-2|6V~Ic>P{}{TBlt{y`S`a{h;Mc-@!&_XtD) zUPsvtg!@06@cU=p17iNX|HFGXEcYn52qHmV-T#qa|NlZ9fQ)~K`@a)VkI&x!#kW;* zy#IUS#tq&txC`X>f4`t-hLq0%nel$leL%lo4#tCCpd;Y(AI$;pr~NE!kau1^{}GD3 z7K47EF%ZT8eEx&i(*Bt1K&-2@&a8V0UIwmVQ+8$)qBA0+O-oST{IA${~Ckev?=DR3I4ce z08r=r(m(tDtAPFeR6xI{?x|;9LoEe(ADuS%Ghp6YpaQ50nu5My9ykngeEyT)xZ&g) zNP7#=j;DjJzzmcJybqXl9~jF&A_lOYfHCW5`+pqDxC}T3qu(*+^Vu2dz8IkI6acKp z&!8akEewhS>WXoIHs}hrgIqoTy?*`rbfkR(!oV^x2v`Ef7}_w)Q3i7T%Zvpe59*(N zi60mXY(Ql|nNjz=f2Jgb_L!Fl`LYa_#WL9+ScBnUH8=yJYSgIl+3|}ors21D@fQoO z03nvy;kPL$2N(lrzbx~&w*l4>o`X7Tbn*sU^<1+m|OI}#AK0gbVLESLk=m0*y z!EuNWI07DeczAsEIY8P0=5ye6j7Q)oSPTXND?oeZIDm16wnn-B);7TUN$W|uu-`QV z^o!BJ4^U@$G5(YFf9B0HSQg977k@!H)CXfT^-~%cgARb>5%vM!^ZqAefE(aApf1n_ z>|=y};J3B`)bn@I|4)~bw5^N*j5mxsj6d|-q2OiJ!NsN4UH{wW}-E>y8p2jxK>;0R`dAdsu?KQwC8DEs#x{=%{S z0PU$NC<9o=Z*2ppUv~Y|C#=EGivJs>d9w`J_@6J&&Z11Vmp;jHAkPP>t5$$x()HjR zcxh&4_SJD9O=-o76+9Ps0WN?5-~oC7b5I4)27c=}fcjA$*<+#&wox8_;1bBo{y)3^ z*;lgv&rkg;O3T#1QWrD?y#alg&v)I!_b_w(1`Ov?z;~|`k^V6_1!zCKzU%;aqCgwq z^MNdf_QtqFS+o4#VqD020Qy5g!1E%GVOxOlU^BQ3@=E`_-$MP50#<s@E zF9PVJ90#@qZ1V=d7?A7lzu_C9Z;}2!2nDOb6u>^k0#paQ=EU(vQNaFyWq+~*{LXh< zV3|@_4_R5TzLdpez?gOwmG$XaaNr z$49?H|CAGDA;bV({O0u_N8kx|fbaSKGvmNRa0cuIi@+q{1lj<`nHsdr` z;{`YgmH}tb0MO=Wf2?1=#ecznSf;e>!dUWLzz8%0g8=n*7<|w7-{0f7r{D@W0w~MB zz&OA@p&e)n%mB;O2ebuVlcFzDHzl`4%!3iWg1}oI|}ZC*B~_~{r=$m57hrp>-PkGXJ4{Rpadv0%BMW21v&tZ1=oO+ z;G5@vIC0`c3XWsUyARHR{eb5Oa{=SQ0MHe*0!=_|z&@xFpgqtxs3+P4V+8Gj`eUr1 zeXzc=a2w%%rlW6D*JS{0OBWb|s(?Cg2y8$nK)p`{^T1}nG0ZK%`X_Q8x}5Z%!~8E| z696GByB|jU#XeTflkn&GWwu95_%M9Uc81 z$G!k}0PWxq@CQqQ7Z?Wy0+vU+qfX30JwRKeoTxMUD)qBB%nY zftrA}#Wq=iHlPdW3q}EVun24d2Lapq0KCF{70H}~C@0->|Ci=};&&4;-&{2E3k55{ zaL^2}j+8g!loI$=`d2{Nv;h^scuSw5>?o^#U^WN@-#!16o10q(=6|9cL;=QwOCSvF z1(f@8z;ax{7%&L1pRfn?mA0S-um%=@_Q9CZSO%`MPq73xpcP&eQpyIe$Fn+!OPABipxcPsJR|i5NS)Ls_o@Z6g}I1X0=GHtvf7 zv6!ne9^bP5fcc-3SFT){j_=!KV*bBxn$r{fz$h%Y9#}epwq}Oi~3!fUFI4z&iV1AHbMQpUay6y;G-7-#jMx zntZeG-E z(C5_vWBzaF_a8O?&wtcW)&|%Ylmxnfc5VZDgDGG+*aOaj`-rUU zF`nT2cxfpqDX-8*j!8JiI06EIFPIA`BUz|#`Z{$^fB&R+{Qj+C{y$p(_b=8H2yuXI zD*?)bYM=?|4A>vc0vo_#z;VGt*ukrf8#kubuV4RWnrDaX{z~*uM#} zKp($r0&`#sXa|$PT(B1G2B9DV+y)#oN8_6LdyW-)_wFsOT)Fa39kZjYpZXy_w}v^N z#V#%`8ApyBNlr>idX4%#2aH!&z)7$VYy=B{;O{)AvjC=`5~u(e3rl^AEdS)RXscic zLM$kPZ5$V914Cc}I5ubpdVx{E6VQMB0LO|U;2gLPDD$V_C0;FzKYsjp5^ZA4m@%1* z!<>hZq>ZQ|AYP zFs7S{-{U}EK$~s~sCV{ze2M0hXU_Wsg+yu0VNbn3qff(p44)+q@+`D)0J+8YXoIH6lF)S=B z3D5PT(9ixQ-Z)W2ob3Ks`SJ55XO94KNO!0>OZ>X%kohW`oIKFmM2^ zK_kG}W(auwrX)}YjDKo??N|O*8UBArk9N!2fhyJoJ1CCdrGXBp4CptF0mq7+K_4&z zxB&VY?O`?840ZvYPg6I?!D+x)aS>br)ZYy$v=sqvyAG}b+7We3o1&gW!6C30Yy%qr z_3Z;Z0PS)ha0Kmu1*i?G0zJUkM%$*1vyE)4GNAn{fFhHHrJ|+U{kg;Q`3|yZC zCV;VEBp3qvgWkXaP}gk$ZLcw?18RWEfc7cqyf}VmkMVN7XIJ_c)*(CE0_{Ms1;zwf zTVPyZJf(lp9x4ERPzlf`Y63G*4>SU_4J%*+T7uSqdTc8L*INPFP%~f&%t1p?7tqd( zfe|nSx`6s-KSjHweKNim0*qg*Gi_LChuqh{pzkkjhU{cxf?x}jsVbn1DQm_C`Wk(% zB+vw9Kv_V$&;_&&>Z~H5jZ~3BT@qoPe$4$$YXIoej5X9V?M%=$ZI3o6=$kQ$_9^IG z3BOt2tonbcee&(!CILa7QrS|*g!VwWQ~tCG>Vjhj+6DDPJ<&I5AJiLdg#JosD*{~S zKBgf|&tqv@%!hf>-UMCK2D9s1uJdnG>364w?1k9CCFM?JZ9=dM>WR=k1RJ59d<~`( zj-!rc^(^@ICtYK|Jhp$gCiCt<>LD9~UC1s48~M^wHm&eGd%kjg=bhT}EvIa@@gJSa z?$5VM$qSN8KrR8f1mqHsOF%9Gxdh}AkV`-=0l5U^5|B$kE&;g&NuNQ;r$Zbw2ySzmJDwU z!>8;;B0fnT-Btf0o!~3_HNoa&!_e@^nrF3;@iS!OLGzbv!PT8Ctynk=)GU3ZsA<&FJe*pJ0W z`MZBy*Uh%h0<(_C{>Mnq472P~Sl5->5!OH2t3?=-(I2wgZ+3gnzAn>_|N4(aBKeoU zVV!S?e)`L{o+Sv6PkaC4@7d!)mSANnoIRdcF#mrl_%Q33EuKwe3()Gte z0_plE2}sw40)%)eWSCVOrjcggE=?~Ds2^*SwatSid`d3WfsmR@B#_z74gX%1P5b}% z_neL$S{5x-wh)9>v~??+PUsNuQ$bXKZw4k!?SlyfOq;c~vFbAU-s@>oe2u#zh$^qY9_z|)!L_X34(&3kDRg41GPcKw0Z~hHd($G#+iQ8^tpV7Zyueq_tqTOxwDW6=C>{{E= zqP%4(k%Pj7T5Fz*t9}@7?$%-20hc~TqTNNz%Ge&6-)h0-w6#ZKXV*+E*iET`ibz%O zNS&b8Lv1^)o8Wb_!Jc=!l41-$nA9;c*2T`TS4#NU2KC6;p%i8&zMx#l;_v}`i-P`x zbQK(ThmG~LbI|gLhO3zkJHWL%rw(9m_!*E_GY^u0zo>zN1a8>Sz=xBr>+r z-tlJO#N>fv{8zc(+^N;cDLnaMT!)mkNq3futeci8C5qnI?$)HBhfhs1TS?}LcWs(6 zVDJ&-Ega&zQh=^_L`0Kkgmm z5I5q^=#=Wms%kjgOKo+#_U-0VcI;Vute;IQjdy;&x^rsO5*xO*@=Q`Yen-h;pkvaJ zlmk9vcHMd1e|Wvf>ILr1wAN^`QRKNbT}8?H)cV!03mVw0e&@JKefBAl_pY+h*9!IB zpwpW({FsR>xX?S?lg7{eC{zI zKtaLyh31t(3O5!i6tq{~qihxN_YPkjJ)7C{n-to2`N)9jO`T0Ew9>2YwC};}rN>?S z?zp=;W_kHH(_g1`d-_IER5?B9bm&SIk$-XDnW7hCJ!*9vr|bT`huVm1tvhE_t!4$bOqrCGmt?tCHMZ)UUi& zY}4ty-lDOVo|Zmo>Wbs9Sg9%8d*3Qd-#ScUvRqFuqj7=ot||$ALTc1CciwU7t=ajE zUV}nQNG4YPFr#P8#Iog9^gkM)s?@hc(wAPCk3C9cS&lK6d;V zk@_jm$u-Sa>sS?AuvYh?(Sew2maP;I?AdeKH`2P~h&q*u+g6ay)uPGWt<}y zJ4Y_B7gD9AdAWC*DQ}Raq&SD7gm^D1?x*g6+HYO)b3~+tGBeCXPrW4M512KPV4SA?pdhtt@MBsEmbtT zG|;#fVQ&yQ)qY)HT9gN5+{u961+!`bbIJ1#!F9dc96a z=s)%C8^wlCoY#7KY@e>xeeinEncfOYp1TV^kLXj-Hte2v#bWCMVjk^J&3N==V#t*w zpTw^1T8WH~UmhQ#q;_fJB1UqT_Y0}fy5+O>2|J>194Oi5y6M8o`b!jw*6Fyy za`1&zh2(N2hHk#pa9_&x{gvB)h^?#}^ziTYm%|%6XDV-V-QFrV((BAXwW&vAFGL=c zXkWC8>{5BeaqWa+Pp|jr(8t3vV0xojmTN93)NSrlyyVb9=D|18RlTj+B=iXH66jOn zcCt@mzmg}`wNGx+VD$a?{o?v-B=ZK}sDERH`ic9|_r0FoA1jV*F{{~n&ql8T{5)0b z7jFE(u~f-d6D@+{GFvEG{gpX1F1S-%?Wo(Po@Ix+X4rRpGCgue;WvZC%i?eLe-kij zpkAZmZ{|eaS{Xe$XrcCu_EnW$jU5;!HZZthZ+o$UnU_ZWQU!`!95qHQP$MJav9qCD ziMk1vY}NH)KJaVy$5(2=S+OW_$V-!T<$GG1jI40yX>G6hJ*y5bEIMl0q;bfW?yan+$AwLw zP{^}LQtcqyGShrgulrtW5xT(a=)}~$b3*qd`J^ER*3CHc{6vebJ9n0wJ*`!A>nkTq z-gvddVf5_h*8Ml`thlpTf&P0Vy{epXE85vNDzNI-)V4;F^=W;RpV&Ex7Y->GQa)s( z{+8MO<`$S{7^YkPrby$QMUm988+9CZtLyJpPH%fHYTb!a{;BomwBD84*0x(yht&80 z6SwwfPfU$@+5LJ2!!Tomgf(Uk1^euY8Gd8#_?EVEK=;_%cP|fjJD#E4 zZrqbMCvDHKxZQNXW%a}(J>wQA?N;eLzEJ0YPV0iTz5PdQn4`7TS!?RK-f`jA2N!)e zbnSxe8<+Ixxpvm<;teOy*V?zryOn4VT_+H@v%A#fKqx;|A?mcf5$d>AbSn zGcI?F>~U=3%|P$R8b?JfubzzVn=s|whIdh?2HMuGJ+HHRlj8pUl%~d2*-<5K*3On^ zPxe>SalHBB#jJO2Ue+#IdO}=*f;|sty)9;DX}zhk&9!M)Y}SO9y*9O?R>|9oimV^H z$9~3yWgVZytvg<4;O>I8eWQ*+#2=qvC}$MAacQiR+fu2 z(k}Nr8q~ILNeh2bne>;n7N|rxFG^q3xXB5hhj-2n@EDje=WWe;Y1MthO6jJr+TD6j zsNLc9Njo*etqwKN3~b%I5udxO2%-yTtueB40k+KY5(%z}?L+&h2t)ms`b%7ja!`SVcW(K4a@P z72{>|qXvftJ#G@+>zUhqmp&?!-j8t6s+3@NvA{mdg>TO;uD3G4S!djx3kRn}_|30e z%(&n28HTDJ?L+0u3p?xgM zW%k&uy~=c6>vm!8hmuyF_q&khuQWzs+N9CGvp4nqP|@7h_VS(UYXGKCXD6Ozz!osk$jxl5V^}gA7iHUjVhjW`pj1|S5 z7^&{*U&KsjPl@$5*Tn`m{HB*3>Kk5pc=*8K$19IaPY+$&^_idj<5{*hlltgP-BUPtcj3$Z>JO~7Ky{tQUx%(0SMYfCu4&D6X>+DXiX0f7 zH0ngDp#e?mzT5UHP)$7F{z=KJvG=-n@^5ptQ@Y12hk}3iIdb`87oSbT3<9igYAPp` zsyi)V#q+kCc1`a7U}NEzp6>@e9Hu(M1$9xR8UT=K`}Phpy?g zS2k>+pl~wr!VdQpv!=Ftd$Va&`t}Wl+z+_i3X8KS=rp_c-KgQ3akonDPIypGMRZ;9 z>@~>^Q^mx^rOp?rv(qEK$?35}pKXZk@of8=bt_E9jyyMQ#q&qcC+}SvIOp;F@N*0L zYE6A>Jh5MuiT&y)^|Pw2yu{8?q3SympU|@Yrd}8COs{cgdVAmF6}MR>u0E$*bbONG zyZY~XbYI@;Wc=CL>G3zJFZ0oUZ|pYi`IhYyqOV)l($;MK%%#oW15TOVH`Cm&Y`eGD z=D^*hw6rcnSB{rdn-<|x`SzMdP6lm*%T^6}wXWy#7(0V*mzEpMeRwJ$JTyLS!ep10 zGZsjOggovsW5G4Gp%9sYq_i@2(J?=nc_{s6`5iHa#v}JX_S2s+zmv#u z%C2E;Z90q8izW5f@+gqv+rLAkNe8D|VG}|W?UhXi51Uf2{l5M~XS6xc>0M%4_pPR> zT`FqU*%=rY6u)0|Y`pijYRfAX?h>{4?2v%-(NUHwqkO|P6WS#&IJ?VDlrrM-f_2Kt zJO6eZvs~5FZod1nmxfwy!(20ht~yzzZdsxm^nUH_(@xiH>-0LFQMuUWQrq>5t{s2( zmf7%A`*sH#%`KbU_Qr>Hp6i3fgS+edI!5&C*ezx3q{0!s`$o34w7gVt(*0Qpho^2y zR%}*sW{RDvo@dDHqe*eLv!)e%XK~!m&EZhXDT5N5)Q_0*$ZO1m@ohR6-Y~q(y99&P zi(@i1T(0deljwNCV#u-3QWNaU-YPwF_{FvXDHt)gPw820&pX=%eKIaH3l?W(hWmTTiC=h`;UXuq{jU~*U8i&M^*eE0Cu@fylKpWU`QW8i*sf8vz` z5!%Llp;) z$#lB4F>_eY^c7;KM8k<8B|{234LM@GsEx75WoL!L4v+mT*4Q1qQO86#_IhY+O�y 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 + + WinExe + net6.0 + + copyused + true + true + + true + false + false + + true + + true + false + false + + hangover.ico + + + + ..\bin\Avalonia\Debug + embedded + + + + ..\bin\Avalonia\Release + embedded + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/HangoverAvalonia/Program.cs b/Source/HangoverAvalonia/Program.cs new file mode 100644 index 00000000..426b6853 --- /dev/null +++ b/Source/HangoverAvalonia/Program.cs @@ -0,0 +1,24 @@ +using Avalonia; +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.ReactiveUI; +using System; + +namespace HangoverAvalonia +{ + internal class Program + { + // Initialization code. Don't use any Avalonia, third-party APIs or any + // SynchronizationContext-reliant code before AppMain is called: things aren't initialized + // yet and stuff might break. + [STAThread] + public static void Main(string[] args) => BuildAvaloniaApp() + .StartWithClassicDesktopLifetime(args); + + // Avalonia configuration, don't remove; also used by visual designer. + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure() + .UsePlatformDetect() + .LogToTrace() + .UseReactiveUI(); + } +} diff --git a/Source/HangoverAvalonia/Properties/PublishProfiles/LinuxProfile.pubxml b/Source/HangoverAvalonia/Properties/PublishProfiles/LinuxProfile.pubxml new file mode 100644 index 00000000..a846a327 --- /dev/null +++ b/Source/HangoverAvalonia/Properties/PublishProfiles/LinuxProfile.pubxml @@ -0,0 +1,16 @@ + + + + + Release + Any CPU + ..\bin\Release\linux-chardonnay + FileSystem + net6.0 + linux-x64 + false + false + + \ No newline at end of file diff --git a/Source/HangoverAvalonia/Properties/PublishProfiles/MacOSProfile.pubxml b/Source/HangoverAvalonia/Properties/PublishProfiles/MacOSProfile.pubxml new file mode 100644 index 00000000..5d1e98f9 --- /dev/null +++ b/Source/HangoverAvalonia/Properties/PublishProfiles/MacOSProfile.pubxml @@ -0,0 +1,16 @@ + + + + + Release + Any CPU + ..\bin\Release\macos-chardonnay + FileSystem + net6.0 + osx-x64 + false + false + + \ No newline at end of file diff --git a/Source/HangoverAvalonia/Properties/PublishProfiles/WindowsProfile.pubxml b/Source/HangoverAvalonia/Properties/PublishProfiles/WindowsProfile.pubxml new file mode 100644 index 00000000..1490c0a5 --- /dev/null +++ b/Source/HangoverAvalonia/Properties/PublishProfiles/WindowsProfile.pubxml @@ -0,0 +1,17 @@ + + + + + Release + Any CPU + ..\bin\Release\win-chardonnay + FileSystem + net6.0 + win-x64 + true + false + false + + \ No newline at end of file diff --git a/Source/HangoverAvalonia/ViewLocator.cs b/Source/HangoverAvalonia/ViewLocator.cs new file mode 100644 index 00000000..44467ea7 --- /dev/null +++ b/Source/HangoverAvalonia/ViewLocator.cs @@ -0,0 +1,30 @@ +using Avalonia.Controls; +using Avalonia.Controls.Templates; +using HangoverAvalonia.ViewModels; +using System; + +namespace HangoverAvalonia +{ + public class ViewLocator : IDataTemplate + { + public IControl Build(object data) + { + var name = data.GetType().FullName!.Replace("ViewModel", "View"); + var type = Type.GetType(name); + + if (type != null) + { + return (Control)Activator.CreateInstance(type)!; + } + else + { + return new TextBlock { Text = "Not Found: " + name }; + } + } + + public bool Match(object data) + { + return data is ViewModelBase; + } + } +} diff --git a/Source/HangoverAvalonia/ViewModels/MainWindowViewModel.cs b/Source/HangoverAvalonia/ViewModels/MainWindowViewModel.cs new file mode 100644 index 00000000..607e3ddb --- /dev/null +++ b/Source/HangoverAvalonia/ViewModels/MainWindowViewModel.cs @@ -0,0 +1,150 @@ +using ApplicationServices; +using AppScaffolding; +using Microsoft.EntityFrameworkCore; +using ReactiveUI; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace HangoverAvalonia.ViewModels +{ + public class MainWindowViewModel : ViewModelBase + { + private string dbFile; + private string _databaseFileText; + private bool _databaseFound; + private string _sqlResults; + public string DatabaseFileText { get => _databaseFileText; set => this.RaiseAndSetIfChanged(ref _databaseFileText, value); } + public string SqlQuery { get; set; } + public bool DatabaseFound { get => _databaseFound; set => this.RaiseAndSetIfChanged(ref _databaseFound, value); } + public string SqlResults { get => _sqlResults; set => this.RaiseAndSetIfChanged(ref _sqlResults, value); } + + public MainWindowViewModel() + { + dbFile = UNSAFE_MigrationHelper.DatabaseFile; + if (dbFile is null) + { + DatabaseFileText = $"Database file not found"; + DatabaseFound = false; + return; + } + + DatabaseFileText = $"Database file: {UNSAFE_MigrationHelper.DatabaseFile ?? "not found"}"; + + DatabaseFound = UNSAFE_MigrationHelper.DatabaseFile is not null; + } + + public void ExecuteQuery() + { + ensureBackup(); + + SqlResults = string.Empty; + + try + { + var sql = SqlQuery.Trim(); + + #region // explanation + // Routing statements to non-query is a convenience. + // I went down the rabbit hole of full parsing and it's more trouble than it's worth. The parsing is easy due to available libraries. The edge cases of what to do next got too complex for slight gains. + // It's also not useful to take the extra effort to separate non-queries which don't return a row count. Eg: alter table, drop table + // My half-assed solution here won't even catch simple mistakes like this -- and that's ok + // -- line 1 is a comment + // delete from foo + #endregion + var lower = sql.ToLower(); + if (lower.StartsWith("update") || lower.StartsWith("insert") || lower.StartsWith("delete")) + nonQuery(sql); + else + query(sql); + } + catch (Exception ex) + { + SqlResults = $"{ex.Message}\r\n{ex.StackTrace}"; + } + finally + { + deleteUnneededBackups(); + } + } + + private string dbBackup; + private DateTime dbFileLastModified; + + private void ensureBackup() + { + if (dbBackup is not null) + return; + + dbFileLastModified = File.GetLastWriteTimeUtc(dbFile); + + dbBackup + = Path.ChangeExtension(dbFile, "").TrimEnd('.') + + $"_backup_{DateTime.UtcNow:O}".Replace(':', '-').Replace('.', '-') + + Path.GetExtension(dbFile); + File.Copy(dbFile, dbBackup); + } + + private void deleteUnneededBackups() + { + var newLastModified = File.GetLastWriteTimeUtc(dbFile); + if (dbFileLastModified == newLastModified) + { + File.Delete(dbBackup); + dbBackup = null; + } + } + + void query(string sql) + { + // ef doesn't support truly generic queries. have to drop down to ado.net + using var context = DbContexts.GetContext(); + using var conn = context.Database.GetDbConnection(); + conn.Open(); + using var cmd = conn.CreateCommand(); + cmd.CommandText = sql; + + var reader = cmd.ExecuteReader(); + var results = 0; + var builder = new StringBuilder(); + var lines = 0; + while (reader.Read()) + { + results++; + + for (var i = 0; i < reader.FieldCount; i++) + builder.Append(reader.GetValue(i) + "\t"); + builder.AppendLine(); + + lines++; + if (lines % 10 == 0) + { + SqlResults += builder.ToString(); + builder.Clear(); + } + } + + SqlResults += builder.ToString(); + builder.Clear(); + + if (results == 0) + SqlResults = "[no results]"; + else + { + SqlResults += $"\r\n{results} result"; + if (results != 1) SqlResults += "s"; + } + } + + void nonQuery(string sql) + { + using var context = DbContexts.GetContext(); + var results = context.Database.ExecuteSqlRaw(sql); + + SqlResults += $"{results} record"; + if (results != 1) SqlResults += "s"; + SqlResults += " affected"; + } + } +} diff --git a/Source/HangoverAvalonia/ViewModels/ViewModelBase.cs b/Source/HangoverAvalonia/ViewModels/ViewModelBase.cs new file mode 100644 index 00000000..50908ee3 --- /dev/null +++ b/Source/HangoverAvalonia/ViewModels/ViewModelBase.cs @@ -0,0 +1,11 @@ +using ReactiveUI; +using System; +using System.Collections.Generic; +using System.Text; + +namespace HangoverAvalonia.ViewModels +{ + public class ViewModelBase : ReactiveObject + { + } +} diff --git a/Source/HangoverAvalonia/Views/MainWindow.axaml b/Source/HangoverAvalonia/Views/MainWindow.axaml new file mode 100644 index 00000000..b32eb8de --- /dev/null +++ b/Source/HangoverAvalonia/Views/MainWindow.axaml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + Database + + + + + + + + + + +