From b3ef6f91ee558b148848a0716f21a1912561833e Mon Sep 17 00:00:00 2001 From: erinn Date: Tue, 30 Oct 2018 12:48:37 -0700 Subject: [PATCH] initial commit --- gcd.go | 8 ++++- main.go | 11 +++++-- qml/main.qml | 37 +++++++++++++++++++++- qml/widgets/IconButton.qml | 14 --------- qml/widgets/Message.qml | 10 +++--- qml/widgets/MessageList.qml | 27 +++++++++------- qml/widgets/MyProfile.qml | 21 +++++++------ qml/widgets/MyProfile.qmlc | Bin 21392 -> 21412 bytes qml/widgets/SimpleButton.qml | 56 ++++++++++++++++++++++++++-------- qml/widgets/SimpleButton.qmlc | Bin 3492 -> 8384 bytes qml/widgets/StackToolbar.qml | 15 ++++----- 11 files changed, 136 insertions(+), 63 deletions(-) delete mode 100644 qml/widgets/IconButton.qml diff --git a/gcd.go b/gcd.go index f61dfe6..d17b8a3 100644 --- a/gcd.go +++ b/gcd.go @@ -15,7 +15,8 @@ var TIME_FORMAT = "Mon 3:04pm" type GrandCentralDispatcher struct { core.QObject - currentOpenConversation string + currentOpenConversation string `property:"currentOpenConversation"` + themeScale float32 `property:"themeScale"` // messages pane stuff _ func(from, message, displayname string, mID uint, ts, source string) `signal:"AppendMessage"` @@ -133,6 +134,11 @@ func (this *GrandCentralDispatcher) broadcast(signal string) { } func (this *GrandCentralDispatcher) importString(str string) { + if len(str) < 5 { + log.Printf("ignoring short string") + return + } + log.Printf("importing: %s\n", str) onion := str name := onion diff --git a/main.go b/main.go index aaa27ba..3317cf2 100644 --- a/main.go +++ b/main.go @@ -22,7 +22,7 @@ import ( "log" "cwtch.im/cwtch/model" "encoding/hex" -) + ) var gcd *GrandCentralDispatcher @@ -242,7 +242,7 @@ func andHisBlackAndWhiteCat(incomingMessages chan Message) { } func initialize(view *quick.QQuickView) { - log.Printf(os.Args[0]) + var err error //TODO: this section is ported over and has a lot of printf errors, need to show them in the ui var dirname, filename string if os.Getenv("CWTCH_FOLDER") != "" { @@ -258,8 +258,13 @@ func initialize(view *quick.QQuickView) { filename = path.Join(dirname, "keep-this-file-private") } + /*_, err := app2.NewApp(dirname, "/data/data/org.qtproject.example.go/lib/libtor.so") + if err != nil { + log.Printf("ERROR CREATING CWTCH APP: %v", err) + } + time.Sleep(time.Second * 10) + */ os.MkdirAll(dirname, 0700) - var err error peer, err = libpeer.LoadCwtchPeer(filename, "be gay do crime") if err != nil { fmt.Println("couldn't load your config file, attempting to create a new one now") diff --git a/qml/main.qml b/qml/main.qml index 3925599..fe78b5b 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -3,6 +3,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.4 import QtQuick.Controls.Material 2.0 import QtQuick.Layouts 1.3 +import QtQuick.Window 2.11 import "fonts/Twemoji.js" as T import "widgets" @@ -42,6 +43,10 @@ Item { return newtext } + function scale() { + return 0.1 + 2 * zoomSlider.value + } + /* Rectangle { // THE TOOLBAR id: toolbar @@ -145,7 +150,37 @@ Item { aux.visible: false } - Label { text: "welcome to the global app settings page!" } + ScalingLabel { + Layout.maximumWidth: parent.width + text: "welcome to the global app settings page!" + } + + Slider { + id: zoomSlider + from: 0.5 + to: 1.6 + } + + ScalingLabel { + text: "Large text" + size: 20 + } + + ScalingLabel{ + text: "Default size text, scale factor: " + zoomSlider.value + } + + ScalingLabel { + text: "Small text" + size: 8 + } + + + Component.onCompleted: { + zoomSlider.value = Screen.pixelDensity / 3.2 // artistic license. set by erinn. fight me before changing + if (zoomSlider.value < zoomSlider.from) zoomSlider.value = zoomSlider.from + if (zoomSlider.value > zoomSlider.to) zoomSlider.value = zoomSlider.to + } } ColumnLayout { // userProfilePane diff --git a/qml/widgets/IconButton.qml b/qml/widgets/IconButton.qml deleted file mode 100644 index 1f9cd38..0000000 --- a/qml/widgets/IconButton.qml +++ /dev/null @@ -1,14 +0,0 @@ -import QtGraphicalEffects 1.0 -import QtQuick 2.7 -import QtQuick.Controls 2.4 -import QtQuick.Controls.Material 2.0 -import QtQuick.Layouts 1.3 - -SimpleButton { - id: root - font: "FontAwesome" - text: icon + (label == "" ? "" : " " + label) - - property string icon - property string label -} \ No newline at end of file diff --git a/qml/widgets/Message.qml b/qml/widgets/Message.qml index d954c18..d7f8de2 100644 --- a/qml/widgets/Message.qml +++ b/qml/widgets/Message.qml @@ -41,8 +41,12 @@ RowLayout { Rectangle { // THIS IS JUST A PRETTY MESSAGE-HOLDING RECTANGLE id: rectMessageBubble - height: lbl.height + ts.height + 4 + height: lbl.height + ts.height + 8 + Layout.minimumHeight: height + Layout.maximumHeight: height width: colMessageBubble.width + 6 + Layout.minimumWidth: width + Layout.maximumWidth: width color: from == "me" ? "#B09CBC" : "#4B3557" radius: 5 @@ -99,15 +103,13 @@ RowLayout { leftPadding: 10 } - Label { text: dummy.width+", "+root.width } - Label { // MESSAGE ACKNOWLEDGMENT id: ack color: "#FFFFFF" font.pixelSize: 10 anchors.right: parent.right font.family: "FontAwesome" - text: from == "me" ? awesome.icons.fa_ellipsis_h : displayname + text: from == "me" ? (awesome.loaded ? awesome.icons.fa_ellipsis_h : "") : displayname } } } diff --git a/qml/widgets/MessageList.qml b/qml/widgets/MessageList.qml index 0925827..779435b 100644 --- a/qml/widgets/MessageList.qml +++ b/qml/widgets/MessageList.qml @@ -87,8 +87,9 @@ ColumnLayout { RowLayout { // THE BOTTOM DRAWER Rectangle { // MESSAGE ENTRY TEXTFIELD id: rectMessage - Layout.fillWidth: true - height: 40 + Layout.fillWidth: 40 * zoomSlider.value + Layout.minimumHeight: 40 * zoomSlider.value + //height: 40 * zoomSlider.value color: "#EDEDED" border.color: "#AAAAAA" radius: 10 @@ -194,14 +195,17 @@ ColumnLayout { } ColumnLayout { + id: colRight spacing: 1 - IconButton { // SEND MESSAGE BUTTON + SimpleButton { // SEND MESSAGE BUTTON id: btnSend - icon: awesome.icons.fa_paper_plane - label: "send" - width: btnEmoji.width + btnAttach.width + 1 + icon: "regular/paper-plane" + text: "send" + Layout.minimumWidth: btnEmoji.width + btnAttach.width + 1 + Layout.maximumWidth: btnEmoji.width + btnAttach.width + 1 + property int nextMessageID: 1 TextEdit { @@ -225,17 +229,18 @@ ColumnLayout { SimpleButton { // EMOJI DRAWER BUTTON id: btnEmoji - text: awesome.icons.fa_smile_o - font: "FontAwesome" + icon: "regular/smile" onClicked: gcd.popup("emoji not yet implemented, sorry") } - IconButton { + SimpleButton { id: btnAttach - icon: awesome.icons.fa_paperclip + icon: "solid/paperclip" - onClicked: gcd.popup("attachments not yet implemented, sorry") + onClicked: { + gcd.popup("attachments not yet implemented, sorry") + } } } } diff --git a/qml/widgets/MyProfile.qml b/qml/widgets/MyProfile.qml index 2e74c04..3481110 100644 --- a/qml/widgets/MyProfile.qml +++ b/qml/widgets/MyProfile.qml @@ -4,6 +4,7 @@ import QtQuick.Controls 2.4 import QtQuick.Controls.Material 2.0 import QtQuick.Controls.Styles 1.4 import QtQuick.Layouts 1.3 +import QtQuick.Window 2.11 ColumnLayout { id: root @@ -146,8 +147,9 @@ ColumnLayout { text: "This is your address. You can give it out to people!\n" + onion } - RowLayout { // TOOLS FOR EDITING PROFILE + Row { // TOOLS FOR EDITING PROFILE anchors.horizontalCenter: parent.horizontalCenter + spacing: zoomSlider.value * 2 TextEdit { // USED TO POWER THE COPY/PASTE BUTTON @@ -155,9 +157,9 @@ ColumnLayout { visible: false } - IconButton { // COPY ONION ADDRESS BUTTON - icon: awesome.icons.fa_clipboard - label: "copy" + SimpleButton { // COPY ONION ADDRESS BUTTON + icon: "regular/clipboard" + text: "copy" onClicked: { gcd.popup("copied to clipboard!") @@ -167,16 +169,14 @@ ColumnLayout { } } - IconButton { // SETTINGS BUTTON - icon: awesome.icons.fa_cog - //label: "settings" + SimpleButton { // SETTINGS BUTTON + icon: "solid/cog" onClicked: theStack.pane = theStack.settingsPane } - IconButton { // SIGN OUT BUTTON - icon: awesome.icons.fa_sign_out - //label: "sign out" + SimpleButton { // SIGN OUT BUTTON + icon: "solid/sign-out-alt" onClicked: { gcd.popup("not yet implemented, sorry :(") @@ -207,6 +207,7 @@ ColumnLayout { color: "#888888" padding: 2 text: hint + selectByMouse: true onTextChanged: { if (text != hint && text != "") { diff --git a/qml/widgets/MyProfile.qmlc b/qml/widgets/MyProfile.qmlc index da21d08616f7c8427c465541bf5798bb26ea748d..4bb0b48e187a94f0df6039359a0b1f86ed70b803 100644 GIT binary patch literal 21412 zcmcJWeUO#aeaFwj?!CJ#>M9%51jB^|MMPK-6%_T#y9&Ap);FpP?DC=udw~VSm~=&` zrUgZ%kv7<(rHz^5$V6@Wf-{f(`=X=j{&hMP_dpW=J^1STEtUfr>>_3GBv)iYZ=TW4N1ZRLzrovUf;Y5$NL|LPb2^V-lS zzTNfA$yfgOJ9Wb@p82dEwhnZ@BxrKgv_b2W|i^+USqgH>i%6a2AJ+iG@=bEgv$(w9kj z<6uc%b79XeF1@h9j8lti&E&t9NRHwmSR^@F?U|U-o{1IgSx%W^?lK^%=C`TtgbzIF z)|Zlgn+lVu?|nCZNG_Pp2@kITZb;l@Az#B=C!maJA~|$$~OCK4cVuZt=sW+k~oxPzt&6XCaR{_ zy{?qW{(I@i>(!c`hmv!Xgh18gEYCQengd?Wl(d|zaWg;Tc+L-Uw9kBsxLM%ZGx=>n zQcfanWY0A~RLyToT_KYkjzF%vu9O>JTi2Mc9eq`v^Fo*hGrW}Qa_(Y1iK_KWlJR+0 zQchhgC+q&)mT`RKlQ6GCWXql=Fb9aL`E5f+dp6LI9@@=InH@m<8!$^zsq&7E3^yamF4`gDdYKLQzX-$r=s&m4`n)+C^n^g@Z&PB zrL$6<+jRcemSO*VnR=paK~9Bs`w zFSgQWS++k-+E`7Xd~qZ?*snDBL-uQ5-02QRwfZN?@!bhqa(3+IqOpF*9wiMso>nq! z$1_SAZ>qIJS&5v^f42isQoj0BUh;Kre$wAHa8ZGh@}GpSyfy^2(~h7RR#0nQs2fu^ ze0-f>8(OqBhz1jHy&2=Jmwto4MM(R&o7&#`}@ysq4q}SuPsun@2nlAFL%$^GJK6=#%V{y!{!^@%yPOdAnrb z9!b|}{^3|CC4(8a7c!393z6L9I?+p+)-A0QqNIIV%am7~>R#$lhIN8!)U!DK6H=`W ze+rg>Z-F)76|fO}8z^pf?c|~{zhj@0`pa(1*VK=%CybjfV3K`9g$+BTd*iVEzel1F z((zL+r-C>PSOde>F#5*4Z@FJCj%EN?&iT^I9;7HLm46Fh0T3na?i;VKWwiS>`tkPs zJ{OJoT}t+Rlb^kRz>fsy-CBMXPnG2A3?KY0>Ud1uB%1=VRdb~T z!hGk_pNljP!}&;y%?BCJvughVkj?)D6p#N5d<>1s)hwtz-_5IS!Rupkks5wIkRCe2 ziIRR#t_RZkRK_?uMP2FeFF-o{EAajuRae#_xFW>y!_*Na_>0`=X$^V5ri37l(s}rMsNuwN( zv&uEjqDrY`hVl>xs;juyn5A_(sB&M_?D_inZ1ObDBJIBxl}axv>UV_eReY7@X)RH9 zF!t5bBG`9=YsJh+o>JQys7MvvQ`GN8zP#1TlW${vjDI2g3sYzBd^z@2`%CZzQ5aLn z4|FlSi~H@RpUr=9-@3}B=8$BCcXM9~6$d$9inrjuHarvT(>Yc0l5=vjE0*8U*<6ab zESH>Zi{OZFnI3QR?&Fmv4b>O*dmS~ei|k9U4--6pCj6NZKfOK}e+K*+(fUzo{kazYwGm(Pbf&O=ELVgt zh|KQ|{)}#1y+dpRCqgz#2j~C3@e(@YxCaG)6pG5-fUFy$dmw7eJI zMxLW-d2d)mK0V%a1I?p+UNk?`<8AiOg+Djqr^nm)bKuX3#>2)tmm06x@YC;_^ZuQ? zWQ*>AFNm)5zxC0)^ckLIw}VqY6XM}qWBK3t@aISTxcKvk2lLlLWG#%|QHOYFiUsqm z^c2u2Io35%E@iKD4ex|?+h8;}eRZC(8N&Sq*TH{R`_5`oJJ=HLES5yiguVj527PpH z4Rja$@UHbS3dOf|(P}J(AKv)}|0nHjgWuNg+3(=&k+Xt5rJxvTSPyl76G*c9zq1{j zyuSVmec$LWa^>f;$}VTT!nXo9c>WOo>z;bOsEhmI-yg-pEYFGfZoB8-2mijv|1F-M zORaZ`?eNWm8rDVTU6mj z_#2~pp1HnOuxFg-cf;?F?3oR}?|Eng{Per-d~{#oJ9As$3!)HD@qLV*Ew+LqoR}Qe%pPO$=l|N<#*~~Jd*lsg}*hmU#s2Ou|LdjyAL#dBrCj2zlEY( zeR1wH%?CYW_$}hb=3ja!cTv78vTso&%f`j@*$F?qb5G3|x2~ufJK*n#=F8W}%fDX~ zBcdnahj->7p5t?zb5Fp3B8unRe47UU&MmZm9RB0cd=2B1^j9zZ-qih=TArQp3GtcK zSF-xQdp|q!f`5|!lkJbQMyBcP$V<=n2}Q|}EM%sGQiFs?Kxp!#5AhR8T$-*B6z0 z7XGu*e7REv++BUyr}ncK{@!Rlgz-$ue+K?DQM|{^K9BLdsHpxW3z?tGcrNt@q|aNj zeQ&fs-tGDN8JvANT7>a#Li6y9^B&({F6Hn2_%r=2M?Uo|@|*C5nDRX9i0L3aA*Ot^ zPFl%fctTA1=$V3*d(l6zyd%gv;m7+v%J28Q`a#VnHExUg zERo882iONI?H?~v{$h0hvpi}u*zq2kkavXZFdo0@`xDpb0g{)H_YyTkVLvbUoc$bv zAHIFj{4bX80G)e~{L7TQ9JT+n`VOI=;Gex*hxq8LZ#%qKk@spJeaBE9=r#D^o0YSr zPl(69`m8|c>&Sb(k3M6AGNf<958tw^ESC>%{tlsC(m#FQL0neu*RhhedZ;MOpGy<` zqwtS@#`)7%pV0k8f00Yg=eLj*zHM0*@h$GHm2?T;*u>|8!TG1}{fc}bvVBC_ipCZ7 z`$Ja*Z|gF8Hx$o@PRhOy|ND`D($6n!fBhc(??vtH{Fd|2Eq#alyaPY|jZHqfZ?_tM z178q@@wwdR?B`v0??(Nv_C*am-;U`R{9~Wf_@&RI_B{Fr$ofI_eq@waBlg!C^3vs4 z>ivl-4Q~AUu8&>}KjFN1X(%9-Z^Ac4T91v=@{;|vM>UeE{2uZLsT{^*E#-AU^kZh+ zdViJPkAFt_&!TUDv>xhyD>?t(habL0N}qRZ&`-cW;ZFIMef`-*=}+PRG#Y>D6F+ft zZXG%Fs`;@yA``g>vHJs?cPer8+y+j0elL05KP2Oe?|I7K^gJH%lks&De)z^|9(=vS zwC7Sj<9-7FC((Kr;`a(;`QPL4`Bo-TqRaI7s3fdsmC_*z{$5p%D8xfjpZAazzL|N* z*UOdv|3+Eq(*N6?!RaGs20cq&hW*U1_7%w`N$7cZBQk zPI0_~2pk2+!5J`|pdSb3f}P+nI0{aJkHI(weHK^*mV+*E02~LS7V!QG%mvFp z7uX5j0B6APg|r9DKo{5v4uLno2jF8+%R`DuU@lk&c7g-oFgONIg6X%y1N*>Xa2$LL zCUL{R2Z z0XxAy5aZ+`fOk$^3`K3hH#ya-G+~zTX(Q-BMa@M^vXsHGOcR*mS4Wwge{%k&JDB(BVPw!`kL0}hg;CCllCIDUrTNs64p{a zjC>_|L5~uCQSa-hEB^;O&yCt8`3n>MD*nvV>-bL4;!e>!hdPQu#gb?=sP6A9z1X*2 zchZw)g~oXevgA+sV-@ndfFvpoT6mKb|4{(RFPdo`*ti7`>r7l-uVihLqcIBOSWo*9 zDT|Ta;kB`OQ@!6xtxWH&=%#pF8QF#iKmL-sIhy(7DBI{`<2v4%ZbYLlQjM@_wwavd zYZX|*^(y%5h<1&zB1&GHOkN%oHG(_HukbZAn-?df*|$&C?MX(f-3tVLm*STY$6AM~ z_fx5r`CY4$MRS(y>94cQN4k(r>fZP&-hp z-@x-X-Aemy7^QjMR?}R5>G895A^pn>vdZR{;(R@_wdc)dyloFK|0?bk$HCv{lh>NL zhI(2fHYN5>MW{-&lBu0qmHaAV^F=$LW<`f@)9uGV=lf*2_H}vvO6p3JE9tR|RQj90 zlA~>Mr1xs-hz4GVlC{n6Ev)Ku%kbU!xRO1xMmvbcr-l6@{3YsZxLq|a=B0t)-6@f9N>_WG_6diGUauWGIBK1em@P3~X2SUUkmYdcT1`^R&qh z=P9jsiV2;wI=LG7oR+L@->j;4eYe#?KZ?%9jAi;R%Mou`>>8*SJ2y*SrL!L*{I?DR z`>%g%`9bZ%*-7)$*6H+lPvv&D*O?;hR`$Oailc${Hu=};Ws3=&BXv$to4zp$%il-H z=Q`aPhwoOqHN+BZ^3te;RLE(vww zzC)e3B-UH|?;3ogy-K8gO>;mivm!{VlG4+#Bh|5k0qby!O&^5;3}rJY7QbF;4(@&(=*X|I(|+ILjG z)$bhJqqhOtKQ|MTs$=(Po6ykaf$d5K+IFI`wU3{;*lwn{j?Y93iQRa%!P394p|5sA z?Q8aH&$9HaD827ZrsQ7q-9oAzOgihXQ9f5&?RK{Nhka36%RcQsWBjukJ+IO86rGHh zQm#{lEYrDHmg{*~C)e_mokP}<@1SSfX>Cm?`BSx>S;kP)_CJl6WNGJBAEFvih|;f- znm^z-zZovwl%ibqA}8d8z=8}o?mrX6rQ>7yVfBt1>8BW7^b){{5-(&apmXFsFyI)AIN1Cq>dJFC8f&61@oO*Na{{b&oD|G+> literal 21392 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 literal 3492 zcmcJRO-x)>6vxlBFifG)(L$@1QYusv#WGS*FeYLpCXF$oWuZya6lUHOWcVlyEj3+s z;ld~jmM&bdaM1;cE?l@EX5zA8(WEXgX-rMr=&Cz4_4mK`U1oqOXj1Rw|IRz--t&3S zy>G5u?ak&!i=$7QS)!rVE`Fc=CZ8}{X*7GKKkDi4$@jgS$@S&?qNsNulh5bIGJTm$ zejpQN2F~=1^=G3zs%~8Sqy6WNyD!e4`=W9DqldSDANl+9KYxAWhxKIVFSmazuD(~t zs^`E;$}9<80~$Yh;wY}|Ud;aneaPs53Yzj1Qt$Rzs^Y#%ih0@>2KndEHUsYJ51rXiJTzL;vLtq)$zjm0=+oYx^NWKV^XT@1I=HOknt&yeNol$ zGa%ht2>0Ws2F-?824T;K?I1@@I$fX%zKQ;&hEDbp)(#;%gzP&ONw=JVW3Z7)G}@X> zxHF=8$M|V<UIz87XTILnoxpEN$kt5tuCsQqZHdD1-(Y*tfj z3-c|OcKUAGJrr%Z?<5NGRHIT3@>!?vABP=DZiz>}cHSqC$Di&W^+M}oV9OR?d^@T zasm(I*pR&}D+_M5|6Fxgubs6s*2nKv<~4K|%@J7+%>}%Wnv1gtKZ>@V@~y}P`MMZ=*Jaw}M?quHpSDj-CF3&9F}O zRcxxyywmpIfGob{FG7BfHx1o)yVtjxmfz1=qFF?{VCQ-Jgf}zY2fN#=rWN+(Z7csU z#GsY!T{6+0MD`|;N7Tm4r>e+(T~)b))Vb&PiYM>t>{olc+LgD^udManc~#T${qPPk zUypY}-xIAoPe+fkOA+^8=xlY7{_pHwzumMs_vp_*!ZuUxJgD!ouA)Z0)px2_WUpDb z`>AuL;Jd*bKlPD1e;SF-;f#IEj85`Al6fRq=os<^)+ncLyMl!R)Su