From a32fd01e81b0ef11ad82bac46c0a03088adf70d8 Mon Sep 17 00:00:00 2001 From: Anika Raemer Date: Fri, 19 Oct 2018 22:01:14 +0200 Subject: [PATCH] added backnavigation and qrc --- .gitignore | 1 + LenaPi/LenaPi.pro | 3 +- LenaPi/NavigationListDelegate.qml | 9 +-- LenaPi/RoundButton.qml | 32 ++++++++ LenaPi/controllers/NavigationController.cpp | 9 --- LenaPi/lenapi.qrc | 7 ++ LenaPi/main.qml | 82 +++++++++++--------- LenaPi/models/NavigationItemModel.cpp | 17 +++- LenaPi/models/NavigationItemModel.h | 4 +- LenaPi/models/NavigationListModel.cpp | 22 ++++++ LenaPi/models/NavigationListModel.h | 6 ++ LenaPi/qml.qrc | 1 + LenaPi/resources/back.png | Bin 0 -> 1246 bytes LenaPi/resources/defaultImage.png | Bin 0 -> 5517 bytes LenaPi/resources/sky.jpg | Bin 0 -> 6587 bytes 15 files changed, 138 insertions(+), 55 deletions(-) create mode 100644 LenaPi/RoundButton.qml create mode 100644 LenaPi/lenapi.qrc create mode 100644 LenaPi/resources/back.png create mode 100644 LenaPi/resources/defaultImage.png create mode 100644 LenaPi/resources/sky.jpg diff --git a/.gitignore b/.gitignore index 5c77fa9..91ccddb 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ build-LenaPi-Desktop-Debug +*.autosave diff --git a/LenaPi/LenaPi.pro b/LenaPi/LenaPi.pro index 500cd12..ab0a5a5 100644 --- a/LenaPi/LenaPi.pro +++ b/LenaPi/LenaPi.pro @@ -8,7 +8,8 @@ SOURCES += main.cpp \ models/NavigationItemModel.cpp \ controllers/NavigationController.cpp -RESOURCES += qml.qrc +RESOURCES += qml.qrc \ + lenapi.qrc # Additional import path used to resolve QML modules in Qt Creator's code model QML_IMPORT_PATH = diff --git a/LenaPi/NavigationListDelegate.qml b/LenaPi/NavigationListDelegate.qml index 753d9f8..0dddbd6 100644 --- a/LenaPi/NavigationListDelegate.qml +++ b/LenaPi/NavigationListDelegate.qml @@ -7,14 +7,14 @@ Rectangle{ property var model property alias imageSource: contentImage.source - width: 100 - height: width - radius: model.pIsCircleDelegate ? width/2 : 0 + width: height + height: 150 + radius: model.pIsCircleDelegate ? height/2 : 0 color: "blue" Image{ id: contentImage - source: model ? model.pImageSource : "file:///home/ar/source/LenaPi/pics/benjamin.jpeg" + source: model ? model.pImageSource : "qrc:/default_image" anchors.centerIn: parent width: parent.width-10 height: width @@ -29,7 +29,6 @@ Rectangle{ anchors.fill: parent onClicked:{ model.onClicked(); - console.log("circle clicked") } } } diff --git a/LenaPi/RoundButton.qml b/LenaPi/RoundButton.qml new file mode 100644 index 0000000..2323615 --- /dev/null +++ b/LenaPi/RoundButton.qml @@ -0,0 +1,32 @@ +import QtQuick 2.0 + +Rectangle { + id: container + property alias imageSource: image.source + signal clicked(); + + border.width: 2 + border.color: "grey" + + color: "white" + + width: 50 + height: width + radius: width/2 + + Image{ + id: image + anchors.centerIn: parent + width: 30 + height: width + source: "qrc:/icon_back" + } + + MouseArea{ + id: controlObject + anchors.fill: parent + onClicked:{ + container.clicked(); + } + } +} diff --git a/LenaPi/controllers/NavigationController.cpp b/LenaPi/controllers/NavigationController.cpp index c528e98..556f163 100644 --- a/LenaPi/controllers/NavigationController.cpp +++ b/LenaPi/controllers/NavigationController.cpp @@ -42,7 +42,6 @@ void NavigationController::add(const QString &path, NavigationItemModel *parentI if(!dir.exists()) return; auto subDirsNames = dir.entryList(QDir::AllDirs); - qDebug() << path << subDirsNames; for(const auto& name : subDirsNames){ if(name == "." || name == "..") continue; @@ -51,19 +50,11 @@ void NavigationController::add(const QString &path, NavigationItemModel *parentI item->deleteLater(); continue; } - qDebug() << "appending item " << item->getPath(); item->setCircleDelegate(isCircleDelegate); connect(item, &NavigationItemModel::clicked, this, &NavigationController::onNavigationRequest); parentItem->appendChild(item); add(item->getPath(), item, false); } - - // just for testing! - auto list = parentItem->getChildren(); - for (const auto& elem: list){ - qDebug() << elem->getImageSource() << elem->isCircleDelegate(); - } - // end testing } void NavigationController::onNavigationRequest() diff --git a/LenaPi/lenapi.qrc b/LenaPi/lenapi.qrc new file mode 100644 index 0000000..174a464 --- /dev/null +++ b/LenaPi/lenapi.qrc @@ -0,0 +1,7 @@ + + + resources/back.png + resources/defaultImage.png + resources/sky.jpg + + diff --git a/LenaPi/main.qml b/LenaPi/main.qml index c229698..47011d1 100644 --- a/LenaPi/main.qml +++ b/LenaPi/main.qml @@ -8,44 +8,54 @@ Window { height: 480 title: "LenaPi 1.0" - MyScrollView{ - id: circleList - anchors.left: parent.left - anchors.right: parent.right + Image{ + id: background + + anchors.fill: parent + z: -1 + source: "qrc:/background" + } + + RoundButton{ + id: back + anchors.top: parent.top + anchors.left: parent.left anchors.margins: 20 - flickableItem.interactive: true - contentItem: - ListView{ - model: navigationList.pModelItems - anchors.fill: parent - spacing: 10 - orientation: ListView.Horizontal - delegate: - NavigationListDelegate{ - id: delegate - model: navigationList.pModelItems[index] - } - } - } -// MyScrollView{ -// anchors.left: parent.left -// anchors.right: parent.right -// anchors.top: circleList.bottom -// anchors.margins: 20 + visible: navigationList.pIsBackVisible + + onClicked: navigationList.navigateBack(); + } + + Rectangle{ + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + + height: 210 + + color: "#99ffffff" + + ListView{ + id: circleList + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.margins: 20 + + height: parent.height - 40 + + model: navigationList.pModelItems + spacing: 20 + orientation: ListView.Horizontal + delegate: + NavigationListDelegate{ + id: delegate + height: parent.height + model: navigationList.pModelItems[index] + } + } + } -// flickableItem.interactive: true -// contentItem: -// ListView{ -// model: 20 -// anchors.fill: parent -// spacing: 10 -// orientation: ListView.Horizontal -// delegate: -// NavigationListDelegate{ -// id: test -// } -// } -// } } diff --git a/LenaPi/models/NavigationItemModel.cpp b/LenaPi/models/NavigationItemModel.cpp index e57fb5f..1263d19 100644 --- a/LenaPi/models/NavigationItemModel.cpp +++ b/LenaPi/models/NavigationItemModel.cpp @@ -3,9 +3,10 @@ #include #include -NavigationItemModel::NavigationItemModel(QObject *parent) : QObject(parent) +NavigationItemModel::NavigationItemModel(QObject *parent) : QObject(parent), + mImageSource("qrc:/default_image"), + mParentItem(qobject_cast(parent)) { - ///@todo init imageSource with defaul image from qrc } QString NavigationItemModel::getImageSource() const @@ -57,7 +58,7 @@ void NavigationItemModel::setCircleDelegate(bool value) bool NavigationItemModel::isRoot() const { - return mParentItem; + return !mParentItem; } NavigationItemModel *NavigationItemModel::getParentItem() @@ -75,6 +76,16 @@ QList NavigationItemModel::getChildren() return mChildren; } +QList NavigationItemModel::getSiblings() +{ + if(isRoot()){ + return QList(); + } else{ + return mParentItem->getChildren(); + } + +} + void NavigationItemModel::appendChild(NavigationItemModel *item) { item->setParent(this); diff --git a/LenaPi/models/NavigationItemModel.h b/LenaPi/models/NavigationItemModel.h index f789f43..ce74cda 100644 --- a/LenaPi/models/NavigationItemModel.h +++ b/LenaPi/models/NavigationItemModel.h @@ -32,6 +32,8 @@ public: bool hasChildren() const; QList getChildren(); + QList getSiblings(); + void appendChild(NavigationItemModel* item); void clearChildren(); @@ -43,7 +45,7 @@ private: bool mIsCircleDelegate = false; QList mChildren = QList(); - NavigationItemModel* mParentItem = nullptr; + NavigationItemModel* mParentItem; }; #endif // NAVIGATIONITEMMODEL_H diff --git a/LenaPi/models/NavigationListModel.cpp b/LenaPi/models/NavigationListModel.cpp index 78645ca..4369b46 100644 --- a/LenaPi/models/NavigationListModel.cpp +++ b/LenaPi/models/NavigationListModel.cpp @@ -18,5 +18,27 @@ void NavigationListModel::setModelItems(QList list) for(const auto& item : list){ mItems.append(item); } + + if(mItems.isEmpty()){ + mIsBackVisible = false; + } else{ + mIsBackVisible = !list.at(0)->getParentItem()->isRoot(); + } + emit modelItemsChanged(); } + +bool NavigationListModel::isBackVisible() +{ + return mIsBackVisible; +} + +void NavigationListModel::navigateBack() +{ + if(!mIsBackVisible || mItems.isEmpty()) return; + + auto item = qobject_cast(mItems.at(0)); + if(!item || item->getParentItem()->isRoot()) return; + + setModelItems(item->getParentItem()->getSiblings()); +} diff --git a/LenaPi/models/NavigationListModel.h b/LenaPi/models/NavigationListModel.h index 632aabc..6f4e65e 100644 --- a/LenaPi/models/NavigationListModel.h +++ b/LenaPi/models/NavigationListModel.h @@ -9,6 +9,7 @@ class NavigationListModel : public QObject { Q_OBJECT Q_PROPERTY(QList pModelItems READ getModelItems NOTIFY modelItemsChanged) + Q_PROPERTY(bool pIsBackVisible READ isBackVisible NOTIFY modelItemsChanged) signals: void modelItemsChanged(); @@ -19,8 +20,13 @@ public: QList getModelItems(); void setModelItems(QList list); + bool isBackVisible(); + + Q_INVOKABLE void navigateBack(); + private: QList mItems; + bool mIsBackVisible = false; }; #endif // NAVIGATIONLISTMODEL_H diff --git a/LenaPi/qml.qrc b/LenaPi/qml.qrc index 71cf2ab..c5bae7c 100644 --- a/LenaPi/qml.qrc +++ b/LenaPi/qml.qrc @@ -4,5 +4,6 @@ MainForm.ui.qml NavigationListDelegate.qml MyScrollView.qml + RoundButton.qml diff --git a/LenaPi/resources/back.png b/LenaPi/resources/back.png new file mode 100644 index 0000000000000000000000000000000000000000..e9cd55e0314f8c919af7d2f4d3c286d62c2707ac GIT binary patch literal 1246 zcmV<41R?v0P)&+b#?La@#p8~q@<*KdwW(^R*;a8%gf73N=mxAx~QnAK|w({I5;pc zFoA)A;o;$AWMph?Z1?x~Gcz+PC@;7WrWBf8~2K?9? zz77g9H!Oz*c^jqzf}9PLgNPtw!?lnfW5YK=LAHj4s32EEkx7)b;XtCs-|$gFkfY(Y zZpts;S>mPO4X4ScZoXI>vo$Pu#UY&@i#(oCbq*D;9be^Y&(1rRMrc} z_DdZo>@eKT)vkCY3-%W@y9521itWfnsi=Yi1+i{G&T5?8)VFaU3P!dA7l&vlUrJ&P zq9LJ{#1=5@fI-gv1JRJpau}YehMDciMR}$gvRN)RR6{oFMM*Z~l6tG0wzWSwcMYW* zC>FV?+O4o$p}G~wQ|Vu}w&Nd0wNHa=HNJTkiiYkV39AY^f2^sL-cCoqg zbrXt*v?}YbqI~;LE+S3S&3Sc^y8LIoHRD#_6Nq{m&JF)o+5FYo_!CEAU1agHD^SU9 zxERtE*%*>{8hi|?Pn{VV5_kQa3~A-XK#TQ1lhQiJF_!v8X z$aavpuF|Qe->e1z00000000000000000000000000089p1Nw7E0dtp<5C8xG07*qo IM6N<$f>!QBK>z>% literal 0 HcmV?d00001 diff --git a/LenaPi/resources/defaultImage.png b/LenaPi/resources/defaultImage.png new file mode 100644 index 0000000000000000000000000000000000000000..8024a0eefb3792b7c46ed09b35c08727b3a2e6fe GIT binary patch literal 5517 zcmV;86>{o{P)S+iq~PG-yu7@ss;V0s8+LYfR8&+xK0dOtvLz)YXJ==Xm6b_JNpNs* zIyyQK5D;BmU4nvwGcz+QD=UhMicCyQot>Q>9UT=F6)!I@he~Lj000!YNkl_*Fk{)hKJybgG_9G?9>@L~xotI5hbXGMmOUe+>tLNYTlA)7u-DCF3-!-WEh3k4Jx z3Ml^0f#O`~Po21A;*?BmCR7Yx<3a(&g#wBT1r!sCI3*LS#>9wBHq(Y{n=!^_vGpH? zH`*WoJ6i>weKzgP87T`z@SvDJ79|oOeE28>Dg?>{$^$9{Dg(*~Dxri01Y=?eCIqMy zJ_`gB#?A%G6-*er0H_q05W&teB@=tm4TE5_*VSVX#0-vV2Enc~F=nKO%7p4F^$jz| zwfe98w6W!5NvgWK$%Pz_Z6t!_W1I$c`N?!)?@Fy-AEac>7rf> z$&%Ujc(`HsHoKeKIYM(pmec9>h2h(*ey!IMCs}?x+}`dUF#fwf&SA>LD9cIoc~~#z zJ3N_CfG^81`aXEJo`=w45FGjugBRTFcIAwl!w1Q9HM{xvczS>5A5Iv)=Nm#wgJ7R9 zF(Z?O5_sq&OnpL$0H_eCj8X7M4=4|)5U7k2gi!%dK2Y#S0z}H0#Npzpm|zq9_c&YK zuJ1R`SbW6MF?@J8_X1zA6HJWA#O!U;Ac$>@-SiOb(nF9L1n#vY`3D2QM@YabQE_Mj zAKu47uaO!k6ROV`Bg;D4zF}Mgz$V(H<>7x>JIU|yTAZCwKBWgt=prMRg=Y`-5KavO ztXA7QHoLUo(E(g0#g_fVYZ)&S^5F^SlK~OdDGw+YC>JOXs1T^EP6;OA^iglw|i>gefy%qqciLF3LpQ9IDwbycUI~X2A z_{#r%lknP<(-w+gpDKba6v1vN0-WL5{(KBLhVN}IRnB2Dp$wi7o;u|L;R?zF$`w@0 z58}_e0am4f56{pU;}J43E8FKGz-#FD5awgSae$w$lGmapQ}LKsLSM(DV=LfIc$Hqu zf-MxmZdU|bq6ljf=omu0HYF2$5greou#2j`)gogWitM5eDckt&w$Ged-6~GkcXZIiDd(FWUupT~M?!W3dPrkEAhs#u%mWC0o zJOo7}>`b4v_pW!l+ZpvPV~_!%)!X6Y3?BXBj0}~@pw~i{532AuhWq_I$zrZjC6jQq zUDvq40h32grrl3@E!kcN-N%ZeBGH*aNP=)%8$XQa^I2jDo`!OsxvyX9@D5-OWs!j- zs|_H2S>uoCK$$A#Y}tIc{hJTB{6RQVLdVoHNA5Y3YA@rW)zirU!Y^LJAu^qAh}ygs zTiHX1tb3)gqoRJTkn32j2BAFP%JNNP22%5)zn!&DwzK1w^+3tj1aMnRVa8}pPNq+ zm5Uv%1MdSw=oZ~8AO4!lR7x!C5S8Qayupg9wU$gy^AMgr!oPoinUvvOKdFUx+XB6A8R#uSzTN^hF7kyP<6Rn`FmVNwdfYe>apUxO1`i*Rj!ZzE z1fQ#Q4`#4ln4VC0@7B9~>|VTnm9niWDi=-96rngc8=5*W&TDzZukw{0f90ApCRv>` z!|%49Oy=Na8@xKo2XEzR!pmBWFf5xF^jf+M0^P$*UnKCT(Fqh%#cKw^ZBcZXe8ZEj zcp^!Wo|gJ$Qd%m~(^8(E#^xg<|wF z9hoS_Q|917>~XAN$%S)_?`0Vs50Tc# zXS|l9ijJL>#MSD1WwnZ~GPooprW?vd^`MjofY`1XgqmPj&Rzzx=e z7jLBd4l#P8ycRT|cErl>+6_z23*1y{M|go--nD65Y1XqaI2EvyfwROr2Z{>?lqdzX z#5=brzqmCzgx{U0V#k<-Kyjgf66J{&6DmnMj!QBA40L2V9YX#LUH8s+*Ib^Rr)Q*G z$s8`&ja~PK!)uibUbogP&Rad7D}d*=*mFFY6D@e&Ti0Qt8LveI8dMBI;>Zq1K%S>e zui~{kp$R|ak)BK^UQ1gDMRFqC8m>rh&%&2@gXD)&=OL7=Cp3>=bY(J__<_*hv*VF_ z9W^KOKRsvodtI4~CVn&z5a`C_er-QfmXIc@WW@&I-?-c-408~gR>Yc|i_0B2f0+j&;yMF||0<5Z606G~ys!mbK z&Ifjk31jC0YiMGT{&Xgm8F3X2 zO~N%U>P6qDDydRdaMPdTO1(|;0A_o!{=Y8;qqcV0AeDtoQp-EZGOCTV&>)CsR{hG;20G{V$ zyi6z2*;GVlQxOSG+asZ=h=itrh=fuW-khpk&SrH`XCk7ri1ceFi#yF+12UOzXhJs+ zH<@5}ZVTk{=@|e zO8S#fQ1HtXcqD=eV;9!hQ6_Yv_pb;H-Y(3{$i&`<@rEW6gP@do4YeHRWa5vRWxZz> zlVw++q`)>|^$x~l`aXD(b9S8FhHkT-C8pt3xzrjSLNjlP ztOV9`znn2w+0dj5UQ7B!6W<+o#V!J`QUu!`T!!1GoHkR=K35t%%{h@8sSz^qt^*f+ zJS5Nd6Ep7^U*z95($J*aAfS#KsuJGpOb@Q6p-JD2ar)ZMK@B3(*;-wd*K+JTJSuj0 z7lCJYtX4)`>fozqMTfj{bf%m}WU^7ebKuIH10~lb?VEWRZvt1{|Iw2PN#6N@<{_;H zA)0n)9Z|*oB3j<-_ck=?nK53^J_xg%s^8l3-g4gh%*qYAIJ{o>b?8B$9rd)#z%Rf> zRXMd~GS}g;or+gIc4h0Uvm4Oi(GurdgATl_?7QaqR?#b9(GBnKGAfzC`Iar17?J7n z%X+7B;^$eYxwX13uVvZ2EWDHKvhaGnmNEA+BEdxq}6Or5^ z%SNes1)L<3ROusCnZIBH*(lkp$DdxKlWdea6EiZIy9-4)998N-AgM$bQ*YLOIg-J< zP%gQwd$M*J1-ggq*Iv{EOtNlx6Nu(r7@ovyF>?%TJIc+ODkLqo5XEUkD0ov0Xuh`vZ>){UE&2 zK4%3lo;?&b-`EY3Y=3)L3`@Qn>T@>Bk>E3h?qU@yAz5q3vt-Ke$-tW|ve>b7+}&Nw zHYJmhh9+&URO0~X$R^z<6H0af#0O65-VKro$yCa0x@x?CzQen$p;EtpSuYJjx}4^o zdkyf0o=SBa1p0}pL2%5;BtPd=>WSKY&N;9rs{EW&TP9h$s*zLbF`+agGJRu_jZCF} zWLf`L!W$DytMUg%_X;o=-(!70Vi5_gw_aE3)$RQ1%PWn23akesN*Lz%^9rcY7@{N~6G;?GKN;^=dK8XU@;T8-M6lgU6IJ zck|mvakJ$Y{`)$cT7E#3`WG0Hi8VCw#dS7q7smA8Kf{wWl9DR##6gEmc}KaxIC=Qk z&%Cg~q`H45s4*EWlj(*grv@R}HIAr@`_S;m)^Q?zujL9Fnw-oSlC4_Ka5=#D-IDNh zvft{pMDv3*9T4t)+^wSTfj1^^x!fL~M+U6Ct3ZPd;R^NjFBmD4#WUe$m+&dxn#ZYA zCZQjC@wD?sTFh>LYcgR}U`i&X(%{NN=sXdwdo6B$^C`O@qXKxF>3S{K(a^+$z}|D; zg~IrOU77ORyp{;M0pq*nJwKH08o$Liz^fEN60Xpz0JB+ZQT)8Wzw5ah6Z59p-RY_$ zWNK?@qFO5_Er?0?JWztSfAHp6I4o`OpyT_1`WjW4hPAx!_FBruGjwEb@L};#I%bmb z`%G+IuSNYjdGpJ91T78=NAnBg-85$_pftl}Qsj&O7O#bf%e)w>w;5XC^^-Kg1@FmE z71`KBlrs`-28v+iaf{!drFTRX7iuXN*=WdQBM%h)U2<}-M!-9~mA!FKVBs8 zL0HaK>*wa762?1z^@b$B>FR5U#EhYX5#;OL!w1H1PXgxNO@41)OVc2b7)5D5pDt!= z{0HXaA&b7hH25M(SCv5sEkdRX$IX{>$I|R@t)Fzo)6?QKF4EH|C9>Vh`?e@m+_xpt z(_)dH7KtAra4Na~sUG?7w zPvW(hNflSA9Z@$@gBzMuy#k_PoE;Go<2oVJ$+hw1w>V^0G{YyGGXkB zME{ZrW5*Ny1(UY^1;b@xI1L#DiAtI2UvQNTO@4e9|0m$p&hQL2G|}%B&{9A zs^TZ_JRAPbD<;)lD9v|nN#41%JaLdr-%(s@OwF&Yp~;WW;{W0OYIy$u>k(1h9{cs` P00000NkvXXu0mjf9WIAl literal 0 HcmV?d00001 diff --git a/LenaPi/resources/sky.jpg b/LenaPi/resources/sky.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7002f7b5fc5ffb956375880607fb0b7dbace245e GIT binary patch literal 6587 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 Rva&*M1r=U@KM1>D_%EqmM3Vpj literal 0 HcmV?d00001