├── .gitignore ├── LICENSE ├── README.md ├── harbour-kaktus.desktop ├── icons ├── 108x108 │ └── harbour-kaktus.png ├── 128x128 │ └── harbour-kaktus.png ├── 150x150 │ └── harbour-kaktus.png ├── 172x172 │ └── harbour-kaktus.png ├── 256x256 │ └── harbour-kaktus.png └── 86x86 │ └── harbour-kaktus.png ├── images ├── z1.0 │ ├── icon-m-bad-selected.png │ ├── icon-m-bad.png │ ├── icon-m-browser.png │ ├── icon-m-filter-0.png │ ├── icon-m-filter-1.png │ ├── icon-m-filter-2.png │ ├── icon-m-fontdown.png │ ├── icon-m-fontup.png │ ├── icon-m-friend.png │ ├── icon-m-good-selected.png │ ├── icon-m-good.png │ ├── icon-m-item.png │ ├── icon-m-like-selected.png │ ├── icon-m-like.png │ ├── icon-m-netvibes.png │ ├── icon-m-night0.png │ ├── icon-m-night1.png │ ├── icon-m-night2.png │ ├── icon-m-oldreader.png │ ├── icon-m-pocket.png │ ├── icon-m-read-selected.png │ ├── icon-m-read.png │ ├── icon-m-readabove.png │ ├── icon-m-reader-selected.png │ ├── icon-m-reader.png │ ├── icon-m-rss.png │ ├── icon-m-selector.png │ ├── icon-m-share-selected.png │ ├── icon-m-share.png │ ├── icon-m-ttrss.png │ ├── icon-m-vm0.png │ ├── icon-m-vm1.png │ ├── icon-m-vm2.png │ ├── icon-m-vm3.png │ ├── icon-m-vm4.png │ ├── icon-m-vm5.png │ ├── icon-m-vm6.png │ └── icon-m-webview.png ├── z1.25 │ ├── icon-m-bad-selected.png │ ├── icon-m-bad.png │ ├── icon-m-browser.png │ ├── icon-m-filter-0.png │ ├── icon-m-filter-1.png │ ├── icon-m-filter-2.png │ ├── icon-m-fontdown.png │ ├── icon-m-fontup.png │ ├── icon-m-friend.png │ ├── icon-m-good-selected.png │ ├── icon-m-good.png │ ├── icon-m-item.png │ ├── icon-m-like-selected.png │ ├── icon-m-like.png │ ├── icon-m-netvibes.png │ ├── icon-m-night0.png │ ├── icon-m-night1.png │ ├── icon-m-night2.png │ ├── icon-m-oldreader.png │ ├── icon-m-pocket.png │ ├── icon-m-read-selected.png │ ├── icon-m-read.png │ ├── icon-m-readabove.png │ ├── icon-m-reader-selected.png │ ├── icon-m-reader.png │ ├── icon-m-rss.png │ ├── icon-m-selector.png │ ├── icon-m-share-selected.png │ ├── icon-m-share.png │ ├── icon-m-ttrss.png │ ├── icon-m-vm0.png │ ├── icon-m-vm1.png │ ├── icon-m-vm2.png │ ├── icon-m-vm3.png │ ├── icon-m-vm4.png │ ├── icon-m-vm5.png │ ├── icon-m-vm6.png │ └── icon-m-webview.png ├── z1.5-large │ ├── icon-m-bad-selected.png │ ├── icon-m-bad.png │ ├── icon-m-browser.png │ ├── icon-m-filter-0.png │ ├── icon-m-filter-1.png │ ├── icon-m-filter-2.png │ ├── icon-m-fontdown.png │ ├── icon-m-fontup.png │ ├── icon-m-friend.png │ ├── icon-m-good-selected.png │ ├── icon-m-good.png │ ├── icon-m-item.png │ ├── icon-m-like-selected.png │ ├── icon-m-like.png │ ├── icon-m-netvibes.png │ ├── icon-m-night1.png │ ├── icon-m-night2.png │ ├── icon-m-oldreader.png │ ├── icon-m-pocket.png │ ├── icon-m-read-selected.png │ ├── icon-m-read.png │ ├── icon-m-readabove.png │ ├── icon-m-reader-selected.png │ ├── icon-m-reader.png │ ├── icon-m-rss.png │ ├── icon-m-selector.png │ ├── icon-m-share-selected.png │ ├── icon-m-share.png │ ├── icon-m-ttrss.png │ ├── icon-m-vm0.png │ ├── icon-m-vm1.png │ ├── icon-m-vm2.png │ ├── icon-m-vm3.png │ ├── icon-m-vm4.png │ ├── icon-m-vm5.png │ ├── icon-m-vm6.png │ └── icon-m-webview.png ├── z1.5 │ ├── icon-m-bad-selected.png │ ├── icon-m-bad.png │ ├── icon-m-browser.png │ ├── icon-m-filter-0.png │ ├── icon-m-filter-1.png │ ├── icon-m-filter-2.png │ ├── icon-m-fontdown.png │ ├── icon-m-fontup.png │ ├── icon-m-friend.png │ ├── icon-m-good-selected.png │ ├── icon-m-good.png │ ├── icon-m-item.png │ ├── icon-m-like-selected.png │ ├── icon-m-like.png │ ├── icon-m-netvibes.png │ ├── icon-m-night0.png │ ├── icon-m-night1.png │ ├── icon-m-night2.png │ ├── icon-m-oldreader.png │ ├── icon-m-pocket.png │ ├── icon-m-read-selected.png │ ├── icon-m-read.png │ ├── icon-m-readabove.png │ ├── icon-m-reader-selected.png │ ├── icon-m-reader.png │ ├── icon-m-rss.png │ ├── icon-m-selector.png │ ├── icon-m-share-selected.png │ ├── icon-m-share.png │ ├── icon-m-ttrss.png │ ├── icon-m-vm0.png │ ├── icon-m-vm1.png │ ├── icon-m-vm2.png │ ├── icon-m-vm3.png │ ├── icon-m-vm4.png │ ├── icon-m-vm5.png │ ├── icon-m-vm6.png │ └── icon-m-webview.png ├── z1.75 │ ├── icon-m-bad-selected.png │ ├── icon-m-bad.png │ ├── icon-m-browser.png │ ├── icon-m-filter-0.png │ ├── icon-m-filter-1.png │ ├── icon-m-filter-2.png │ ├── icon-m-fontdown.png │ ├── icon-m-fontup.png │ ├── icon-m-friend.png │ ├── icon-m-good-selected.png │ ├── icon-m-good.png │ ├── icon-m-item.png │ ├── icon-m-like-selected.png │ ├── icon-m-like.png │ ├── icon-m-netvibes.png │ ├── icon-m-night0.png │ ├── icon-m-night1.png │ ├── icon-m-night2.png │ ├── icon-m-oldreader.png │ ├── icon-m-pocket.png │ ├── icon-m-read-selected.png │ ├── icon-m-read.png │ ├── icon-m-readabove.png │ ├── icon-m-reader-selected.png │ ├── icon-m-reader.png │ ├── icon-m-rss.png │ ├── icon-m-selector.png │ ├── icon-m-share-selected.png │ ├── icon-m-share.png │ ├── icon-m-ttrss.png │ ├── icon-m-vm0.png │ ├── icon-m-vm1.png │ ├── icon-m-vm2.png │ ├── icon-m-vm3.png │ ├── icon-m-vm4.png │ ├── icon-m-vm5.png │ ├── icon-m-vm6.png │ └── icon-m-webview.png └── z2.0 │ ├── icon-m-bad-selected.png │ ├── icon-m-bad.png │ ├── icon-m-browser.png │ ├── icon-m-filter-0.png │ ├── icon-m-filter-1.png │ ├── icon-m-filter-2.png │ ├── icon-m-fontdown.png │ ├── icon-m-fontup.png │ ├── icon-m-friend.png │ ├── icon-m-good-selected.png │ ├── icon-m-good.png │ ├── icon-m-item.png │ ├── icon-m-like-selected.png │ ├── icon-m-like.png │ ├── icon-m-netvibes.png │ ├── icon-m-night0.png │ ├── icon-m-night1.png │ ├── icon-m-night2.png │ ├── icon-m-oldreader.png │ ├── icon-m-pocket.png │ ├── icon-m-read-selected.png │ ├── icon-m-read.png │ ├── icon-m-readabove.png │ ├── icon-m-reader-selected.png │ ├── icon-m-reader.png │ ├── icon-m-rss.png │ ├── icon-m-selector.png │ ├── icon-m-share-selected.png │ ├── icon-m-share.png │ ├── icon-m-ttrss.png │ ├── icon-m-vm0.png │ ├── icon-m-vm1.png │ ├── icon-m-vm2.png │ ├── icon-m-vm3.png │ ├── icon-m-vm4.png │ ├── icon-m-vm5.png │ ├── icon-m-vm6.png │ └── icon-m-webview.png ├── kaktus.pro ├── qhttpserver ├── LICENSE ├── README.md ├── http_parser.c ├── http_parser.gyp ├── http_parser.h ├── qhttpconnection.cpp ├── qhttpconnection.h ├── qhttprequest.cpp ├── qhttprequest.h ├── qhttpresponse.cpp ├── qhttpresponse.h ├── qhttpserver.cpp ├── qhttpserver.h ├── qhttpserver.pri ├── qhttpserverapi.h └── qhttpserverfwd.h ├── qml ├── AboutPage.qml ├── AccountsDialog.qml ├── ActiveDetector.qml ├── AuthWebViewPage.qml ├── ButtonItem.qml ├── CachedImage.qml ├── ChangelogPage.qml ├── ClickableLabel.qml ├── ControlBar.qml ├── CoverPage.qml ├── DashboardDialog.qml ├── DashboardPage.qml ├── DebugPage.qml ├── Dot.qml ├── EntryDelegate.qml ├── EntryPage.qml ├── EntryPageContent.qml ├── ErrorPage.qml ├── FeedIcon.qml ├── FeedPage.qml ├── FeedWebContentPage.qml ├── FirstPage.qml ├── HintLabel.qml ├── IconBar.qml ├── IconBarItem.qml ├── IconContextMenu.qml ├── IconMenuItem_.qml ├── IconPlaceholder.qml ├── IconSlider.qml ├── LogItem.qml ├── MenuIconItem.qml ├── Notification.qml ├── NvSignInDialog.qml ├── OldReaderSignInDialog.qml ├── PaddedLabel.qml ├── PageMenu.qml ├── Pocket.qml ├── PocketAuthWebViewPage.qml ├── PocketDialog.qml ├── ProgressPanel.qml ├── ReadAllDialog.qml ├── SettingsPage.qml ├── ShareDialog.qml ├── ShareLinkPage.qml ├── SignOutDialog.qml ├── SimpleListItem.qml ├── SmallIconButton.qml ├── Spacer.qml ├── TTRssSignInDialog.qml ├── TabPage.qml ├── TempBaner.qml ├── TextAreaItem.qml ├── TextFieldItem.qml ├── TextSwitchWithIcon.qml ├── UnreadAllDialog.qml ├── UnreadBox.qml ├── WebPreviewPage.qml ├── main.qml └── sprite-icons.png ├── rpm └── harbour-kaktus.spec ├── sailfishapp_i18n.pri ├── scripts ├── Readability.js ├── night_mode.js ├── reader_view.js ├── theme.js └── zoom.js ├── src ├── cacheserver.cpp ├── cacheserver.h ├── customnetworkaccessmanager.cpp ├── customnetworkaccessmanager.h ├── dashboardmodel.cpp ├── dashboardmodel.h ├── databasemanager.cpp ├── databasemanager.h ├── downloadmanager.cpp ├── downloadmanager.h ├── entrymodel.cpp ├── entrymodel.h ├── feedmodel.cpp ├── feedmodel.h ├── fetcher.cpp ├── fetcher.h ├── iconprovider.cpp ├── iconprovider.h ├── info.h ├── key.h ├── listmodel.cpp ├── listmodel.h ├── main.cpp ├── networkaccessmanagerfactory.cpp ├── networkaccessmanagerfactory.h ├── nvfetcher.cpp ├── nvfetcher.h ├── nviconprovider.cpp ├── nviconprovider.h ├── oldreaderfetcher.cpp ├── oldreaderfetcher.h ├── settings.cpp ├── settings.h ├── simplecrypt.cpp ├── simplecrypt.h ├── singleton.h ├── tabmodel.cpp ├── tabmodel.h ├── ttrssfetcher.cpp ├── ttrssfetcher.h ├── utils.cpp └── utils.h └── translations ├── kaktus_cs.ts ├── kaktus_de.ts ├── kaktus_en.ts ├── kaktus_es.ts ├── kaktus_fa.ts ├── kaktus_fi.ts ├── kaktus_fr.ts ├── kaktus_it.ts ├── kaktus_nl_BE.ts ├── kaktus_nl_NL.ts ├── kaktus_pl.ts ├── kaktus_ru.ts ├── kaktus_tr.ts └── kaktus_zh_CN.ts /.gitignore: -------------------------------------------------------------------------------- 1 | # C++ objects and libs 2 | 3 | *.slo 4 | *.lo 5 | *.o 6 | *.a 7 | *.la 8 | *.lai 9 | *.so 10 | *.dll 11 | *.dylib 12 | 13 | # Qt-es 14 | 15 | *.pro.user 16 | *.pro.user.* 17 | moc_*.cpp 18 | qrc_*.cpp 19 | Makefile 20 | *-build-* 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Kaktus 2 | 3 | Multi aggregators mobile feed reader for Sailfish OS 4 | 5 | ## Supported aggregators 6 | 7 | Kaktus supports follwing RSS feed aggregation services: 8 | - [Netvibes](http://www.netvibes.com/) 9 | - [The Old Reader](https://theoldreader.com/) 10 | - [Tiny Tiny Rss](https://tt-rss.org) 11 | 12 | ## Downloads 13 | 14 | Binary packages for Sailfish OS can be downloaded 15 | from [OpenRepos](https://openrepos.net/content/mkiol/kaktus) and Jolla Store 16 | 17 | ## Translations 18 | 19 | If you would like to contribute to the project by doing translation, feel free to: 20 | * make pull request with new [translation file](https://github.com/mkiol/kaktus/tree/master/translations), or 21 | * add translation using [Transifex](https://www.transifex.com/mkiol/kaktus/) service, or 22 | * just send finished translation file to Kaktus's support email. 23 | 24 | ## License 25 | 26 | Kaktus is developed as an open source project under [Mozilla Public License Version 2.0](https://www.mozilla.org/MPL/2.0/). 27 | -------------------------------------------------------------------------------- /harbour-kaktus.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=Application 3 | X-Nemo-Application-Type=silica-qt5 4 | Name=Kaktus 5 | Icon=harbour-kaktus 6 | Exec=harbour-kaktus 7 | 8 | [X-Sailjail] 9 | Permissions=Internet;Pictures;WebView 10 | OrganizationName=org.mkiol 11 | ApplicationName=kaktus 12 | -------------------------------------------------------------------------------- /icons/108x108/harbour-kaktus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/icons/108x108/harbour-kaktus.png -------------------------------------------------------------------------------- /icons/128x128/harbour-kaktus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/icons/128x128/harbour-kaktus.png -------------------------------------------------------------------------------- /icons/150x150/harbour-kaktus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/icons/150x150/harbour-kaktus.png -------------------------------------------------------------------------------- /icons/172x172/harbour-kaktus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/icons/172x172/harbour-kaktus.png -------------------------------------------------------------------------------- /icons/256x256/harbour-kaktus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/icons/256x256/harbour-kaktus.png -------------------------------------------------------------------------------- /icons/86x86/harbour-kaktus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/icons/86x86/harbour-kaktus.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-bad-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-bad-selected.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-bad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-bad.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-browser.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-filter-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-filter-0.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-filter-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-filter-1.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-filter-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-filter-2.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-fontdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-fontdown.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-fontup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-fontup.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-friend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-friend.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-good-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-good-selected.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-good.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-good.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-item.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-item.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-like-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-like-selected.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-like.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-netvibes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-netvibes.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-night0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-night0.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-night1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-night1.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-night2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-night2.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-oldreader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-oldreader.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-pocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-pocket.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-read-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-read-selected.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-read.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-read.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-readabove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-readabove.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-reader-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-reader-selected.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-reader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-reader.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-rss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-rss.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-selector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-selector.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-share-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-share-selected.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-share.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-ttrss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-ttrss.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-vm0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-vm0.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-vm1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-vm1.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-vm2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-vm2.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-vm3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-vm3.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-vm4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-vm4.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-vm5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-vm5.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-vm6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-vm6.png -------------------------------------------------------------------------------- /images/z1.0/icon-m-webview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.0/icon-m-webview.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-bad-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-bad-selected.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-bad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-bad.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-browser.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-filter-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-filter-0.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-filter-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-filter-1.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-filter-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-filter-2.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-fontdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-fontdown.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-fontup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-fontup.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-friend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-friend.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-good-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-good-selected.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-good.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-good.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-item.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-item.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-like-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-like-selected.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-like.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-netvibes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-netvibes.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-night0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-night0.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-night1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-night1.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-night2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-night2.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-oldreader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-oldreader.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-pocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-pocket.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-read-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-read-selected.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-read.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-read.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-readabove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-readabove.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-reader-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-reader-selected.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-reader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-reader.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-rss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-rss.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-selector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-selector.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-share-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-share-selected.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-share.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-ttrss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-ttrss.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-vm0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-vm0.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-vm1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-vm1.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-vm2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-vm2.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-vm3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-vm3.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-vm4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-vm4.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-vm5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-vm5.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-vm6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-vm6.png -------------------------------------------------------------------------------- /images/z1.25/icon-m-webview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.25/icon-m-webview.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-bad-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-bad-selected.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-bad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-bad.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-browser.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-filter-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-filter-0.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-filter-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-filter-1.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-filter-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-filter-2.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-fontdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-fontdown.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-fontup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-fontup.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-friend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-friend.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-good-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-good-selected.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-good.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-good.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-item.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-item.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-like-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-like-selected.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-like.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-netvibes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-netvibes.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-night1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-night1.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-night2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-night2.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-oldreader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-oldreader.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-pocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-pocket.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-read-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-read-selected.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-read.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-read.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-readabove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-readabove.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-reader-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-reader-selected.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-reader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-reader.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-rss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-rss.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-selector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-selector.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-share-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-share-selected.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-share.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-ttrss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-ttrss.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-vm0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-vm0.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-vm1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-vm1.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-vm2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-vm2.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-vm3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-vm3.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-vm4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-vm4.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-vm5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-vm5.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-vm6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-vm6.png -------------------------------------------------------------------------------- /images/z1.5-large/icon-m-webview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5-large/icon-m-webview.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-bad-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-bad-selected.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-bad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-bad.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-browser.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-filter-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-filter-0.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-filter-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-filter-1.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-filter-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-filter-2.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-fontdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-fontdown.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-fontup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-fontup.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-friend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-friend.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-good-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-good-selected.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-good.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-good.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-item.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-item.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-like-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-like-selected.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-like.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-netvibes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-netvibes.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-night0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-night0.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-night1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-night1.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-night2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-night2.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-oldreader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-oldreader.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-pocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-pocket.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-read-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-read-selected.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-read.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-read.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-readabove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-readabove.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-reader-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-reader-selected.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-reader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-reader.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-rss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-rss.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-selector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-selector.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-share-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-share-selected.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-share.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-ttrss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-ttrss.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-vm0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-vm0.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-vm1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-vm1.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-vm2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-vm2.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-vm3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-vm3.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-vm4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-vm4.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-vm5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-vm5.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-vm6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-vm6.png -------------------------------------------------------------------------------- /images/z1.5/icon-m-webview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.5/icon-m-webview.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-bad-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-bad-selected.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-bad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-bad.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-browser.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-filter-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-filter-0.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-filter-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-filter-1.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-filter-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-filter-2.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-fontdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-fontdown.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-fontup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-fontup.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-friend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-friend.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-good-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-good-selected.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-good.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-good.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-item.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-item.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-like-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-like-selected.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-like.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-netvibes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-netvibes.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-night0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-night0.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-night1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-night1.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-night2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-night2.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-oldreader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-oldreader.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-pocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-pocket.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-read-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-read-selected.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-read.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-read.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-readabove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-readabove.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-reader-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-reader-selected.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-reader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-reader.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-rss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-rss.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-selector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-selector.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-share-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-share-selected.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-share.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-ttrss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-ttrss.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-vm0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-vm0.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-vm1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-vm1.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-vm2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-vm2.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-vm3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-vm3.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-vm4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-vm4.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-vm5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-vm5.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-vm6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-vm6.png -------------------------------------------------------------------------------- /images/z1.75/icon-m-webview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z1.75/icon-m-webview.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-bad-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-bad-selected.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-bad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-bad.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-browser.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-filter-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-filter-0.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-filter-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-filter-1.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-filter-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-filter-2.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-fontdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-fontdown.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-fontup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-fontup.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-friend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-friend.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-good-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-good-selected.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-good.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-good.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-item.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-item.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-like-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-like-selected.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-like.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-netvibes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-netvibes.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-night0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-night0.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-night1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-night1.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-night2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-night2.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-oldreader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-oldreader.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-pocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-pocket.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-read-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-read-selected.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-read.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-read.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-readabove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-readabove.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-reader-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-reader-selected.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-reader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-reader.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-rss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-rss.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-selector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-selector.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-share-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-share-selected.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-share.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-ttrss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-ttrss.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-vm0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-vm0.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-vm1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-vm1.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-vm2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-vm2.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-vm3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-vm3.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-vm4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-vm4.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-vm5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-vm5.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-vm6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-vm6.png -------------------------------------------------------------------------------- /images/z2.0/icon-m-webview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/images/z2.0/icon-m-webview.png -------------------------------------------------------------------------------- /kaktus.pro: -------------------------------------------------------------------------------- 1 | TARGET = harbour-kaktus 2 | 3 | CONFIG += c++1z sailfishapp json 4 | PKGCONFIG += mlite5 5 | QT += sql network dbus 6 | DEFINES += QT_NO_URL_CAST_FROM_STRING 7 | 8 | QMAKE_CXXFLAGS_RELEASE -= -O2 9 | QMAKE_CXXFLAGS_RELEASE += -O3 10 | 11 | CONFIG(debug, debug|release) { 12 | CONFIG += sanitizer sanitize_address 13 | } 14 | 15 | INCLUDEPATH += src 16 | 17 | include(qhttpserver/qhttpserver.pri) 18 | 19 | OTHER_FILES += \ 20 | $$files(qml/*.qml) \ 21 | $$files(rpm/*) \ 22 | $$files(scripts/*) 23 | 24 | SOURCES += \ 25 | src/main.cpp \ 26 | src/utils.cpp \ 27 | src/tabmodel.cpp \ 28 | src/listmodel.cpp \ 29 | src/feedmodel.cpp \ 30 | src/entrymodel.cpp \ 31 | src/downloadmanager.cpp \ 32 | src/databasemanager.cpp \ 33 | src/dashboardmodel.cpp \ 34 | src/cacheserver.cpp \ 35 | src/settings.cpp \ 36 | src/simplecrypt.cpp \ 37 | src/nviconprovider.cpp \ 38 | src/fetcher.cpp \ 39 | src/oldreaderfetcher.cpp \ 40 | src/nvfetcher.cpp \ 41 | src/ttrssfetcher.cpp \ 42 | src/networkaccessmanagerfactory.cpp \ 43 | src/customnetworkaccessmanager.cpp \ 44 | src/iconprovider.cpp 45 | 46 | HEADERS += \ 47 | src/info.h \ 48 | src/singleton.h \ 49 | src/utils.h \ 50 | src/tabmodel.h \ 51 | src/listmodel.h \ 52 | src/feedmodel.h \ 53 | src/entrymodel.h \ 54 | src/downloadmanager.h \ 55 | src/databasemanager.h \ 56 | src/dashboardmodel.h \ 57 | src/cacheserver.h \ 58 | src/settings.h \ 59 | src/simplecrypt.h \ 60 | src/iconprovider.h \ 61 | src/nviconprovider.h \ 62 | src/fetcher.h \ 63 | src/oldreaderfetcher.h \ 64 | src/nvfetcher.h \ 65 | src/ttrssfetcher.h \ 66 | src/networkaccessmanagerfactory.h \ 67 | src/customnetworkaccessmanager.h \ 68 | src/key.h 69 | 70 | SAILFISHAPP_ICONS = 86x86 108x108 128x128 150x150 172x172 256x256 71 | CONFIG += sailfishapp_i18n_include_obsolete 72 | TRANSLATIONS += \ 73 | translations/kaktus_en.ts \ 74 | translations/kaktus_pl.ts \ 75 | translations/kaktus_ru.ts \ 76 | translations/kaktus_cs.ts \ 77 | translations/kaktus_nl_NL.ts \ 78 | translations/kaktus_nl_BE.ts \ 79 | translations/kaktus_tr.ts \ 80 | translations/kaktus_es.ts \ 81 | translations/kaktus_it.ts \ 82 | translations/kaktus_de.ts \ 83 | translations/kaktus_zh_CN.ts 84 | include(sailfishapp_i18n.pri) 85 | 86 | # install 87 | 88 | install_images.files = images/* 89 | install_images.path = /usr/share/$${TARGET}/images 90 | INSTALLS += install_images 91 | 92 | install_scripts.files = scripts/* 93 | install_scripts.path = /usr/share/$${TARGET}/scripts 94 | INSTALLS += install_scripts 95 | 96 | DEPENDPATH += $${INCLUDEPATH} 97 | -------------------------------------------------------------------------------- /qhttpserver/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (C) 2011-2013 Nikhil Marathe 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to 5 | deal in the Software without restriction, including without limitation the 6 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 7 | sell copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19 | IN THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /qhttpserver/README.md: -------------------------------------------------------------------------------- 1 | QHttpServer 2 | =========== 3 | 4 | A Qt HTTP Server - because hard-core programmers write web-apps in C++ :) 5 | 6 | It uses Ryan Dahl's [HTTP Parser](http://github.com/ry/http-parser) and is asynchronous and does not require any inheritance. 7 | 8 | **NOTE: QHttpServer is NOT fully HTTP compliant right now! DO NOT use it for 9 | anything complex** 10 | 11 | Installation 12 | ------------ 13 | 14 | Requires Qt 4 or Qt 5. 15 | 16 | qmake && make && su -c 'make install' 17 | 18 | To link to your projects put this in your project's qmake project file 19 | 20 | LIBS += -lqhttpserver 21 | 22 | By default, the installation prefix is /usr/local. To change that to /usr, 23 | for example, run: 24 | 25 | qmake -r PREFIX=/usr 26 | 27 | Usage 28 | ----- 29 | 30 | Include the headers 31 | 32 | #include 33 | #include 34 | #include 35 | 36 | Create a server, and connect to the signal for new requests 37 | 38 | QHttpServer *server = new QHttpServer; 39 | connect(server, SIGNAL(newRequest(QHttpRequest*, QHttpResponse*)), 40 | handler, SLOT(handle(QHttpRequest*, QHttpResponse*))); 41 | 42 | // let's go 43 | server->listen(8080); 44 | 45 | In the handler, you may dispatch on routes or do whatever other things 46 | you want. See the API documentation for what information 47 | is provided about the request via the QHttpRequest object. 48 | 49 | To send data back to the browser and end the request: 50 | 51 | void Handler::handle(QHttpRequest *req, QHttpResponse *resp) 52 | { 53 | resp->setHeader("Content-Length", 11); 54 | resp->writeHead(200); // everything is OK 55 | resp->write("Hello World"); 56 | resp->end(); 57 | } 58 | 59 | The server and request/response objects emit various signals 60 | and have guarantees about memory management. See the API documentation for 61 | these. 62 | 63 | Contributors 64 | ------------ 65 | 66 | * Nikhil Marathe (maintainer) 67 | * David Wolinsy 68 | * Jonne Nauha 69 | -------------------------------------------------------------------------------- /qhttpserver/http_parser.gyp: -------------------------------------------------------------------------------- 1 | # This file is used with the GYP meta build system. 2 | # http://code.google.com/p/gyp/ 3 | # To build try this: 4 | # svn co http://gyp.googlecode.com/svn/trunk gyp 5 | # ./gyp/gyp -f make --depth=`pwd` http_parser.gyp 6 | # ./out/Debug/test 7 | { 8 | 'target_defaults': { 9 | 'default_configuration': 'Debug', 10 | 'configurations': { 11 | # TODO: hoist these out and put them somewhere common, because 12 | # RuntimeLibrary MUST MATCH across the entire project 13 | 'Debug': { 14 | 'defines': [ 'DEBUG', '_DEBUG' ], 15 | 'cflags': [ '-Wall', '-Wextra', '-O0', '-g', '-ftrapv' ], 16 | 'msvs_settings': { 17 | 'VCCLCompilerTool': { 18 | 'RuntimeLibrary': 1, # static debug 19 | }, 20 | }, 21 | }, 22 | 'Release': { 23 | 'defines': [ 'NDEBUG' ], 24 | 'cflags': [ '-Wall', '-Wextra', '-O3' ], 25 | 'msvs_settings': { 26 | 'VCCLCompilerTool': { 27 | 'RuntimeLibrary': 0, # static release 28 | }, 29 | }, 30 | } 31 | }, 32 | 'msvs_settings': { 33 | 'VCCLCompilerTool': { 34 | }, 35 | 'VCLibrarianTool': { 36 | }, 37 | 'VCLinkerTool': { 38 | 'GenerateDebugInformation': 'true', 39 | }, 40 | }, 41 | 'conditions': [ 42 | ['OS == "win"', { 43 | 'defines': [ 44 | 'WIN32' 45 | ], 46 | }] 47 | ], 48 | }, 49 | 50 | 'targets': [ 51 | { 52 | 'target_name': 'http_parser', 53 | 'type': 'static_library', 54 | 'include_dirs': [ '.' ], 55 | 'direct_dependent_settings': { 56 | 'defines': [ 'HTTP_PARSER_STRICT=0' ], 57 | 'include_dirs': [ '.' ], 58 | }, 59 | 'defines': [ 'HTTP_PARSER_STRICT=0' ], 60 | 'sources': [ './http_parser.c', ], 61 | 'conditions': [ 62 | ['OS=="win"', { 63 | 'msvs_settings': { 64 | 'VCCLCompilerTool': { 65 | # Compile as C++. http_parser.c is actually C99, but C++ is 66 | # close enough in this case. 67 | 'CompileAs': 2, 68 | }, 69 | }, 70 | }] 71 | ], 72 | }, 73 | 74 | { 75 | 'target_name': 'http_parser_strict', 76 | 'type': 'static_library', 77 | 'include_dirs': [ '.' ], 78 | 'direct_dependent_settings': { 79 | 'defines': [ 'HTTP_PARSER_STRICT=1' ], 80 | 'include_dirs': [ '.' ], 81 | }, 82 | 'defines': [ 'HTTP_PARSER_STRICT=1' ], 83 | 'sources': [ './http_parser.c', ], 84 | 'conditions': [ 85 | ['OS=="win"', { 86 | 'msvs_settings': { 87 | 'VCCLCompilerTool': { 88 | # Compile as C++. http_parser.c is actually C99, but C++ is 89 | # close enough in this case. 90 | 'CompileAs': 2, 91 | }, 92 | }, 93 | }] 94 | ], 95 | }, 96 | 97 | { 98 | 'target_name': 'test-nonstrict', 99 | 'type': 'executable', 100 | 'dependencies': [ 'http_parser' ], 101 | 'sources': [ 'test.c' ] 102 | }, 103 | 104 | { 105 | 'target_name': 'test-strict', 106 | 'type': 'executable', 107 | 'dependencies': [ 'http_parser_strict' ], 108 | 'sources': [ 'test.c' ] 109 | } 110 | ] 111 | } 112 | -------------------------------------------------------------------------------- /qhttpserver/qhttpconnection.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2011-2013 Nikhil Marathe 3 | * 4 | * Permission is hereby granted, free of charge, to any person obtaining a copy 5 | * of this software and associated documentation files (the "Software"), to 6 | * deal in the Software without restriction, including without limitation the 7 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 8 | * sell copies of the Software, and to permit persons to whom the Software is 9 | * furnished to do so, subject to the following conditions: 10 | * 11 | * The above copyright notice and this permission notice shall be included in 12 | * all copies or substantial portions of the Software. 13 | * 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 20 | * IN THE SOFTWARE. 21 | */ 22 | 23 | #ifndef Q_HTTP_CONNECTION 24 | #define Q_HTTP_CONNECTION 25 | 26 | #include "qhttpserverapi.h" 27 | #include "qhttpserverfwd.h" 28 | 29 | #include 30 | 31 | /// @cond nodoc 32 | 33 | class QHTTPSERVER_API QHttpConnection : public QObject 34 | { 35 | Q_OBJECT 36 | 37 | public: 38 | QHttpConnection(QTcpSocket *socket, QObject *parent = 0); 39 | virtual ~QHttpConnection(); 40 | 41 | void write(const QByteArray &data); 42 | void flush(); 43 | 44 | signals: 45 | void newRequest(QHttpRequest*, QHttpResponse*); 46 | 47 | private slots: 48 | void parseRequest(); 49 | void responseDone(); 50 | void socketDisconnected(); 51 | 52 | private: 53 | static int MessageBegin(http_parser *parser); 54 | static int Url(http_parser *parser, const char *at, size_t length); 55 | static int HeaderField(http_parser *parser, const char *at, size_t length); 56 | static int HeaderValue(http_parser *parser, const char *at, size_t length); 57 | static int HeadersComplete(http_parser *parser); 58 | static int Body(http_parser *parser, const char *at, size_t length); 59 | static int MessageComplete(http_parser *parser); 60 | 61 | private: 62 | QTcpSocket *m_socket; 63 | http_parser *m_parser; 64 | http_parser_settings *m_parserSettings; 65 | 66 | // Since there can only be one request at any time even with pipelining. 67 | QHttpRequest *m_request; 68 | 69 | QByteArray m_currentUrl; 70 | // The ones we are reading in from the parser 71 | HeaderHash m_currentHeaders; 72 | QString m_currentHeaderField; 73 | QString m_currentHeaderValue; 74 | }; 75 | 76 | /// @endcond 77 | 78 | #endif 79 | -------------------------------------------------------------------------------- /qhttpserver/qhttprequest.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2011-2013 Nikhil Marathe 3 | * 4 | * Permission is hereby granted, free of charge, to any person obtaining a copy 5 | * of this software and associated documentation files (the "Software"), to 6 | * deal in the Software without restriction, including without limitation the 7 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 8 | * sell copies of the Software, and to permit persons to whom the Software is 9 | * furnished to do so, subject to the following conditions: 10 | * 11 | * The above copyright notice and this permission notice shall be included in 12 | * all copies or substantial portions of the Software. 13 | * 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 20 | * IN THE SOFTWARE. 21 | */ 22 | 23 | #include "qhttprequest.h" 24 | 25 | #include "qhttpconnection.h" 26 | 27 | QHttpRequest::QHttpRequest(QHttpConnection *connection, QObject *parent) 28 | : QObject(parent) 29 | , m_connection(connection) 30 | , m_url("http://localhost/") 31 | , m_success(false) 32 | { 33 | } 34 | 35 | QHttpRequest::~QHttpRequest() 36 | { 37 | } 38 | 39 | QString QHttpRequest::header(const QString &field) 40 | { 41 | return m_headers.value(field.toLower(), ""); 42 | } 43 | 44 | const HeaderHash& QHttpRequest::headers() const 45 | { 46 | return m_headers; 47 | } 48 | 49 | const QString& QHttpRequest::httpVersion() const 50 | { 51 | return m_version; 52 | } 53 | 54 | const QUrl& QHttpRequest::url() const 55 | { 56 | return m_url; 57 | } 58 | 59 | const QString QHttpRequest::path() const 60 | { 61 | return m_url.path(); 62 | } 63 | 64 | const QString QHttpRequest::methodString() const 65 | { 66 | return MethodToString(method()); 67 | } 68 | 69 | QHttpRequest::HttpMethod QHttpRequest::method() const 70 | { 71 | return m_method; 72 | } 73 | 74 | const QString& QHttpRequest::remoteAddress() const 75 | { 76 | return m_remoteAddress; 77 | } 78 | 79 | quint16 QHttpRequest::remotePort() const 80 | { 81 | return m_remotePort; 82 | } 83 | 84 | void QHttpRequest::storeBody() 85 | { 86 | connect(this, SIGNAL(data(const QByteArray&)), 87 | this, SLOT(appendBody(const QByteArray&)), Qt::UniqueConnection); 88 | } 89 | 90 | QString QHttpRequest::MethodToString(HttpMethod method) 91 | { 92 | int index = staticMetaObject.indexOfEnumerator("HttpMethod"); 93 | return staticMetaObject.enumerator(index).valueToKey(method); 94 | } 95 | 96 | void QHttpRequest::appendBody(const QByteArray &body) 97 | { 98 | m_body.append(body); 99 | } 100 | -------------------------------------------------------------------------------- /qhttpserver/qhttpserver.pri: -------------------------------------------------------------------------------- 1 | INCLUDEPATH += qhttpserver 2 | DEPENDPATH += qhttpserver 3 | 4 | HEADERS += \ 5 | qhttpserver/http_parser.h \ 6 | qhttpserver/qhttpconnection.h \ 7 | qhttpserver/qhttprequest.h \ 8 | qhttpserver/qhttpresponse.h \ 9 | qhttpserver/qhttpserver.h \ 10 | qhttpserver/qhttpserverapi.h \ 11 | qhttpserver/qhttpserverfwd.h 12 | 13 | SOURCES += \ 14 | qhttpserver/http_parser.c \ 15 | qhttpserver/qhttpconnection.cpp \ 16 | qhttpserver/qhttprequest.cpp \ 17 | qhttpserver/qhttpresponse.cpp \ 18 | qhttpserver/qhttpserver.cpp 19 | -------------------------------------------------------------------------------- /qhttpserver/qhttpserverapi.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2011-2013 Nikhil Marathe 3 | * 4 | * Permission is hereby granted, free of charge, to any person obtaining a copy 5 | * of this software and associated documentation files (the "Software"), to 6 | * deal in the Software without restriction, including without limitation the 7 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 8 | * sell copies of the Software, and to permit persons to whom the Software is 9 | * furnished to do so, subject to the following conditions: 10 | * 11 | * The above copyright notice and this permission notice shall be included in 12 | * all copies or substantial portions of the Software. 13 | * 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 20 | * IN THE SOFTWARE. 21 | */ 22 | 23 | #ifndef Q_HTTP_SERVER_API 24 | #define Q_HTTP_SERVER_API 25 | 26 | #include 27 | 28 | #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) 29 | #ifdef Q_OS_WIN 30 | // Define to export or import depending if we are building or using the library. 31 | // QHTTPSERVER_EXPORT should only be defined when building. 32 | #if defined(QHTTPSERVER_EXPORT) 33 | #define QHTTPSERVER_API __declspec(dllexport) 34 | #else 35 | #define QHTTPSERVER_API __declspec(dllimport) 36 | #endif 37 | #else 38 | // Define empty for other platforms 39 | #define QHTTPSERVER_API 40 | #endif 41 | #else 42 | #ifdef Q_WS_WIN 43 | // Define to export or import depending if we are building or using the library. 44 | // QHTTPSERVER_EXPORT should only be defined when building. 45 | #if defined(QHTTPSERVER_EXPORT) 46 | #define QHTTPSERVER_API __declspec(dllexport) 47 | #else 48 | #define QHTTPSERVER_API __declspec(dllimport) 49 | #endif 50 | #else 51 | // Define empty for other platforms 52 | #define QHTTPSERVER_API 53 | #endif 54 | #endif 55 | 56 | #endif 57 | -------------------------------------------------------------------------------- /qhttpserver/qhttpserverfwd.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2011-2013 Nikhil Marathe 3 | * 4 | * Permission is hereby granted, free of charge, to any person obtaining a copy 5 | * of this software and associated documentation files (the "Software"), to 6 | * deal in the Software without restriction, including without limitation the 7 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 8 | * sell copies of the Software, and to permit persons to whom the Software is 9 | * furnished to do so, subject to the following conditions: 10 | * 11 | * The above copyright notice and this permission notice shall be included in 12 | * all copies or substantial portions of the Software. 13 | * 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 20 | * IN THE SOFTWARE. 21 | */ 22 | 23 | #ifndef Q_HTTP_SERVER_FWD 24 | #define Q_HTTP_SERVER_FWD 25 | 26 | #include 27 | #include 28 | 29 | /*! 30 | * A map of request or response headers 31 | */ 32 | typedef QHash HeaderHash; 33 | 34 | // QHttpServer 35 | class QHttpServer; 36 | class QHttpConnection; 37 | class QHttpRequest; 38 | class QHttpResponse; 39 | 40 | // Qt 41 | class QTcpServer; 42 | class QTcpSocket; 43 | 44 | // http_parser 45 | struct http_parser_settings; 46 | struct http_parser; 47 | 48 | #endif 49 | -------------------------------------------------------------------------------- /qml/AccountsDialog.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2015 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Page { 24 | id: root 25 | 26 | property bool showBar: false 27 | 28 | allowedOrientations: { 29 | switch (settings.allowedOrientations) { 30 | case 1: 31 | return Orientation.PortraitMask; 32 | case 2: 33 | return Orientation.LandscapeMask; 34 | } 35 | return Orientation.All; 36 | } 37 | 38 | ActiveDetector {} 39 | 40 | SilicaListView { 41 | id: listView 42 | 43 | anchors { top: parent.top; left: parent.left; right: parent.right } 44 | height: app.flickHeight 45 | Behavior on height {NumberAnimation { duration: 200; easing.type: Easing.OutQuad }} 46 | clip: true 47 | 48 | model: ListModel { 49 | ListElement { name: "Netvibes"; iconSource: "image://icons/icon-m-netvibes"; type: 1} 50 | ListElement { name: "Old Reader"; iconSource: "image://icons/icon-m-oldreader"; type: 2} 51 | ListElement { name: "Tiny Tiny RSS"; iconSource: "image://icons/icon-m-ttrss"; type: 4} 52 | } 53 | 54 | header: PageHeader { 55 | title: qsTr("Add account") 56 | } 57 | 58 | delegate: SimpleListItem { 59 | highlighted: root.accountType === type 60 | icon: iconSource 61 | title: name 62 | 63 | onClicked: { 64 | if (type == 1) { 65 | app.reconnectFetcher(1); 66 | pageStack.replaceAbove(pageStack.previousPage(), 67 | Qt.resolvedUrl("NvSignInDialog.qml"), 68 | {"code": 400}); 69 | } else if (type == 2) { 70 | app.reconnectFetcher(2); 71 | pageStack.replaceAbove(pageStack.previousPage(), 72 | Qt.resolvedUrl("OldReaderSignInDialog.qml"), 73 | {"code": 400}); 74 | } else if (type == 4) { 75 | app.reconnectFetcher(4); 76 | pageStack.replaceAbove(pageStack.previousPage(), 77 | Qt.resolvedUrl("TTRssSignInDialog.qml"), 78 | {"code": 400}); 79 | } 80 | } 81 | } 82 | 83 | VerticalScrollDecorator { 84 | flickable: listView 85 | } 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /qml/ActiveDetector.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Item { 24 | property int oldStatus: PageStatus.Active 25 | signal activated() 26 | signal init() 27 | 28 | Connections { 29 | target: parent 30 | 31 | onStatusChanged: { 32 | if (oldStatus === PageStatus.Inactive 33 | && parent.status === PageStatus.Active) { 34 | if (parent.showBar) 35 | bar.openable=true; 36 | else 37 | bar.hideAndDisable(); 38 | activated(); 39 | 40 | } 41 | if (parent.status === PageStatus.Inactive) 42 | oldStatus = parent.status ; 43 | } 44 | } 45 | 46 | Component.onCompleted: { 47 | if (parent.showBar) 48 | bar.openable=true; 49 | else 50 | bar.hideAndDisable(); 51 | init(); 52 | } 53 | } 54 | 55 | -------------------------------------------------------------------------------- /qml/AuthWebViewPage.qml: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2015-2022 Michal Kosciesza 2 | * 3 | * This Source Code Form is subject to the terms of the Mozilla Public 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | */ 7 | 8 | import QtQuick 2.0 9 | import Sailfish.Silica 1.0 10 | import Sailfish.WebView 1.0 11 | 12 | WebViewPage { 13 | id: root 14 | 15 | property bool showBar: false 16 | 17 | property string url 18 | property int type 19 | property int code 20 | readonly property color _bgColor: Theme.colorScheme === Theme.LightOnDark ? 21 | Qt.darker(Theme.highlightBackgroundColor, 5.0) : 22 | Qt.lighter(Theme.highlightBackgroundColor, 1.8) 23 | 24 | ActiveDetector {} 25 | 26 | function navigateBack() { 27 | if (view.canGoBack) { 28 | view.goBack() 29 | } else { 30 | pageStack.pop() 31 | } 32 | } 33 | 34 | function accept() { 35 | var doInit = settings.signinType != type; 36 | settings.signinType = type; 37 | 38 | if (code == 0) { 39 | fetcher.checkCredentials(); 40 | } else { 41 | if (dm.busy) 42 | dm.cancel(); 43 | if (doInit) 44 | fetcher.init(); 45 | else 46 | fetcher.update(); 47 | } 48 | 49 | if (pageStack.depth===3) { 50 | pageStack.replaceAbove(null,Qt.resolvedUrl("FirstPage.qml")); 51 | } else { 52 | pageStack.pop(); 53 | } 54 | } 55 | 56 | onForwardNavigationChanged: { 57 | if (forwardNavigation) 58 | forwardNavigation = false; 59 | } 60 | 61 | showNavigationIndicator: false 62 | 63 | allowedOrientations: { 64 | switch (settings.allowedOrientations) { 65 | case 1: 66 | return Orientation.PortraitMask 67 | case 2: 68 | return Orientation.LandscapeMask 69 | } 70 | return Orientation.All 71 | } 72 | 73 | WebView { 74 | id: view 75 | 76 | anchors.fill: parent 77 | canShowSelectionMarkers: true 78 | url: root.url 79 | 80 | onUrlChanged: { 81 | if (fetcher.setConnectUrl(url)) { 82 | accept(); 83 | } 84 | } 85 | } 86 | 87 | IconBar { 88 | id: controlbar 89 | flickable: view 90 | color: root._bgColor 91 | 92 | IconBarItem { 93 | text: qsTr("Back") 94 | icon: "image://theme/icon-m-back" 95 | onClicked: root.navigateBack() 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /qml/ButtonItem.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2017 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Item { 24 | id: root 25 | 26 | property alias button: _button 27 | property alias description: desc.text 28 | 29 | opacity: enabled ? 1.0 : 0.4 30 | height: col.height + 5*Theme.paddingSmall 31 | 32 | anchors {left: parent.left; right: parent.right} 33 | 34 | Column { 35 | id: col 36 | 37 | spacing: Theme.paddingSmall 38 | 39 | anchors { 40 | top: parent.top; topMargin: 3*Theme.paddingSmall 41 | left: parent.left; right: parent.right 42 | leftMargin: Theme.horizontalPageMargin; rightMargin: Theme.horizontalPageMargin 43 | } 44 | 45 | Button { 46 | id: _button 47 | enabled: root.enabled 48 | anchors.horizontalCenter: parent.horizontalCenter 49 | } 50 | 51 | Label { 52 | id: desc 53 | anchors { left: parent.left; right: parent.right } 54 | wrapMode: Text.Wrap 55 | font.pixelSize: Theme.fontSizeExtraSmall 56 | color: Theme.secondaryColor 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /qml/CachedImage.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2017 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Image { 24 | id: root 25 | 26 | property int maxWidth: 0 27 | property int minWidth: 0 28 | property string orgSource: "" 29 | property bool cached: true 30 | property bool hidden: false 31 | readonly property bool ok: status === Image.Ready && 32 | (minWidth === 0 || (sourceSize.width > minWidth && 33 | sourceSize.height > minWidth)) 34 | readonly property bool filled: maxWidth > 0 && implicitWidth > maxWidth/3 35 | 36 | width: filled ? maxWidth : sourceSize.width 37 | enabled: !hidden && ok 38 | visible: opacity > 0 && enabled 39 | opacity: enabled ? 1.0 : 0.0 40 | Behavior on opacity { 41 | NumberAnimation { duration: 200 } 42 | } 43 | 44 | onOrgSourceChanged: { 45 | if (orgSource.length > 0) { 46 | if (cached) { 47 | var cachedSource = cserver.getPathByUrl(orgSource) 48 | if (cachedSource.length === 0) { 49 | if (!settings.offlineMode && dm.online) { 50 | cached = false 51 | source = orgSource 52 | } 53 | } else { 54 | source = cachedSource 55 | } 56 | } else { 57 | source = orgSource 58 | } 59 | } else { 60 | source = "" 61 | } 62 | } 63 | 64 | onStatusChanged: { 65 | if (!hidden && status === Image.Ready) { 66 | if (filled) { 67 | var ratio = width / implicitWidth 68 | height = implicitHeight * ratio 69 | if (width < sourceSize.width) 70 | sourceSize.width = width 71 | if (height < sourceSize.height) 72 | sourceSize.height = height 73 | } 74 | } else if (status === Image.Error && 75 | cached && orgSource.length > 0 && 76 | !settings.offlineMode && dm.online) { 77 | cached = false 78 | source = orgSource 79 | } 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /qml/ClickableLabel.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016-2019 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | 21 | import QtQuick 2.0 22 | import Sailfish.Silica 1.0 23 | 24 | ListItem { 25 | id: root 26 | 27 | property alias text: label.text 28 | property alias menuText: menuItem.text 29 | signal triggered 30 | 31 | onClicked: { 32 | triggered(); 33 | } 34 | 35 | menu: ContextMenu { 36 | MenuItem { 37 | id: menuItem 38 | onClicked: { 39 | root.triggered() 40 | } 41 | } 42 | } 43 | 44 | contentHeight: label.height + 2 * Theme.paddingMedium 45 | 46 | Label { 47 | id: label 48 | anchors.verticalCenter: parent.verticalCenter 49 | x: Theme.horizontalPageMargin 50 | wrapMode: Text.WrapAtWordBoundaryOrAnywhere 51 | width: parent.width - 2 * x 52 | color: highlighted ? Theme.highlightColor : Theme.primaryColor 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /qml/CoverPage.qml: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2016-2022 Michal Kosciesza 2 | * 3 | * This Source Code Form is subject to the terms of the Mozilla Public 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | */ 7 | 8 | import QtQuick 2.1 9 | import Sailfish.Silica 1.0 10 | 11 | CoverBackground { 12 | id: root 13 | 14 | property int unread: 0 15 | property bool active: status === Cover.Active 16 | property bool busy: app.fetcherBusyStatus || dm.busy 17 | property string label 18 | property string unreadLabel: unread > 0 ? 19 | qsTr("%n unread item(s)", "", unread) : 20 | qsTr("All read") 21 | onStatusChanged: { 22 | if (status === Cover.Active) { 23 | root.unread = utils.countUnread(); 24 | } 25 | } 26 | 27 | function connectFetcher() { 28 | if (typeof fetcher === 'undefined') return; 29 | fetcher.progress.connect(fetcherProgress); 30 | fetcher.busyChanged.connect(fetcherBusyChanged); 31 | } 32 | 33 | function disconnectFetcher() { 34 | if (typeof fetcher === 'undefined') return; 35 | fetcher.progress.disconnect(fetcherProgress); 36 | fetcher.busyChanged.disconnect(fetcherBusyChanged); 37 | } 38 | 39 | function fetcherProgress(current, total) { 40 | label = qsTr("Syncing"); 41 | if (total > 0) 42 | label += " " + Math.floor((current/total)*100)+"%"; 43 | } 44 | 45 | function fetcherUploadProgress(current, total) { 46 | label = qsTr("Uploading"); 47 | if (total > 0) 48 | label += " " + Math.floor((current/total)*100)+"%"; 49 | } 50 | 51 | function fetcherBusyChanged() { 52 | switch(fetcher.busyType) { 53 | case 1: 54 | label = qsTr("Initiating"); 55 | label += " " + "0%" 56 | break; 57 | case 2: 58 | label = qsTr("Updating") 59 | label += " " + "0%" 60 | break; 61 | case 3: 62 | case 4: 63 | label = qsTr("Signing in") 64 | break; 65 | case 11: 66 | case 21: 67 | case 31: 68 | label = qsTr("Waiting"); 69 | break; 70 | } 71 | 72 | if (!fetcher.busy && active) { 73 | root.unread = utils.countUnread(); 74 | } 75 | } 76 | 77 | 78 | Connections { 79 | target: dm 80 | 81 | onProgress: { 82 | if (!app.fetcherBusyStatus) { 83 | label = qsTr("Caching"); 84 | if (current > 0 && total != 0) 85 | label += " " + qsTr("%1 of %2").arg(current).arg(total); 86 | } 87 | } 88 | } 89 | 90 | CoverActionList { 91 | enabled: !root.busy && settings.signedIn 92 | CoverAction { 93 | iconSource: "image://theme/icon-cover-sync" 94 | onTriggered: fetcher.update(); 95 | } 96 | } 97 | 98 | CoverActionList { 99 | enabled: root.busy && settings.signedIn 100 | CoverAction { 101 | iconSource: "image://theme/icon-cover-cancel" 102 | onTriggered: { 103 | dm.cancel(); 104 | fetcher.cancel(); 105 | } 106 | } 107 | } 108 | 109 | CoverPlaceholder { 110 | text: settings.signedIn ? root.busy ? root.label : root.unreadLabel : APP_NAME 111 | icon.source: settings.appIcon() 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /qml/DashboardDialog.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014-2019 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Dialog { 24 | id: root 25 | 26 | canAccept: false 27 | property bool showBar: false 28 | 29 | allowedOrientations: { 30 | switch (settings.allowedOrientations) { 31 | case 1: 32 | return Orientation.PortraitMask; 33 | case 2: 34 | return Orientation.LandscapeMask; 35 | } 36 | return Orientation.All; 37 | } 38 | 39 | ActiveDetector {} 40 | 41 | SilicaListView { 42 | id: listView 43 | 44 | anchors { top: parent.top; left: parent.left; right: parent.right } 45 | height: app.flickHeight 46 | Behavior on height {NumberAnimation { duration: 200; easing.type: Easing.OutQuad }} 47 | clip: true 48 | 49 | spacing: Theme.paddingMedium 50 | model: dashboardModel 51 | 52 | header: DialogHeader { 53 | title: qsTr("Dashboards") 54 | acceptText : qsTr("Change") 55 | } 56 | 57 | delegate: SimpleListItem { 58 | title: model.title 59 | showPlaceholder: true 60 | 61 | onClicked: { 62 | settings.dashboardInUse = uid; 63 | root.canAccept = true; 64 | root.accept(); 65 | } 66 | } 67 | 68 | ViewPlaceholder { 69 | id: placeholder 70 | enabled: listView.count === 0 71 | text: qsTr("No dashboards") 72 | } 73 | 74 | VerticalScrollDecorator { 75 | flickable: listView 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /qml/DashboardPage.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | 24 | Page { 25 | id: root 26 | 27 | property bool showBar: false 28 | 29 | allowedOrientations: { 30 | switch (settings.allowedOrientations) { 31 | case 1: 32 | return Orientation.PortraitMask; 33 | case 2: 34 | return Orientation.LandscapeMask; 35 | } 36 | return Orientation.All; 37 | } 38 | 39 | ActiveDetector {} 40 | 41 | SilicaListView { 42 | id: listView 43 | model: dashboardModel 44 | 45 | anchors { top: parent.top; left: parent.left; right: parent.right } 46 | height: app.flickHeight 47 | Behavior on height {NumberAnimation { duration: 200; easing.type: Easing.OutQuad }} 48 | clip: true 49 | 50 | header: PageHeader { 51 | title: qsTr("Dashboards") 52 | } 53 | 54 | delegate: ListItem { 55 | id: listItem 56 | contentHeight: item.height + 2 * Theme.paddingMedium 57 | 58 | Column { 59 | id: item 60 | spacing: Theme.paddingSmall 61 | anchors.verticalCenter: parent.verticalCenter 62 | width: parent.width 63 | 64 | Label { 65 | wrapMode: Text.AlignLeft 66 | anchors.left: parent.left; anchors.right: parent.right; 67 | anchors.leftMargin: Theme.paddingLarge; anchors.rightMargin: Theme.paddingLarge 68 | font.pixelSize: Theme.fontSizeMedium 69 | text: title 70 | color: listItem.down ? Theme.highlightColor : Theme.primaryColor 71 | } 72 | } 73 | 74 | onClicked: { 75 | utils.setTabModel(uid); 76 | pageStack.replace(Qt.resolvedUrl("TabPage.qml")); 77 | } 78 | 79 | } 80 | 81 | ViewPlaceholder { 82 | id: placeholder 83 | enabled: listView.count === 0 84 | text: qsTr("No dashboards") 85 | } 86 | 87 | VerticalScrollDecorator { 88 | flickable: listView 89 | } 90 | 91 | } 92 | 93 | /*ControlBar { 94 | id: controlbar 95 | }*/ 96 | } 97 | -------------------------------------------------------------------------------- /qml/DebugPage.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Page { 24 | id: root 25 | 26 | property bool showBar: false 27 | 28 | allowedOrientations: { 29 | switch (settings.allowedOrientations) { 30 | case 1: 31 | return Orientation.PortraitMask; 32 | case 2: 33 | return Orientation.LandscapeMask; 34 | } 35 | return Orientation.All; 36 | } 37 | 38 | ActiveDetector {} 39 | 40 | SilicaListView { 41 | anchors { top: parent.top; left: parent.left; right: parent.right } 42 | height: app.flickHeight 43 | Behavior on height {NumberAnimation { duration: 200; easing.type: Easing.OutQuad }} 44 | clip: true 45 | 46 | anchors.leftMargin: Theme.paddingLarge 47 | anchors.rightMargin: Theme.paddingLarge 48 | spacing: Theme.paddingLarge 49 | 50 | header: PageHeader { 51 | title: qsTr("Debug") 52 | } 53 | 54 | model: VisualItemModel { 55 | 56 | Button { 57 | text: "Test" 58 | onClicked: { 59 | debug.test(); 60 | } 61 | } 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /qml/Dot.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2015 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Rectangle { 24 | property bool active: false 25 | 26 | width: Theme.paddingLarge 27 | height: Theme.paddingLarge 28 | color: Theme.secondaryHighlightColor 29 | radius: 10 30 | 31 | Rectangle { 32 | visible: !active 33 | width: Theme.paddingLarge-2 34 | height: Theme.paddingLarge-2 35 | anchors.centerIn: parent 36 | color: "black" 37 | radius: 10 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /qml/EntryPageContent.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | SilicaFlickable { 24 | id: root 25 | 26 | property int index 27 | property string content 28 | property string image 29 | property bool busy: false 30 | property bool openable: false 31 | property alias textFormat: contentLabel.textFormat 32 | readonly property bool active: content.length > 0 || image.length > 0 33 | 34 | signal clicked 35 | signal openClicked 36 | 37 | contentWidth: width 38 | contentHeight: column.height 39 | 40 | onIndexChanged: { 41 | scrollToTop(); 42 | } 43 | 44 | Rectangle { 45 | anchors.fill: bgitem 46 | visible: opacity > 0.0 47 | opacity: root.active ? 0.5 : 0.0 48 | Behavior on opacity { FadeAnimation {} } 49 | color: Theme.colorScheme ? "white" : "black" 50 | } 51 | 52 | BackgroundItem { 53 | id: bgitem 54 | width: column.width 55 | height: Math.max(column.height, root.height); 56 | onClicked: root.clicked(); 57 | enabled: root.active 58 | 59 | Column { 60 | id: column 61 | spacing: Theme.paddingMedium 62 | width: root.width 63 | 64 | CachedImage { 65 | id: entryImage 66 | anchors.horizontalCenter: parent.horizontalCenter 67 | maxWidth: root.width 68 | minWidth: Theme.iconSizeMedium 69 | orgSource: root.image 70 | } 71 | 72 | Item { 73 | height: 1 74 | width: parent.width 75 | visible: !entryImage.enabled 76 | } 77 | 78 | Label { 79 | id: contentLabel 80 | anchors { 81 | left: parent.left; 82 | right: parent.right; 83 | leftMargin: Theme.paddingLarge; 84 | rightMargin: Theme.horizontalPageMargin 85 | } 86 | text: root.content 87 | wrapMode: Text.Wrap 88 | linkColor: Theme.highlightColor 89 | font.pixelSize: Theme.fontSizeSmall 90 | visible: root.content.length > 0 && !root.busy 91 | color: Theme.primaryColor 92 | } 93 | 94 | Button { 95 | anchors.horizontalCenter: parent.horizontalCenter 96 | enabled: root.openable 97 | visible: enabled 98 | text: qsTr("Open") 99 | onClicked: { 100 | if (root.openable) 101 | root.openClicked(); 102 | } 103 | } 104 | 105 | Item { 106 | height: 2 * Theme.paddingLarge 107 | width: parent.width 108 | } 109 | } 110 | } 111 | 112 | VerticalScrollDecorator { 113 | flickable: root 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /qml/ErrorPage.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | 24 | Page { 25 | id: root 26 | 27 | property bool showBar: false 28 | property string message 29 | 30 | ActiveDetector {} 31 | 32 | SilicaListView { 33 | anchors.fill: parent 34 | 35 | header: PageHeader { 36 | title: qsTr("Error") 37 | } 38 | 39 | model: VisualItemModel { 40 | 41 | Label { 42 | text: qsTr("Sorry, something went wrong :-(") 43 | } 44 | 45 | Label { 46 | color: Theme.secondaryColor 47 | text: message 48 | } 49 | 50 | } 51 | 52 | VerticalScrollDecorator {} 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /qml/FeedIcon.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2017 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Item { 24 | id: root 25 | 26 | property bool showPlaceholder: false 27 | property alias text: _placeholder.text 28 | property alias icon: _icon.orgSource 29 | property bool small: false 30 | 31 | height: root.small ? Theme.iconSizeMedium * 0.7 : Theme.iconSizeMedium 32 | width: height 33 | 34 | IconPlaceholder { 35 | // placeholder 36 | id: _placeholder 37 | anchors.fill: parent 38 | visible: root.showPlaceholder && 39 | _icon.status !== Image.Ready && 40 | title.length > 0 41 | } 42 | 43 | CachedImage { 44 | // feed icon 45 | id: _icon 46 | anchors.fill: parent 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /qml/FirstPage.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | 24 | Page { 25 | id: root 26 | 27 | property bool showBar: false 28 | 29 | allowedOrientations: { 30 | switch (settings.allowedOrientations) { 31 | case 1: 32 | return Orientation.PortraitMask; 33 | case 2: 34 | return Orientation.LandscapeMask; 35 | } 36 | return Orientation.All; 37 | } 38 | 39 | SilicaListView { 40 | id: listView 41 | 42 | anchors { top: parent.top; left: parent.left; right: parent.right } 43 | height: app.flickHeight 44 | Behavior on height {NumberAnimation { duration: 200; easing.type: Easing.OutQuad }} 45 | clip: true 46 | 47 | PullDownMenu { 48 | id: menu 49 | 50 | MenuItem { 51 | text: qsTr("About") 52 | onClicked: { 53 | pageStack.push(Qt.resolvedUrl("AboutPage.qml")); 54 | } 55 | } 56 | 57 | MenuItem { 58 | text: qsTr("Add account") 59 | onClicked: pageStack.push(Qt.resolvedUrl("AccountsDialog.qml")); 60 | enabled: !settings.signedIn && !app.fetcherBusyStatus && !dm.busy && !dm.removerBusy 61 | } 62 | 63 | MenuItem { 64 | text: enabled ? qsTr("Sync") : qsTr("Busy...") 65 | visible: settings.signedIn && enabled 66 | onClicked: fetcher.update() 67 | enabled: !fetcher.busy && !dm.busy && !dm.removerBusy 68 | } 69 | } 70 | 71 | ViewPlaceholder { 72 | id: placeholder 73 | enabled: true 74 | text: settings.signedIn ? 75 | app.fetcherBusyStatus || dm.busy ? qsTr("Wait until sync finish") : 76 | qsTr("To do feeds synchronization, pull down and select sync") : 77 | qsTr("You are not signed in to any account, pull down to add one") 78 | } 79 | 80 | VerticalScrollDecorator { 81 | flickable: listView 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /qml/HintLabel.qml: -------------------------------------------------------------------------------- 1 | /**************************************************************************************** 2 | ** 3 | ** Copyright (C) 2014 Jolla Ltd. 4 | ** Contact: Joona Petrell 5 | ** All rights reserved. 6 | ** 7 | ** This file is part of Sailfish Silica UI component package. 8 | ** 9 | ** You may use this file under the terms of BSD license as follows: 10 | ** 11 | ** Redistribution and use in source and binary forms, with or without 12 | ** modification, are permitted provided that the following conditions are met: 13 | ** * Redistributions of source code must retain the above copyright 14 | ** notice, this list of conditions and the following disclaimer. 15 | ** * Redistributions in binary form must reproduce the above copyright 16 | ** notice, this list of conditions and the following disclaimer in the 17 | ** documentation and/or other materials provided with the distribution. 18 | ** * Neither the name of the Jolla Ltd nor the 19 | ** names of its contributors may be used to endorse or promote products 20 | ** derived from this software without specific prior written permission. 21 | ** 22 | ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 23 | ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 24 | ** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 25 | ** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR 26 | ** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 27 | ** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 | ** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 29 | ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 | ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 31 | ** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 | ** 33 | ****************************************************************************************/ 34 | 35 | import QtQuick 2.0 36 | import Sailfish.Silica 1.0 37 | 38 | Rectangle { 39 | property bool invert 40 | property alias text: label.text 41 | property alias textColor: label.color 42 | property color backgroundColor: Theme.rgba(Theme.highlightDimmerColor, 0.9) 43 | 44 | height: parent.height/2 45 | width: parent.width 46 | gradient: Gradient { 47 | GradientStop { position: invert ? 1.0 : 0.0; color: "transparent" } 48 | GradientStop { position: invert ? 0.3 : (bar.open ? 0.6 : 0.8); color: backgroundColor } 49 | } 50 | 51 | InfoLabel { 52 | id: label 53 | color: Theme.highlightColor 54 | font { 55 | pixelSize: Theme.fontSizeLarge 56 | family: Theme.fontFamilyHeading 57 | } 58 | anchors { 59 | top: invert ? parent.top : undefined 60 | bottom: invert ? undefined : parent.bottom 61 | bottomMargin: Theme.paddingLarge*2 + (bar.open ? app.panelHeight : 0) 62 | topMargin: Theme.paddingLarge*2 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /qml/IconBarItem.qml: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * gPodder QML UI Reference Implementation 4 | * Copyright (c) 2013, 2014, Thomas Perl 5 | * 6 | * Permission to use, copy, modify, and/or distribute this software for any 7 | * purpose with or without fee is hereby granted, provided that the above 8 | * copyright notice and this permission notice appear in all copies. 9 | * 10 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 11 | * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 12 | * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 13 | * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 14 | * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 15 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16 | * PERFORMANCE OF THIS SOFTWARE. 17 | * 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Item { 24 | id: root 25 | 26 | property string icon: "image://icons/item" 27 | property alias enabled: iconButton.enabled 28 | property alias text: lbl.text 29 | property string theme: "" 30 | 31 | property string iconColor: root.theme === "transparent" ? Theme.primaryColor : 32 | root.theme === "black" ? Theme.primaryColor : 33 | root.theme === "highlighted" ? Theme.highlightBackgroundColor : 34 | root.theme === "dimmer" ? Theme.primaryColor : 35 | Theme.primaryColor 36 | 37 | width: iconButton.width 38 | height: iconButton.height 39 | visible: enabled 40 | 41 | signal clicked() 42 | signal downed() 43 | 44 | onClicked: parent.show() 45 | onDowned: parent.show() 46 | 47 | Label { 48 | id: lbl 49 | opacity: iconButton.down 50 | 51 | Behavior on opacity { 52 | FadeAnimation {} 53 | } 54 | 55 | anchors { 56 | verticalCenter: parent.top 57 | horizontalCenter: parent.horizontalCenter 58 | } 59 | 60 | color: Theme.secondaryHighlightColor //iconColor 61 | font.pixelSize: Theme.fontSizeTiny 62 | wrapMode: Text.Wrap 63 | horizontalAlignment: Text.AlignHCenter 64 | } 65 | 66 | IconButton { 67 | id: iconButton 68 | icon.source: root.icon + "?" + iconColor 69 | onClicked: root.clicked() 70 | onDownChanged: { if (down){ root.downed() } } 71 | enabled: root.enabled 72 | //icon.onSourceChanged: console.log(icon.source) 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /qml/IconContextMenu.qml: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * gPodder QML UI Reference Implementation 4 | * Copyright (c) 2013, 2014, Thomas Perl 5 | * 6 | * Permission to use, copy, modify, and/or distribute this software for any 7 | * purpose with or without fee is hereby granted, provided that the above 8 | * copyright notice and this permission notice appear in all copies. 9 | * 10 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 11 | * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 12 | * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 13 | * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 14 | * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 15 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16 | * PERFORMANCE OF THIS SOFTWARE. 17 | * 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | ContextMenu { 24 | default property alias children: container.children 25 | property int size 26 | 27 | Item { 28 | height: Theme.itemSizeMedium 29 | width: parent.width 30 | 31 | // Right 32 | Rectangle { 33 | color: Theme.secondaryColor 34 | height: parent.height 35 | width: Theme.paddingSmall 36 | opacity: flick.contentX < (flick.contentWidth - flick.width - Theme.paddingLarge) ? 0.5 : 0.0 37 | visible: opacity > 0 38 | anchors.right: visible ? parent.right : undefined 39 | Behavior on opacity { 40 | FadeAnimation {} 41 | } 42 | } 43 | 44 | // Left 45 | Rectangle { 46 | color: Theme.secondaryColor 47 | height: parent.height 48 | width: Theme.paddingSmall 49 | opacity: flick.contentX > Theme.paddingLarge ? 0.5 : 0.0 50 | visible: opacity > 0 51 | anchors.left: visible ? parent.left : undefined 52 | Behavior on opacity { 53 | FadeAnimation {} 54 | } 55 | } 56 | 57 | Flickable { 58 | id: flick 59 | 60 | height: parent.height 61 | width: parent.width 62 | contentWidth: container.width + 2 * Theme.paddingLarge 63 | contentHeight: height 64 | pixelAligned: true 65 | 66 | Flow { 67 | id: container 68 | anchors { 69 | verticalCenter: parent.verticalCenter 70 | left: parent.left 71 | margins: Theme.paddingLarge 72 | } 73 | 74 | spacing: Theme.paddingLarge 75 | } 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /qml/IconMenuItem_.qml: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * gPodder QML UI Reference Implementation 4 | * Copyright (c) 2013, 2014, Thomas Perl 5 | * 6 | * Permission to use, copy, modify, and/or distribute this software for any 7 | * purpose with or without fee is hereby granted, provided that the above 8 | * copyright notice and this permission notice appear in all copies. 9 | * 10 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 11 | * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 12 | * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 13 | * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 14 | * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 15 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16 | * PERFORMANCE OF THIS SOFTWARE. 17 | * 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Item { 24 | id: root 25 | property alias icon: iconButton.icon 26 | property alias enabled: iconButton.enabled 27 | property alias text: lbl.text 28 | property bool busy: false 29 | 30 | width: iconButton.width 31 | height: iconButton.height 32 | 33 | signal clicked() 34 | 35 | Label { 36 | id: lbl 37 | opacity: iconButton.down 38 | 39 | Behavior on opacity { 40 | FadeAnimation {} 41 | } 42 | 43 | anchors { 44 | verticalCenter: parent.top 45 | horizontalCenter: parent.horizontalCenter 46 | } 47 | 48 | color: Theme.highlightColor 49 | font.pixelSize: Theme.fontSizeTiny 50 | wrapMode: Text.Wrap 51 | horizontalAlignment: Text.AlignHCenter 52 | } 53 | 54 | Image { 55 | anchors.fill: parent 56 | opacity: root.busy ? 1.0 : 0.0 57 | visible: opacity > 0.0 58 | Behavior on opacity { FadeAnimation {} } 59 | source: "image://theme/graphic-busyindicator-medium" 60 | RotationAnimation on rotation { 61 | loops: Animation.Infinite 62 | from: 0 63 | to: 360 64 | duration: 1200 65 | running: root.busy && Qt.application.active 66 | } 67 | } 68 | 69 | IconButton { 70 | id: iconButton 71 | onClicked: root.clicked(); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /qml/IconPlaceholder.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2017 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Rectangle { 24 | id: root 25 | 26 | property string text 27 | 28 | //Source: http://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/ 29 | function hash(text, index) { 30 | var hash = 0, i, chr, len 31 | if (text.length === 0 || text.length < index) return hash 32 | for (i = index, len = text.length; i < len; i++) { 33 | chr = text.charCodeAt(i) 34 | hash = ((hash << 5) - hash) + chr 35 | } 36 | return Math.abs(hash)%255 37 | } 38 | 39 | Component.onCompleted: { 40 | var r = text.length > 0 ? hash(text,0)/255 : 1 41 | var g = text.length > 1 ? hash(text,1)/255 : 1 42 | var b = text.length > 2 ? hash(text,2)/255 : 1 43 | var base = Qt.rgba(r, g, b, .8) 44 | var colorBg = Qt.darker(base, 1.5) 45 | var colorFg = Qt.lighter(base, 3.0) 46 | color = colorBg 47 | label.color = colorFg 48 | } 49 | 50 | Label { 51 | id: label 52 | text: root.text.substring(0,1).toUpperCase() 53 | horizontalAlignment: Text.AlignHCenter 54 | verticalAlignment: Text.AlignVCenter 55 | font.pixelSize: root.height * 0.8 56 | anchors.fill: parent 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /qml/IconSlider.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | 24 | Item { 25 | id: root 26 | 27 | property alias leftIconSource: leftIcon.source 28 | property alias rightIconSource: rightIcon.source 29 | property alias minimumValue: slider.minimumValue 30 | property alias maximumValue: slider.maximumValue 31 | property alias value: slider.value 32 | property alias label: slider.label 33 | property alias valueText: slider.valueText 34 | property alias stepSize: slider.stepSize 35 | 36 | signal clicked 37 | 38 | anchors { left: parent.left; right: parent.right} 39 | height: Theme.itemSizeSmall + 3 * Theme.paddingLarge 40 | 41 | Image { 42 | id: leftIcon 43 | width: Theme.itemSizeSmall 44 | height: Theme.itemSizeSmall 45 | anchors.verticalCenter: parent.verticalCenter 46 | anchors.left: parent.left 47 | } 48 | 49 | Slider { 50 | id: slider 51 | width: parent.width - 2*Theme.itemSizeSmall 52 | anchors.verticalCenter: parent.verticalCenter 53 | anchors.horizontalCenter: parent.horizontalCenter 54 | onClicked: root.clicked() 55 | leftMargin: 0 56 | rightMargin: 0 57 | } 58 | 59 | Image { 60 | id: rightIcon 61 | width: Theme.itemSizeSmall 62 | height: Theme.itemSizeSmall 63 | anchors.verticalCenter: parent.verticalCenter 64 | anchors.right: parent.right 65 | } 66 | 67 | } 68 | -------------------------------------------------------------------------------- /qml/LogItem.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014-2019 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Row { 24 | id: root 25 | 26 | property alias title: label1.text 27 | property alias description: label2.text 28 | 29 | anchors.left: parent.left; anchors.right: parent.right 30 | anchors.leftMargin: Theme.paddingLarge; anchors.rightMargin: Theme.paddingLarge 31 | spacing: Theme.paddingLarge 32 | 33 | Column { 34 | spacing: Theme.paddingSmall 35 | anchors.top: parent.top 36 | width: parent.width-1*Theme.paddingLarge 37 | 38 | Label { 39 | id: label1 40 | width: parent.width 41 | wrapMode: Text.WordWrap 42 | color: Theme.highlightColor 43 | } 44 | 45 | Label { 46 | id: label2 47 | width: parent.width 48 | wrapMode: Text.WordWrap 49 | font.pixelSize: Theme.fontSizeSmall 50 | color: Theme.highlightColor 51 | linkColor: Theme.primaryColor 52 | textFormat: Text.StyledText 53 | onLinkActivated: { 54 | Qt.openUrlExternally(link); 55 | } 56 | } 57 | 58 | Spacer {} 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /qml/MenuIconItem.qml: -------------------------------------------------------------------------------- 1 | /**************************************************************************************** 2 | ** 3 | ** Copyright (C) 2013 Jolla Ltd. 4 | ** Contact: Martin Jones 5 | ** All rights reserved. 6 | ** 7 | ** This file is part of Sailfish Silica UI component package. 8 | ** 9 | ** You may use this file under the terms of BSD license as follows: 10 | ** 11 | ** Redistribution and use in source and binary forms, with or without 12 | ** modification, are permitted provided that the following conditions are met: 13 | ** * Redistributions of source code must retain the above copyright 14 | ** notice, this list of conditions and the following disclaimer. 15 | ** * Redistributions in binary form must reproduce the above copyright 16 | ** notice, this list of conditions and the following disclaimer in the 17 | ** documentation and/or other materials provided with the distribution. 18 | ** * Neither the name of the Jolla Ltd nor the 19 | ** names of its contributors may be used to endorse or promote products 20 | ** derived from this software without specific prior written permission. 21 | ** 22 | ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 23 | ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 24 | ** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 25 | ** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR 26 | ** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 27 | ** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 | ** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 29 | ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 | ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 31 | ** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 | ** 33 | ****************************************************************************************/ 34 | 35 | import QtQuick 2.0 36 | import Sailfish.Silica 1.0 37 | 38 | Item { 39 | id: menuItem 40 | property bool down 41 | property bool highlighted 42 | property alias text: label.text 43 | property alias icon: icon 44 | property string iconSource: "image://icons/icon-m-item" 45 | 46 | signal clicked 47 | 48 | property int __silica_menuitem 49 | property int _duration: 50 50 | property bool _invertColors 51 | on_InvertColorsChanged: _duration = 200 52 | 53 | x: Theme.horizontalPageMargin 54 | width: parent ? parent.width-2*Theme.horizontalPageMargin : Screen.width 55 | height: Theme.itemSizeSmall 56 | 57 | Label { 58 | id: label 59 | truncationMode: TruncationMode.Fade 60 | width: parent.width 61 | height: parent.height 62 | horizontalAlignment: implicitWidth > width && truncationMode != TruncationMode.None ? Text.AlignLeft : Text.AlignHCenter 63 | verticalAlignment: Text.AlignVCenter 64 | color: parent.enabled ? ((parent.down || parent.highlighted) ^ parent._invertColors ? Theme.highlightColor : Theme.primaryColor) 65 | : Theme.rgba(Theme.secondaryColor, 0.4) 66 | Behavior on color { 67 | SequentialAnimation { 68 | ColorAnimation { duration: menuItem._duration } 69 | ScriptAction { script: menuItem._duration = 50 } 70 | } 71 | } 72 | } 73 | 74 | Image { 75 | id: icon 76 | source: parent.iconSource + "?" + (parent.highlighted ? Theme.highlightColor : parent.enabled ? Theme.primaryColor : Theme.secondaryColor) 77 | height: Theme.iconSizeMedium 78 | width: Theme.iconSizeMedium 79 | anchors.right: parent.right 80 | anchors.verticalCenter: parent.verticalCenter 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /qml/Notification.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016-2019 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | import Nemo.Notifications 1.0 23 | 24 | Notification { 25 | id: root 26 | 27 | expireTimeout: 4000 28 | 29 | function show(bodyText, summaryText, clickedHandler) { 30 | //console.log("show: " + bodyText + " " + summaryText) 31 | if (!bodyText || bodyText.length === 0) 32 | return 33 | 34 | if (bodyText === root.body) 35 | close() 36 | 37 | if (clickedHandler) 38 | root.connect.clicked = clickedHandler 39 | summaryText = summaryText ? summaryText : "" 40 | replacesId = 0 41 | body = bodyText 42 | previewBody = bodyText 43 | summary = summaryText 44 | previewSummary = summaryText 45 | publish() 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /qml/PaddedLabel.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014-2019 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Label { 24 | x: Theme.horizontalPageMargin 25 | width: parent.width - 2*x 26 | wrapMode: Text.WordWrap 27 | color: Theme.highlightColor 28 | linkColor: Theme.primaryColor 29 | font.pixelSize: Theme.fontSizeSmall 30 | onLinkActivated: { 31 | Qt.openUrlExternally(link); 32 | } 33 | } 34 | 35 | -------------------------------------------------------------------------------- /qml/PageMenu.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | 24 | PullDownMenu { 25 | id: root 26 | 27 | property bool showAbout: true 28 | property bool showSettings: true 29 | //property bool showSync: true 30 | //property bool showShowOnlyUnread: false 31 | property bool showNetwork: true 32 | 33 | MenuItem { 34 | text: qsTr("About %1").arg(APP_NAME) 35 | visible: root.showAbout 36 | 37 | onClicked: { 38 | pageStack.push(Qt.resolvedUrl("AboutPage.qml")); 39 | } 40 | } 41 | 42 | MenuItem { 43 | text: qsTr("Settings") 44 | visible: root.showSettings 45 | 46 | onClicked: { 47 | pageStack.push(Qt.resolvedUrl("SettingsPage.qml")); 48 | } 49 | } 50 | 51 | MenuItem { 52 | text: settings.offlineMode ? qsTr("Network mode: offline") : qsTr("Network mode: online") 53 | visible: root.showNetwork 54 | enabled: !settings.offlineMode || (settings.offlineMode && dm.online) 55 | 56 | onClicked: { 57 | if (settings.offlineMode) { 58 | if (dm.online) 59 | settings.offlineMode = false; 60 | else 61 | notification.show(qsTr("Cannot switch to online mode because network is disconnected")); 62 | } else { 63 | settings.offlineMode = true; 64 | } 65 | } 66 | } 67 | 68 | /*MenuItem { 69 | text: settings.showOnlyUnread ? qsTr("Showing: only unread") : qsTr("Showing: all articles") 70 | enabled: root.showShowOnlyUnread 71 | visible: enabled 72 | onClicked: { 73 | settings.showOnlyUnread = !settings.showOnlyUnread; 74 | } 75 | }*/ 76 | 77 | /*MenuItem { 78 | text: enabled ? qsTr("Sync") : qsTr("Busy...") 79 | visible: root.showSync 80 | 81 | onClicked: fetcher.update() 82 | enabled: !fetcher.busy && !dm.busy && !dm.removerBusy 83 | }*/ 84 | 85 | onActiveChanged: { 86 | if (active) { 87 | bar.hideAndDisable(); 88 | var lastSync = settings.lastUpdateDate; 89 | if (lastSync>0) 90 | label.text = qsTr("Last sync: %1").arg(utils.getHumanFriendlyTimeString(lastSync)); 91 | else 92 | label.text = qsTr("You have never synced"); 93 | } else { 94 | bar.openable = true; 95 | } 96 | } 97 | 98 | MenuLabel { 99 | id: label 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /qml/PocketAuthWebViewPage.qml: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2017-2022 Michal Kosciesza 2 | * 3 | * This Source Code Form is subject to the terms of the Mozilla Public 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | */ 7 | 8 | import QtQuick 2.1 9 | import Sailfish.Silica 1.0 10 | import Sailfish.WebView 1.0 11 | 12 | WebViewPage { 13 | id: root 14 | 15 | property bool showBar: false 16 | property bool _done: false 17 | property bool _doPop: false 18 | readonly property color _bgColor: Theme.colorScheme === Theme.LightOnDark ? 19 | Qt.darker(Theme.highlightBackgroundColor, 5.0) : 20 | Qt.lighter(Theme.highlightBackgroundColor, 1.8) 21 | 22 | function init() { 23 | view.url = pocket.getAuthUrl() 24 | } 25 | 26 | function navigateBack() { 27 | if (view.canGoBack) { 28 | view.goBack() 29 | } else { 30 | pageStack.pop() 31 | } 32 | } 33 | 34 | Component.onCompleted: { 35 | init() 36 | } 37 | 38 | onForwardNavigationChanged: { 39 | if (forwardNavigation) 40 | forwardNavigation = false 41 | } 42 | 43 | showNavigationIndicator: false 44 | 45 | allowedOrientations: { 46 | switch (settings.allowedOrientations) { 47 | case 1: 48 | return Orientation.PortraitMask; 49 | case 2: 50 | return Orientation.LandscapeMask; 51 | } 52 | return Orientation.All; 53 | } 54 | 55 | onStatusChanged: { 56 | if (status === PageStatus.Active && root._doPop) { 57 | pageStack.pop() 58 | } 59 | } 60 | 61 | WebView { 62 | id: view 63 | 64 | anchors.fill: parent 65 | canShowSelectionMarkers: true 66 | 67 | onUrlChanged: { 68 | var surl = url.toString() 69 | console.log("url changed:", surl) 70 | 71 | if (surl === "https://getpocket.com/a/") { 72 | init() 73 | return 74 | } 75 | 76 | if (surl === "https://localhost/kaktusAuthorizationFinished") { 77 | root._done = true 78 | pocket.check() 79 | if (status === PageStatus.Active) { 80 | pageStack.pop() 81 | } else { 82 | root._doPop = true 83 | } 84 | } 85 | } 86 | } 87 | 88 | IconBar { 89 | id: controlbar 90 | flickable: view 91 | color: root._bgColor 92 | 93 | IconBarItem { 94 | text: qsTr("Back") 95 | icon: "image://theme/icon-m-back" 96 | onClicked: root.navigateBack() 97 | } 98 | } 99 | 100 | Component.onDestruction: { 101 | if (!root._done) { 102 | pocket.cancel() 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /qml/ReadAllDialog.qml: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2016-2022 Michal Kosciesza 2 | * 3 | * This Source Code Form is subject to the terms of the Mozilla Public 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | */ 7 | 8 | import QtQuick 2.0 9 | import Sailfish.Silica 1.0 10 | 11 | import harbour.kaktus.Settings 1.0 12 | 13 | Dialog { 14 | id: root 15 | 16 | property bool showBar: false 17 | property int type: 2 // tabs=0, feeds=1, entries=2 18 | 19 | allowedOrientations: { 20 | switch (settings.allowedOrientations) { 21 | case 1: 22 | return Orientation.PortraitMask; 23 | case 2: 24 | return Orientation.LandscapeMask; 25 | } 26 | return Orientation.All; 27 | } 28 | 29 | ActiveDetector {} 30 | 31 | Column { 32 | anchors { top: parent.top; left: parent.left; right: parent.right } 33 | height: app.flickHeight 34 | Behavior on height {NumberAnimation { duration: 200; easing.type: Easing.OutQuad }} 35 | clip: true 36 | spacing: Theme.paddingSmall 37 | 38 | DialogHeader { 39 | //title: qsTr("Mark as read") 40 | acceptText : qsTr("Yes") 41 | } 42 | 43 | Label { 44 | anchors.left: parent.left; anchors.right: parent.right 45 | anchors.margins: Theme.paddingLarge; 46 | wrapMode: Text.WordWrap 47 | font.pixelSize: Theme.fontSizeLarge 48 | color: Theme.primaryColor 49 | text: { 50 | if (type==0) { 51 | return qsTr("Mark all tabs as read?"); 52 | } 53 | if (type==1) { 54 | return qsTr("Mark feeds as read?"); 55 | } 56 | if (type==2) { 57 | return settings.viewMode === Settings.AllEntries ? qsTr("Mark all your articles as read?") : 58 | settings.viewMode === Settings.SavedEntries ? 59 | settings.signinType<10 || settings.signinType>=20 ? qsTr("Mark all saved articles as read?") : qsTr("Mark all starred articles as read?") : 60 | qsTr("Mark articles as read?"); 61 | } 62 | } 63 | } 64 | } 65 | 66 | onAccepted: { 67 | if (type==0) { 68 | tabModel.setAllAsRead(); 69 | return; 70 | } 71 | if (type==1) { 72 | feedModel.setAllAsRead(); 73 | return; 74 | } 75 | if (type==2) { 76 | entryModel.setAllAsRead(); 77 | return; 78 | } 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /qml/ShareDialog.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2015 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | 24 | Dialog { 25 | id: root 26 | 27 | property bool showBar: false 28 | property int index 29 | property bool actionDone: false 30 | 31 | canAccept: note.text.length > 0 32 | 33 | allowedOrientations: { 34 | switch (settings.allowedOrientations) { 35 | case 1: 36 | return Orientation.PortraitMask; 37 | case 2: 38 | return Orientation.LandscapeMask; 39 | } 40 | return Orientation.All; 41 | } 42 | 43 | ActiveDetector {} 44 | 45 | SilicaFlickable { 46 | anchors {left: parent.left; right: parent.right } 47 | anchors {top: parent.top; bottom: parent.bottom } 48 | anchors.bottomMargin: app.height - app.flickHeight 49 | contentHeight: content.height 50 | 51 | Column { 52 | id: content 53 | anchors { 54 | left: parent.left 55 | right: parent.right 56 | } 57 | 58 | spacing: Theme.paddingSmall 59 | 60 | DialogHeader { 61 | //title: qsTr("Adding note") 62 | acceptText : qsTr("Save note") 63 | } 64 | 65 | TextArea { 66 | id: note 67 | anchors.left: parent.left; anchors.right: parent.right 68 | placeholderText: qsTr("Want to add a note?") 69 | label: qsTr("Note") 70 | focus: true 71 | } 72 | } 73 | } 74 | 75 | onAccepted: { 76 | entryModel.setData(index, "broadcast", true, note.text); 77 | actionDone = true; 78 | } 79 | 80 | Component.onDestruction: { 81 | if (!actionDone) 82 | entryModel.setData(index, "broadcast", true, ""); 83 | } 84 | 85 | } 86 | -------------------------------------------------------------------------------- /qml/ShareLinkPage.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2017 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | //import Sailfish.TransferEngine 1.0 // not available in harbour package 23 | 24 | Page { 25 | id: root 26 | 27 | property string link 28 | property string linkTitle 29 | 30 | readonly property bool showBar: false 31 | 32 | ShareMethodList { 33 | id: shareMethodList 34 | 35 | anchors { top: parent.top; left: parent.left; right: parent.right } 36 | height: app.flickHeight 37 | Behavior on height {NumberAnimation { duration: 200; easing.type: Easing.OutQuad }} 38 | clip: true 39 | 40 | header: PageHeader { 41 | title: qsTr("Share link") 42 | } 43 | 44 | filter: "text/x-url" 45 | content: { 46 | "type": "text/x-url", 47 | "status": root.link, 48 | "linkTitle": root.linkTitle 49 | } 50 | 51 | ViewPlaceholder { 52 | enabled: shareMethodList.model.count === 0 53 | text: qsTr("No sharing accounts available. You can add accounts in settings") 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /qml/SignOutDialog.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | 24 | Dialog { 25 | id: root 26 | 27 | property bool showBar: false 28 | 29 | allowedOrientations: { 30 | switch (settings.allowedOrientations) { 31 | case 1: 32 | return Orientation.PortraitMask; 33 | case 2: 34 | return Orientation.LandscapeMask; 35 | } 36 | return Orientation.All; 37 | } 38 | 39 | ActiveDetector {} 40 | 41 | Column { 42 | anchors { top: parent.top; left: parent.left; right: parent.right } 43 | height: app.flickHeight 44 | Behavior on height {NumberAnimation { duration: 200; easing.type: Easing.OutQuad }} 45 | clip: true 46 | spacing: Theme.paddingSmall 47 | 48 | DialogHeader { 49 | acceptText : qsTr("Yes") 50 | } 51 | 52 | // Sign in types: 53 | // 0 - Netvibes 54 | // 1 - Netvibes with Twitter 55 | // 2 - Netvibes with FB 56 | // 10 - Oldreader 57 | // 20 - Feedly (not supported) 58 | // 22 - Feedly with FB (not supported) 59 | // 30 - Tiny Tiny Rss 60 | 61 | Label { 62 | anchors.left: parent.left; anchors.right: parent.right 63 | anchors.margins: Theme.paddingLarge; 64 | wrapMode: Text.WordWrap 65 | font.pixelSize: Theme.fontSizeLarge 66 | color: Theme.primaryColor 67 | text: settings.signinType < 10 ? 68 | qsTr("Disconnect Netvibes account?") : 69 | settings.signinType < 20 ? 70 | qsTr("Disconnect Old Reader account?") : 71 | settings.signinType < 30 ? 72 | qsTr("Disconnect Feedly account?") : 73 | qsTr("Disconnect Tiny Tiny RSS account?") 74 | } 75 | } 76 | 77 | onAccepted: { 78 | settings.signedIn = false; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /qml/SimpleListItem.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2017-2019 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | ListItem { 24 | id: root 25 | 26 | property alias title: _title.text 27 | property alias icon: _icon.orgSource 28 | property bool showPlaceholder: false 29 | property int unreadCount: 0 30 | property bool small: false 31 | 32 | contentHeight: small ? Theme.itemSizeSmall : Theme.itemSizeMedium 33 | 34 | anchors { 35 | left: parent.left 36 | right: parent.right 37 | } 38 | 39 | IconPlaceholder { 40 | // placeholder 41 | id: placeholder 42 | anchors { 43 | left: parent.left 44 | leftMargin: Theme.horizontalPageMargin 45 | verticalCenter: parent.verticalCenter 46 | } 47 | visible: root.showPlaceholder && 48 | _icon.status !== Image.Ready && 49 | title.length > 0 50 | height: root.small ? Theme.iconSizeMedium * 0.8 : Theme.iconSizeMedium 51 | width: height 52 | text: title 53 | } 54 | 55 | CachedImage { 56 | id: _icon 57 | anchors { 58 | left: parent.left 59 | leftMargin: Theme.horizontalPageMargin 60 | verticalCenter: parent.verticalCenter 61 | } 62 | 63 | height: root.small ? Theme.iconSizeMedium * 0.8 : Theme.iconSizeMedium 64 | width: height 65 | } 66 | 67 | Label { 68 | id: _title 69 | 70 | truncationMode: TruncationMode.Fade 71 | 72 | anchors { 73 | left: !placeholder.visible && !_icon.visible ? parent.left : _icon.right 74 | right: unreadBox.visible ? unreadBox.left : parent.right 75 | leftMargin: Theme.horizontalPageMargin; 76 | rightMargin: Theme.horizontalPageMargin; 77 | verticalCenter: parent.verticalCenter 78 | } 79 | 80 | color: root.highlighted ? Theme.highlightColor : Theme.primaryColor 81 | } 82 | 83 | UnreadBox { 84 | id: unreadBox 85 | anchors { 86 | right: parent.right 87 | rightMargin: Theme.horizontalPageMargin 88 | verticalCenter: parent.verticalCenter 89 | } 90 | count: root.unreadCount 91 | visible: count > 0 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /qml/SmallIconButton.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2017 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | IconButton { 24 | id: root 25 | 26 | property int iconSize: Theme.iconSizeMe 27 | property int marginV: Theme.paddingMedium 28 | property int marginH: Theme.paddingMedium 29 | 30 | icon.height: iconSize 31 | icon.width: iconSize 32 | width: Theme.iconSizeSmall + marginH 33 | height: Theme.iconSizeSmall + marginV 34 | } 35 | -------------------------------------------------------------------------------- /qml/Spacer.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014-2019 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Item { 24 | property real space: Theme.paddingLarge 25 | height: space 26 | width: space 27 | } 28 | 29 | -------------------------------------------------------------------------------- /qml/TempBaner.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | 24 | Rectangle { 25 | id: root 26 | 27 | property alias text: label.text 28 | property alias interval: timer.interval 29 | 30 | function show(text) { 31 | root.text = text 32 | timer.restart() 33 | } 34 | 35 | width: 2*Theme.iconSizeLarge 36 | height: 2*Theme.iconSizeMedium 37 | radius: 10 38 | color: Theme.rgba("black", 0.7) 39 | opacity: timer.running ? 1.0 : 0.0 40 | visible: opacity > 0.0 41 | Behavior on opacity { FadeAnimation {} } 42 | 43 | Timer { 44 | id: timer 45 | interval: 1000 46 | } 47 | 48 | Label { 49 | id: label 50 | anchors.verticalCenter: parent.verticalCenter 51 | horizontalAlignment: Text.AlignHCenter 52 | anchors.left: parent.left; anchors.right: parent.right 53 | font.pixelSize: Theme.fontSizeExtraLarge 54 | color: "white" 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /qml/TextAreaItem.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2017 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Item { 24 | id: root 25 | 26 | property alias textArea: _textArea 27 | property alias description: desc.text 28 | 29 | opacity: enabled ? 1.0 : 0.4 30 | height: col.height + 4*Theme.paddingSmall 31 | 32 | anchors {left: parent.left; right: parent.right} 33 | 34 | Column { 35 | id: col 36 | anchors { 37 | top: parent.top; topMargin: 2*Theme.paddingSmall 38 | left: parent.left; right: parent.right 39 | } 40 | 41 | TextArea { 42 | id: _textArea 43 | enabled: root.enabled 44 | anchors {left: parent.left; right: parent.right} 45 | } 46 | 47 | Label { 48 | id: desc 49 | anchors { 50 | left: parent.left; right: parent.right; 51 | leftMargin: Theme.horizontalPageMargin; rightMargin: Theme.horizontalPageMargin 52 | } 53 | wrapMode: Text.Wrap 54 | font.pixelSize: Theme.fontSizeExtraSmall 55 | color: Theme.secondaryColor 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /qml/TextFieldItem.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2017 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Item { 24 | id: root 25 | 26 | property alias textField: _textField 27 | property alias description: desc.text 28 | 29 | opacity: enabled ? 1.0 : 0.4 30 | height: col.height + 4*Theme.paddingSmall 31 | 32 | anchors {left: parent.left; right: parent.right} 33 | 34 | Column { 35 | id: col 36 | anchors { 37 | top: parent.top; topMargin: 2*Theme.paddingSmall 38 | left: parent.left; right: parent.right 39 | } 40 | 41 | TextField{ 42 | id: _textField 43 | enabled: root.enabled 44 | anchors {left: parent.left; right: parent.right} 45 | } 46 | 47 | Label { 48 | id: desc 49 | anchors { 50 | left: parent.left; right: parent.right; 51 | leftMargin: Theme.horizontalPageMargin; rightMargin: Theme.horizontalPageMargin 52 | } 53 | wrapMode: Text.Wrap 54 | font.pixelSize: Theme.fontSizeExtraSmall 55 | color: Theme.secondaryColor 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /qml/TextSwitchWithIcon.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Item { 24 | id: root 25 | 26 | property alias text: textswitch.text 27 | property alias description: textswitch.description 28 | property alias checked: textswitch.checked 29 | property alias iconSource: icon.source 30 | property alias automaticCheck: textswitch.automaticCheck 31 | property alias busy: textswitch.busy 32 | signal clicked 33 | 34 | anchors.left: parent.left; anchors.right: parent.right 35 | height: Math.max(textswitch.height, icon.height) 36 | 37 | TextSwitch { 38 | id: textswitch 39 | anchors.verticalCenter: parent.verticalCenter 40 | width: parent.width - icon.width - icon.anchors.rightMargin 41 | onClicked: root.clicked() 42 | } 43 | 44 | Image { 45 | id: icon 46 | anchors.verticalCenter: parent.verticalCenter 47 | anchors.right: parent.right 48 | anchors.rightMargin: Theme.paddingMedium 49 | source: "reader.png" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /qml/UnreadAllDialog.qml: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2014-2022 Michal Kosciesza 2 | * 3 | * This Source Code Form is subject to the terms of the Mozilla Public 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | */ 7 | 8 | import QtQuick 2.0 9 | import Sailfish.Silica 1.0 10 | 11 | import harbour.kaktus.Settings 1.0 12 | 13 | Dialog { 14 | id: root 15 | 16 | property bool showBar: false 17 | property int type: 2 // tabs=0, feeds=1, entries=2 18 | 19 | allowedOrientations: { 20 | switch (settings.allowedOrientations) { 21 | case 1: 22 | return Orientation.PortraitMask; 23 | case 2: 24 | return Orientation.LandscapeMask; 25 | } 26 | return Orientation.All; 27 | } 28 | 29 | ActiveDetector {} 30 | 31 | Column { 32 | anchors { top: parent.top; left: parent.left; right: parent.right } 33 | height: app.flickHeight 34 | Behavior on height {NumberAnimation { duration: 200; easing.type: Easing.OutQuad }} 35 | clip: true 36 | spacing: Theme.paddingSmall 37 | 38 | DialogHeader { 39 | acceptText : qsTr("Yes") 40 | } 41 | 42 | Label { 43 | anchors.left: parent.left; anchors.right: parent.right 44 | anchors.margins: Theme.paddingLarge; 45 | wrapMode: Text.WordWrap 46 | font.pixelSize: Theme.fontSizeLarge 47 | color: Theme.primaryColor 48 | text: { 49 | if (type==0) { 50 | return qsTr("Mark tab as unread?"); 51 | } 52 | if (type==1) { 53 | return qsTr("Mark feed as unread?"); 54 | } 55 | if (type==2) { 56 | return settings.viewMode === Settings.AllEntries ? qsTr("Mark all your articles as unread?") : 57 | settings.viewMode === Settings.SavedEntries ? 58 | settings.signinType<10 || settings.signinType>=20 ? qsTr("Mark all saved articles as unread?") : qsTr("Mark all starred articles as unread?") : 59 | qsTr("Mark articles as unread?"); 60 | } 61 | } 62 | } 63 | } 64 | 65 | onAccepted: { 66 | if (type==0) { 67 | tabModel.setAllAsRead(); 68 | return; 69 | } 70 | if (type==1) { 71 | feedModel.setAllAsRead(); 72 | return; 73 | } 74 | if (type==2) { 75 | entryModel.setAllAsRead(); 76 | return; 77 | } 78 | } 79 | 80 | } 81 | -------------------------------------------------------------------------------- /qml/UnreadBox.qml: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014-2019 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | import QtQuick 2.0 21 | import Sailfish.Silica 1.0 22 | 23 | Rectangle { 24 | property int count 25 | 26 | width: unreadlabel.width + 3 * Theme.paddingSmall 27 | height: unreadlabel.height + 2 * Theme.paddingSmall 28 | color: Theme.rgba(Theme.highlightBackgroundColor, 0.2) 29 | radius: 5 30 | 31 | Label { 32 | id: unreadlabel 33 | text: count 34 | anchors.centerIn: parent 35 | color: Theme.colorScheme ? Qt.darker(Theme.highlightColor) : Theme.highlightColor 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /qml/sprite-icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkiol/kaktus/cde8adf77fc4d0e8057e5c79ae638f8355950ccf/qml/sprite-icons.png -------------------------------------------------------------------------------- /rpm/harbour-kaktus.spec: -------------------------------------------------------------------------------- 1 | Name: harbour-kaktus 2 | 3 | # >> macros 4 | # << macros 5 | 6 | %{!?qtc_qmake:%define qtc_qmake %qmake} 7 | %{!?qtc_qmake5:%define qtc_qmake5 %qmake5} 8 | %{!?qtc_make:%define qtc_make make} 9 | %{?qtc_builddir:%define _builddir %qtc_builddir} 10 | Summary: Kaktus 11 | Version: 3.1.1 12 | Release: 1 13 | Group: Qt/Qt 14 | License: MPL-2.0 15 | URL: https://github.com/mkiol/kaktus 16 | Source0: %{name}-%{version}.tar.bz2 17 | Requires: sailfishsilica-qt5 >= 0.10.9 18 | Requires: mlite-qt5 19 | BuildRequires: pkgconfig(sailfishapp) >= 1.0.2 20 | BuildRequires: pkgconfig(Qt5Core) 21 | BuildRequires: pkgconfig(Qt5Qml) 22 | BuildRequires: pkgconfig(Qt5Quick) 23 | BuildRequires: pkgconfig(mlite5) 24 | BuildRequires: desktop-file-utils 25 | BuildRequires: sailfish-components-webview-qt5 26 | BuildRequires: sailfish-components-webview-qt5-pickers 27 | BuildRequires: sailfish-components-webview-qt5-popups 28 | BuildRequires: sailfish-components-webview-qt5-devel 29 | 30 | %description 31 | Multi aggregators feed reader for Sailfish OS 32 | 33 | %prep 34 | %setup -q -n %{name}-%{version} 35 | 36 | # >> setup 37 | # << setup 38 | 39 | %build 40 | # >> build pre 41 | # << build pre 42 | 43 | %qtc_qmake5 44 | 45 | %qtc_make %{?_smp_mflags} 46 | 47 | # >> build post 48 | # << build post 49 | 50 | %install 51 | rm -rf %{buildroot} 52 | # >> install pre 53 | # << install pre 54 | %qmake5_install 55 | 56 | # >> install post 57 | # << install post 58 | 59 | desktop-file-install --delete-original \ 60 | --dir %{buildroot}%{_datadir}/applications \ 61 | %{buildroot}%{_datadir}/applications/*.desktop 62 | 63 | %files 64 | %defattr(-,root,root,-) 65 | %{_bindir} 66 | %{_datadir}/%{name} 67 | %{_datadir}/applications/%{name}.desktop 68 | %{_datadir}/icons/hicolor/*/apps/%{name}.png 69 | # >> files 70 | # << files 71 | -------------------------------------------------------------------------------- /scripts/theme.js: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2022 Michal Kosciesza 2 | * 3 | * This Source Code Form is subject to the terms of the Mozilla Public 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | */ 7 | 8 | function _theme_init(settings) { 9 | window._theme_settings = settings 10 | 11 | var vcontent = 'width=device-width; user-scalable=0' 12 | var viewport = document.querySelector("meta[name='viewport']") 13 | if (viewport) { 14 | viewport.content = vcontent 15 | } else { 16 | var meta = document.createElement("meta") 17 | var name = document.createAttribute("name") 18 | name.value = "viewport" 19 | var content = document.createAttribute("content") 20 | content.value = vcontent 21 | meta.setAttributeNode(name) 22 | meta.setAttributeNode(content) 23 | var head_o = window._reader_view_possible ? 24 | window._reader_view_origdoc.getElementsByTagName('head').item(0) : document.head 25 | var head_r = window._reader_view_possible ? 26 | window._reader_view_doc.getElementsByTagName('head').item(0) : null 27 | if (head_o) head_o.appendChild(meta) 28 | if (head_r) head_r.appendChild(meta.cloneNode(true)) 29 | } 30 | 31 | window._theme_possible = true 32 | return true 33 | } 34 | 35 | function _theme_set(enabled) { 36 | if (!window._theme_possible) return false 37 | var style_o = window._reader_view_possible ? 38 | window._reader_view_origdoc.getElementsByClassName('_theme_class').item(0) : 39 | document.documentElement.getElementsByClassName('_theme_class').item(0) 40 | var style_r = window._reader_view_possible && window._reader_view_doc ? 41 | window._reader_view_doc.getElementsByClassName('_theme_class').item(0) : null 42 | var s = window._theme_settings 43 | var css = enabled ? ` 44 | * { 45 | font-family: "${s.fontFamily}" 46 | background-color: ${s.bgColor} !important; 47 | color: ${s.primaryColor} !important; 48 | } 49 | select { color: ${s.bgColor} !important; } 50 | a { color: ${s.highlightColor} !important; } 51 | body { 52 | margin: 0; 53 | background-color: ${s.bgColor} !important; 54 | padding: ${s.pageMargin}px ${s.pageMargin}px ${s.pageMarginBottom}px ${s.pageMargin}px; 55 | } 56 | img { max-width: 100% !important; max-height: device-height !important; } 57 | buttom, input, form { max-width: 100% !important; max-height: device-height !important; } 58 | a, h1, h2, h3, div, p, pre, code { word-wrap: break-word; } 59 | h1, h1, h3 { font-family: "${s.fontFamilyHeading}"; } 60 | #_kaktus_img { margin-bottom: 10px; }` : '' 61 | if (style_o) { 62 | style_o.innerHTML = css 63 | if (style_r) style_r.innerHTML = css 64 | } else { 65 | var style = document.createElement('style') 66 | style.className = '_theme_class' 67 | style.type = 'text/css' 68 | style.appendChild(document.createTextNode(css)) 69 | var head_o = window._reader_view_possible ? 70 | window._reader_view_origdoc.getElementsByTagName('head').item(0) : document.head 71 | var head_r = window._reader_view_possible ? 72 | window._reader_view_doc.getElementsByTagName('head').item(0) : null 73 | if (head_o) head_o.appendChild(style) 74 | if (head_r) head_r.appendChild(style.cloneNode(true)) 75 | } 76 | 77 | return true 78 | } 79 | 80 | window._theme_possible = false 81 | window._theme_settings = null 82 | window._theme_set = _theme_set 83 | -------------------------------------------------------------------------------- /src/cacheserver.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2014-2022 Michal Kosciesza 2 | * 3 | * This Source Code Form is subject to the terms of the Mozilla Public 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | */ 7 | 8 | #ifndef CACHESERVER_H 9 | #define CACHESERVER_H 10 | 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | #include "databasemanager.h" 18 | #include "qhttpserver/qhttprequest.h" 19 | #include "qhttpserver/qhttpresponse.h" 20 | #include "qhttpserver/qhttpserver.h" 21 | #include "settings.h" 22 | #include "singleton.h" 23 | 24 | class FilteringWorker : public QThread { 25 | Q_OBJECT 26 | public: 27 | explicit FilteringWorker(QObject *parent = nullptr); 28 | QHttpResponse *resp = nullptr; 29 | QHttpRequest *req = nullptr; 30 | QByteArray data; 31 | bool error = false; 32 | 33 | protected: 34 | void run(); 35 | 36 | public slots: 37 | void start(QHttpRequest *req, QHttpResponse *resp); 38 | 39 | private: 40 | QString content; 41 | DatabaseManager::CacheItem item; 42 | 43 | void filter(); 44 | bool filterArticle(); 45 | void filterOffline(); 46 | void filterOnline(); 47 | void removeUrls(const QRegExp &rx); 48 | void resolveRelativeUrls(const QRegExp &rx); 49 | }; 50 | 51 | class CacheServer : public QObject, public Singleton { 52 | Q_OBJECT 53 | public: 54 | static bool readFile(const QString &filename, QByteArray &data); 55 | static bool readFile2(const QString &path, QByteArray &data); 56 | static QString getFileUrl(const QString &id); 57 | static QByteArray getDataUrlByUrl(const QString &item); 58 | static bool getPathAndContentTypeByUrl(const QString &url, QString &path, 59 | QString &contentType); 60 | explicit CacheServer(QObject *parent = nullptr); 61 | 62 | Q_INVOKABLE QString getUrlbyId(const QString &item); 63 | Q_INVOKABLE QString getUrlbyUrl(const QString &item); 64 | Q_INVOKABLE QString getCacheUrlbyUrl(const QString &item); 65 | Q_INVOKABLE QString getPathByUrl(const QString &url); 66 | 67 | public slots: 68 | void handle(QHttpRequest *req, QHttpResponse *resp); 69 | void handleFinish(); 70 | 71 | signals: 72 | void startWorker(QHttpRequest*, QHttpResponse*); 73 | 74 | private: 75 | static const int port = 9999; 76 | 77 | QHttpServer *server = nullptr; 78 | }; 79 | 80 | #endif // CACHESERVER_H 81 | -------------------------------------------------------------------------------- /src/customnetworkaccessmanager.cpp: -------------------------------------------------------------------------------- 1 | #include "customnetworkaccessmanager.h" 2 | #include 3 | #include 4 | 5 | CustomNetworkAccessManager::CustomNetworkAccessManager(const QString &userAgent, QObject *parent) : 6 | QNetworkAccessManager(parent), userAgent(userAgent) 7 | { 8 | this->setNetworkAccessible(QNetworkAccessManager::Accessible); 9 | } 10 | 11 | QNetworkReply *CustomNetworkAccessManager::createRequest(Operation operation, const QNetworkRequest &reqest, QIODevice *outgoingData) 12 | { 13 | //qDebug() << "CustomNetworkAccessManager::createRequest, url:" << reqest.url().toString(); 14 | 15 | QNetworkRequest newRequest(reqest); 16 | newRequest.setRawHeader("User-Agent", userAgent.toLatin1()); 17 | 18 | QNetworkReply *reply = QNetworkAccessManager::createRequest(operation, newRequest, outgoingData); 19 | return reply; 20 | } 21 | -------------------------------------------------------------------------------- /src/customnetworkaccessmanager.h: -------------------------------------------------------------------------------- 1 | #ifndef CUSTOMNETWORKACCESSMANAGER_H 2 | #define CUSTOMNETWORKACCESSMANAGER_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | class CustomNetworkAccessManager: public QNetworkAccessManager 9 | { 10 | 11 | public: 12 | explicit CustomNetworkAccessManager(const QString &userAgent, QObject *parent = 0); 13 | QNetworkReply *createRequest(Operation operation, const QNetworkRequest &reqest, QIODevice *outgoingData); 14 | 15 | private: 16 | QString userAgent; 17 | 18 | }; 19 | 20 | #endif // CUSTOMNETWORKACCESSMANAGER_H 21 | -------------------------------------------------------------------------------- /src/dashboardmodel.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | #include "databasemanager.h" 21 | #include "dashboardmodel.h" 22 | 23 | DashboardModel::DashboardModel(QObject *parent) : 24 | ListModel(new DashboardItem, parent) 25 | { 26 | } 27 | 28 | void DashboardModel::init() 29 | { 30 | if(rowCount()>0) removeRows(0,rowCount()); 31 | createItems(); 32 | } 33 | 34 | void DashboardModel::createItems() 35 | { 36 | auto db = DatabaseManager::instance(); 37 | QList list = db->readDashboards(); 38 | QList::iterator i = list.begin(); 39 | while( i != list.end() ) { 40 | //qDebug() << (*i).id << (*i).title; 41 | appendRow(new DashboardItem((*i).id, 42 | (*i).name, 43 | (*i).title, 44 | (*i).description 45 | )); 46 | ++i; 47 | } 48 | 49 | } 50 | 51 | void DashboardModel::sort() 52 | { 53 | } 54 | 55 | int DashboardModel::count() 56 | { 57 | return this->rowCount(); 58 | } 59 | 60 | QObject* DashboardModel::get(int i) 61 | { 62 | return (QObject*) this->readRow(i); 63 | } 64 | 65 | // ---------------------------------------------------------------- 66 | 67 | DashboardItem::DashboardItem(const QString &uid, 68 | const QString &name, 69 | const QString &title, 70 | const QString &description, 71 | QObject *parent) : 72 | ListItem(parent), 73 | m_uid(uid), 74 | m_name(name), 75 | m_title(title), 76 | m_description(description) 77 | {} 78 | 79 | QHash DashboardItem::roleNames() const 80 | { 81 | QHash names; 82 | names[UidRole] = "uid"; 83 | names[NameRole] = "name"; 84 | names[TitleRole] = "title"; 85 | names[DescriptionRole] = "description"; 86 | return names; 87 | } 88 | 89 | QVariant DashboardItem::data(int role) const 90 | { 91 | switch(role) { 92 | case UidRole: 93 | return uid(); 94 | case NameRole: 95 | return name(); 96 | case TitleRole: 97 | return title(); 98 | case DescriptionRole: 99 | return description(); 100 | default: 101 | return QVariant(); 102 | } 103 | } 104 | 105 | -------------------------------------------------------------------------------- /src/dashboardmodel.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | #ifndef DASHBOARDMODEL_H 21 | #define DASHBOARDMODEL_H 22 | 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | 32 | #include "listmodel.h" 33 | #include "tabmodel.h" 34 | 35 | class DashboardItem : public ListItem 36 | { 37 | Q_OBJECT 38 | 39 | public: 40 | enum Roles { 41 | UidRole = Qt::UserRole+1, 42 | NameRole, 43 | TitleRole = Qt::DisplayRole, 44 | DescriptionRole 45 | }; 46 | 47 | public: 48 | DashboardItem(QObject *parent = nullptr): ListItem(parent) {} 49 | explicit DashboardItem(const QString &uid, 50 | const QString &name, 51 | const QString &title, 52 | const QString &description, 53 | QObject *parent = 0); 54 | QVariant data(int role) const; 55 | QHash roleNames() const; 56 | inline QString id() const { return m_uid; } 57 | inline QString uid() const { return m_uid; } 58 | inline QString name() const { return m_name; } 59 | inline QString title() const { return m_title; } 60 | inline QString description() const { return m_description; } 61 | 62 | private: 63 | QString m_uid; 64 | QString m_name; 65 | QString m_title; 66 | QString m_description; 67 | }; 68 | 69 | class DashboardModel : public ListModel 70 | { 71 | Q_OBJECT 72 | 73 | public: 74 | explicit DashboardModel(QObject *parent = nullptr); 75 | Q_INVOKABLE void init(); 76 | Q_INVOKABLE int count(); 77 | Q_INVOKABLE QObject* get(int i); 78 | 79 | private: 80 | void createItems(); 81 | void sort(); 82 | }; 83 | 84 | #endif // DASHBOARDMODEL_H 85 | -------------------------------------------------------------------------------- /src/feedmodel.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2014-2022 Michal Kosciesza 2 | * 3 | * This Source Code Form is subject to the terms of the Mozilla Public 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | */ 7 | 8 | #ifndef FEEDMODEL_H 9 | #define FEEDMODEL_H 10 | 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | #include "listmodel.h" 20 | 21 | class FeedItem : public ListItem { 22 | Q_OBJECT 23 | 24 | public: 25 | enum Roles { 26 | UidRole = Qt::UserRole + 1, 27 | TitleRole = Qt::DisplayRole, 28 | ContentRole, 29 | LinkRole, 30 | UrlRole, 31 | IconRole, 32 | StreamIdRole, 33 | UnreadRole, 34 | ReadRole, 35 | ReadlaterRole, 36 | FreshRole 37 | }; 38 | 39 | public: 40 | FeedItem(QObject *parent = nullptr) : ListItem(parent) {} 41 | explicit FeedItem(const QString &uid, const QString &title, 42 | const QString &content, const QString &link, 43 | const QString &url, const QString &icon, 44 | const QString &streamId, int unread, int read, 45 | int readlater, int fresh, QObject *parent = nullptr); 46 | QVariant data(int role) const override; 47 | QHash roleNames() const override; 48 | inline QString id() const override { return m_uid; } 49 | inline QString uid() const { return m_uid; } 50 | inline QString title() const { return m_title; } 51 | inline QString content() const { return m_content; } 52 | inline QString link() const { return m_link; } 53 | inline QString url() const { return m_url; } 54 | inline QString icon() const { return m_icon; } 55 | inline QString streamId() const { return m_streamid; } 56 | inline int unread() const { return m_unread; } 57 | inline int read() const { return m_read; } 58 | inline int readlater() const { return m_readlater; } 59 | inline int fresh() const { return m_fresh; } 60 | 61 | void setReadlater(int value); 62 | void setUnread(int value); 63 | void setRead(int value); 64 | 65 | private: 66 | QString m_uid; 67 | QString m_title; 68 | QString m_content; 69 | QString m_link; 70 | QString m_url; 71 | QString m_icon; 72 | QString m_streamid; 73 | int m_unread = 0; 74 | int m_read = 0; 75 | int m_readlater = 0; 76 | int m_fresh = 0; 77 | }; 78 | 79 | class FeedModel : public ListModel { 80 | Q_OBJECT 81 | 82 | public: 83 | explicit FeedModel(QObject *parent = nullptr); 84 | void init(const QString &tabId); 85 | void init(); 86 | 87 | Q_INVOKABLE void markAsUnread(int row); 88 | Q_INVOKABLE void markAsRead(int row); 89 | 90 | Q_INVOKABLE void setAllAsUnread(); 91 | Q_INVOKABLE void setAllAsRead(); 92 | 93 | Q_INVOKABLE void updateFlags(); 94 | 95 | Q_INVOKABLE int countRead() const; 96 | Q_INVOKABLE int countUnread() const; 97 | Q_INVOKABLE int count() const; 98 | 99 | private: 100 | QString _tabId; 101 | 102 | void createItems(const QString &dashboardId); 103 | }; 104 | 105 | #endif // FEEDMODEL_H 106 | -------------------------------------------------------------------------------- /src/iconprovider.cpp: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2015-2022 Michal Kosciesza 2 | * 3 | * This Source Code Form is subject to the terms of the Mozilla Public 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | */ 7 | 8 | #include "iconprovider.h" 9 | 10 | #include 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | static inline QString pathTo(const QString &dir) { 19 | return SailfishApp::pathTo(dir).toString(QUrl::RemoveScheme); 20 | } 21 | 22 | IconProvider::IconProvider() 23 | : QQuickImageProvider(QQuickImageProvider::Pixmap) { 24 | auto ratio = 25 | MGConfItem(QStringLiteral("/desktop/sailfish/silica/theme_pixel_ratio")) 26 | .value() 27 | .toDouble(); 28 | qDebug() << "device pixel ratio:" << ratio; 29 | if (ratio == 1.0) { 30 | themeDir = pathTo(QStringLiteral("images/z1.0")); 31 | } else if (ratio == 1.25) { 32 | themeDir = pathTo(QStringLiteral("images/z1.25")); 33 | } else if (ratio == 1.5) { 34 | themeDir = pathTo(QStringLiteral("images/z1.5")); 35 | } else if (ratio == 1.65 || ratio == 1.75 || ratio == 1.8) { 36 | themeDir = pathTo(QStringLiteral("images/z1.75")); 37 | } else if (ratio == 2.0) { 38 | themeDir = pathTo(QStringLiteral("images/z2.0")); 39 | } else { 40 | qWarning() << "Unknown pixel ratio so, defaulting to 1.0"; 41 | themeDir = pathTo(QStringLiteral("images/z1.0")); 42 | } 43 | } 44 | 45 | QPixmap IconProvider::requestPixmap(const QString &id, QSize *size, 46 | const QSize &requestedSize) { 47 | auto parts = id.split('?'); 48 | auto filepath = QString{"%1/%2.png"}.arg(themeDir, parts.at(0)); 49 | if (!QFile::exists(filepath)) { 50 | filepath = themeDir + "/icon-m-item.png"; 51 | } 52 | 53 | QPixmap pixmap{filepath}; 54 | 55 | if (parts.size() > 1 && QColor::isValidColor(parts.at(1))) { 56 | QPainter painter{&pixmap}; 57 | painter.setCompositionMode(QPainter::CompositionMode_SourceIn); 58 | painter.fillRect(pixmap.rect(), parts.at(1)); 59 | painter.end(); 60 | } 61 | 62 | if (size) *size = pixmap.size(); 63 | 64 | if (requestedSize.width() > 0 && requestedSize.height() > 0) { 65 | return pixmap.scaled(requestedSize.width(), requestedSize.height()); 66 | } 67 | 68 | return pixmap; 69 | } 70 | -------------------------------------------------------------------------------- /src/iconprovider.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2015-2022 Michal Kosciesza 2 | * 3 | * This Source Code Form is subject to the terms of the Mozilla Public 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | */ 7 | 8 | #ifndef ICONPROVIDER_H 9 | #define ICONPROVIDER_H 10 | 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | class IconProvider : public QQuickImageProvider { 17 | public: 18 | IconProvider(); 19 | QPixmap requestPixmap(const QString &id, QSize *size, 20 | const QSize &requestedSize); 21 | 22 | private: 23 | QString themeDir; 24 | }; 25 | 26 | #endif // ICONPROVIDER_H 27 | -------------------------------------------------------------------------------- /src/info.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2014-2022 Michal Kosciesza 2 | * 3 | * This Source Code Form is subject to the terms of the Mozilla Public 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | */ 7 | 8 | #ifndef INFO_H 9 | #define INFO_H 10 | 11 | namespace Kaktus { 12 | static constexpr const char* ORG = "org.mkiol"; 13 | static constexpr const char* APP_ID = "kaktus"; 14 | static constexpr const char* APP_BINARY_ID = "harbour-kaktus"; 15 | static constexpr const char* APP_NAME = "Kaktus"; 16 | static constexpr const char* APP_VERSION = "3.1.1"; 17 | static constexpr const char* AUTHOR = "Michal Kosciesza"; 18 | static constexpr const char* COPYRIGHT_YEAR = "2014-2022"; 19 | static constexpr const char* AUTHOR1 = "Renaud Casenave-Péré"; 20 | static constexpr const char* COPYRIGHT_YEAR1 = "2019"; 21 | static constexpr const char* SUPPORT_EMAIL = "kaktus@mkiol.net"; 22 | static constexpr const char* PAGE = "https://github.com/mkiol/kaktus"; 23 | static constexpr const char* LICENSE = "Mozilla Public License 2.0"; 24 | static constexpr const char* LICENSE_URL = "http://mozilla.org/MPL/2.0/"; 25 | static constexpr const char* LICENSE_SPDX = "MPL-2.0"; 26 | } // namespace Kaktus 27 | 28 | #endif // INFO_H 29 | -------------------------------------------------------------------------------- /src/key.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2014-2022 Michal Kosciesza 2 | * 3 | * This Source Code Form is subject to the terms of the Mozilla Public 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | */ 7 | 8 | #include 9 | 10 | static const quint64 KEY = Q_UINT64_C(0x031cba4a598fa563); 11 | static const QString pocket_consumer_key = "64686-73ae488f0e124fb6e414ce00"; 12 | -------------------------------------------------------------------------------- /src/listmodel.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Christophe Dumez 3 | * License: Public domain (No attribution required) 4 | * Website: http://cdumez.blogspot.com/ 5 | * Version: 1.0 6 | */ 7 | 8 | #ifndef LISTMODEL_H 9 | #define LISTMODEL_H 10 | 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | class ListItem: public QObject { 17 | Q_OBJECT 18 | 19 | public: 20 | ListItem(QObject* parent = 0) : QObject(parent) {} 21 | virtual ~ListItem() {} 22 | virtual QString id() const = 0; 23 | virtual QVariant data(int role) const = 0; 24 | virtual QHash roleNames() const = 0; 25 | 26 | signals: 27 | void dataChanged(); 28 | }; 29 | 30 | class ListModel : public QAbstractListModel 31 | { 32 | Q_OBJECT 33 | 34 | public: 35 | explicit ListModel(ListItem* prototype, QObject* parent = 0); 36 | ~ListModel(); 37 | int rowCount(const QModelIndex &parent = QModelIndex()) const; 38 | QHash roleNames() const; 39 | QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; 40 | void appendRow(ListItem* item); 41 | void appendRows(const QList &items); 42 | void insertRow(int row, ListItem* item); 43 | bool removeRow(int row, const QModelIndex &parent = QModelIndex()); 44 | bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()); 45 | void moveRow(int orig, int dest, const QModelIndex &parent = QModelIndex()); 46 | ListItem* takeRow(int row); 47 | ListItem* readRow(int row); 48 | ListItem* find(const QString &id) const; 49 | QModelIndex indexFromItem( const ListItem* item) const; 50 | void clear(); 51 | 52 | private slots: 53 | void handleItemChange(); 54 | 55 | private: 56 | ListItem* m_prototype; 57 | QList m_list; 58 | }; 59 | 60 | #endif // LISTMODEL_H 61 | -------------------------------------------------------------------------------- /src/networkaccessmanagerfactory.cpp: -------------------------------------------------------------------------------- 1 | #include "networkaccessmanagerfactory.h" 2 | #include "customnetworkaccessmanager.h" 3 | 4 | #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) // QT5 5 | 6 | NetworkAccessManagerFactory::NetworkAccessManagerFactory(const QString &userAgent) : QQmlNetworkAccessManagerFactory(), 7 | userAgent(userAgent) 8 | { 9 | } 10 | 11 | #else // QT5 12 | 13 | NetworkAccessManagerFactory::NetworkAccessManagerFactory(const QString &userAgent) : QDeclarativeNetworkAccessManagerFactory(), 14 | userAgent(userAgent) 15 | { 16 | } 17 | 18 | #endif // QT5 19 | 20 | QNetworkAccessManager* NetworkAccessManagerFactory::create(QObject* parent) 21 | { 22 | CustomNetworkAccessManager* manager = new CustomNetworkAccessManager(userAgent, parent); 23 | return manager; 24 | } 25 | -------------------------------------------------------------------------------- /src/networkaccessmanagerfactory.h: -------------------------------------------------------------------------------- 1 | #ifndef NETWORKACCESSMANAGERFACTORY_H 2 | #define NETWORKACCESSMANAGERFACTORY_H 3 | 4 | #include 5 | #include 6 | 7 | #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) // QT5 8 | #include 9 | 10 | class NetworkAccessManagerFactory: public QQmlNetworkAccessManagerFactory 11 | { 12 | #else // QT5 13 | #include 14 | 15 | class NetworkAccessManagerFactory: public QDeclarativeNetworkAccessManagerFactory 16 | { 17 | #endif // QT5 18 | 19 | public: 20 | explicit NetworkAccessManagerFactory(const QString &userAgent); 21 | virtual QNetworkAccessManager *create(QObject* parent); 22 | 23 | private: 24 | QString userAgent; 25 | 26 | }; 27 | 28 | #endif // NETWORKACCESSMANAGERFACTORY_H 29 | -------------------------------------------------------------------------------- /src/nvfetcher.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2015 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | #ifndef NVFETCHER_H 21 | #define NVFETCHER_H 22 | 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) 30 | #include 31 | #else 32 | #include 33 | #endif 34 | 35 | #include "fetcher.h" 36 | #include "databasemanager.h" 37 | 38 | class NvFetcher : public Fetcher 39 | { 40 | Q_OBJECT 41 | public: 42 | explicit NvFetcher(QObject *parent = 0); 43 | 44 | Q_INVOKABLE void getConnectUrl(int type); 45 | Q_INVOKABLE bool setConnectUrl(const QString &url); 46 | 47 | protected: 48 | void run(); 49 | 50 | private Q_SLOTS: 51 | void finishedGetAuthUrl(); 52 | void finishedSignIn(); 53 | void finishedSignInOnlyCheck(); 54 | void finishedDashboards(); 55 | void finishedDashboards2(); 56 | void finishedTabs(); 57 | void finishedTabs2(); 58 | void finishedFeeds(); 59 | void finishedFeeds2(); 60 | void finishedFeedsUpdate(); 61 | void finishedFeedsUpdate2(); 62 | void finishedFeedsReadlater(); 63 | void finishedFeedsReadlater2(); 64 | void finishedSetAction(); 65 | 66 | private: 67 | enum Job { Idle, StoreDashboards, StoreTabs, StoreFeeds, 68 | StoreFeedsInfo, StoreFeedsUpdate, StoreFeedsReadlater 69 | }; 70 | 71 | static const int feedsAtOnce = 5; 72 | static const int limitFeeds = 25; 73 | static const int limitFeedsUpdate = 25; 74 | static const int limitFeedsReadlater = 25; 75 | static const int feedsUpdateAtOnce = 10; 76 | 77 | Job currentJob; 78 | QStringList dashboardList; 79 | QStringList tabList; 80 | QList streamList; 81 | QList streamUpdateList; 82 | QList storedStreamList; 83 | int publishedBeforeDate = 0; 84 | 85 | void signIn(); 86 | void startFetching(); 87 | void uploadActions(); 88 | void fetchDashboards(const QString &url = "http://www.netvibes.com/privatepage/0"); 89 | void fetchTabs(); 90 | void fetchFeeds(); 91 | void fetchFeedsUpdate(); 92 | void fetchFeedsReadlater(); 93 | void setAction(); 94 | 95 | void startJob(Job job); 96 | 97 | void storeDashboards(); 98 | void storeDashboardsByParsingHtml(); 99 | void storeTabs(); 100 | int storeFeeds(); 101 | 102 | void setCookie(QNetworkRequest &request, const QString &cookie); 103 | bool checkCookie(const QString &cookie); 104 | bool checkError(); 105 | void cleanNewFeeds(); 106 | void cleanRemovedFeeds(); 107 | void removeAction(); 108 | }; 109 | 110 | #endif // NVFETCHER_H 111 | -------------------------------------------------------------------------------- /src/nviconprovider.cpp: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2015-2022 Michal Kosciesza 2 | * 3 | * This Source Code Form is subject to the terms of the Mozilla Public 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | */ 7 | 8 | #include "nviconprovider.h" 9 | 10 | #include 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | const QString NvIconProvider::availableColors[6] = {"green", "blue", "orange", 19 | "pink", "grey", "purple"}; 20 | const QString NvIconProvider::spriteMap[5][10] = { 21 | {"plus", "home", "label-2", "star", "label", "pin", "sheet", "power", 22 | "diamond", "folder"}, 23 | {"enveloppe", "happy-face", "rss", "calc", "clock", "pen", "bug", 24 | "label-box", "yen", "snail"}, 25 | {"cloud", "cog", "vbar", "pie", "table", "line", "magnifier", "potion", 26 | "pound", "euro"}, 27 | {"lightbulb", "movie", "note", "camera", "mobile", "computer", "heart", 28 | "bubbles", "dollars"}, 29 | {"alert", "bill", "funnel", "eye", "bubble", "calendar", "check", "crown", 30 | "plane"}}; 31 | 32 | QPixmap NvIconProvider::requestPixmap(const QString &id, QSize *size, 33 | const QSize &requestedSize) { 34 | auto parts = id.split('?'); 35 | if (parts.size() < 2) parts = QStringList{"plus", "green"}; 36 | 37 | QPixmap iconsPixmap{SailfishApp::pathTo("qml/sprite-icons.png") 38 | .toString(QUrl::RemoveScheme)}; 39 | auto iconPixmap = iconsPixmap.copy(getPosition(parts.at(0), parts.at(1))); 40 | 41 | if (size) *size = iconPixmap.size(); 42 | 43 | if (requestedSize.width() > 0 && requestedSize.height() > 0) { 44 | return iconPixmap.scaled(requestedSize.width(), requestedSize.height(), 45 | Qt::IgnoreAspectRatio); 46 | } 47 | 48 | return iconPixmap; 49 | } 50 | 51 | QRect NvIconProvider::getPosition(const QString &icon, const QString &color) { 52 | static const int rows = 5; 53 | static const int cols = 10; 54 | static const int size = 40; 55 | static const int x_off = 30; 56 | static const int y_off = 28; 57 | 58 | for (int i = 0; i < rows; ++i) { 59 | for (int j = 0; j < cols; ++j) { 60 | if (spriteMap[i][j] == icon) { 61 | return {x_off + (6 * size * i) + getOffsetByColor(color), 62 | y_off + (j * size), size, size}; 63 | } 64 | } 65 | } 66 | 67 | return {x_off, y_off, size, size}; 68 | } 69 | 70 | int NvIconProvider::getOffsetByColor(const QString &color) { 71 | int index = 0; 72 | 73 | for (int i = 0; i < 6; ++i) { 74 | if (availableColors[i] == color) { 75 | index = i; 76 | break; 77 | } 78 | } 79 | 80 | return index * 40; 81 | } 82 | -------------------------------------------------------------------------------- /src/nviconprovider.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2015-2022 Michal Kosciesza 2 | * 3 | * This Source Code Form is subject to the terms of the Mozilla Public 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | */ 7 | 8 | #ifndef NVICONPROVIDER_H 9 | #define NVICONPROVIDER_H 10 | 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | class NvIconProvider : public QQuickImageProvider { 18 | public: 19 | NvIconProvider() : QQuickImageProvider{QQuickImageProvider::Pixmap} {} 20 | QPixmap requestPixmap(const QString &id, QSize *size, 21 | const QSize &requestedSize); 22 | 23 | private: 24 | static const QString availableColors[6]; 25 | static const QString spriteMap[5][10]; 26 | 27 | static int getOffsetByColor(const QString &color); 28 | static QRect getPosition(const QString &icon, const QString &color); 29 | }; 30 | 31 | #endif // NVICONPROVIDER_H 32 | -------------------------------------------------------------------------------- /src/singleton.h: -------------------------------------------------------------------------------- 1 | #ifndef SINGLETON_H 2 | #define SINGLETON_H 3 | 4 | #include 5 | 6 | template 7 | class Singleton { 8 | protected: 9 | Singleton() = default; 10 | Singleton(const Singleton&) = delete; 11 | Singleton& operator=(const Singleton&) = delete; 12 | Singleton& operator=(Singleton&&) = delete; 13 | virtual ~Singleton() = default; 14 | 15 | public: 16 | template 17 | static T* instance(Args... args) { 18 | static T inst{std::forward(args)...}; 19 | return &inst; 20 | } 21 | }; 22 | 23 | #endif // SINGLETON_H 24 | -------------------------------------------------------------------------------- /src/tabmodel.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2014 Michal Kosciesza 3 | 4 | This file is part of Kaktus. 5 | 6 | Kaktus is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Kaktus is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Kaktus. If not, see . 18 | */ 19 | 20 | #ifndef TABMODEL_H 21 | #define TABMODEL_H 22 | 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | 31 | #include "listmodel.h" 32 | 33 | class TabItem : public ListItem 34 | { 35 | Q_OBJECT 36 | 37 | public: 38 | enum Roles { 39 | UidRole = Qt::UserRole+1, 40 | TitleRole = Qt::DisplayRole, 41 | IconRole, 42 | UnreadRole, 43 | ReadRole, 44 | ReadlaterRole, 45 | FreshRole 46 | }; 47 | 48 | TabItem(QObject *parent = nullptr): ListItem(parent) {} 49 | explicit TabItem(const QString &uid, 50 | const QString &title, 51 | const QString &icon, 52 | int unread, 53 | int read, 54 | int readlater, 55 | int fresh, 56 | QObject *parent = nullptr); 57 | QVariant data(int role) const; 58 | QHash roleNames() const; 59 | inline QString id() const { return m_uid; } 60 | inline QString uid() const { return m_uid; } 61 | inline QString title() const { return m_title; } 62 | inline QString icon() const { return m_icon; } 63 | inline int unread() const { return m_unread; } 64 | inline int read() const { return m_read; } 65 | inline int readlater() const { return m_readlater; } 66 | inline int fresh() const { return m_fresh; } 67 | 68 | void setReadlater(int value); 69 | void setUnread(int value); 70 | void setRead(int value); 71 | 72 | private: 73 | QString m_uid; 74 | QString m_title; 75 | QString m_icon; 76 | int m_unread; 77 | int m_read; 78 | int m_readlater; 79 | int m_fresh; 80 | }; 81 | 82 | class TabModel : public ListModel 83 | { 84 | Q_OBJECT 85 | 86 | public: 87 | explicit TabModel(QObject *parent = nullptr); 88 | void init(const QString &dashboardId); 89 | 90 | Q_INVOKABLE void markAsUnread(int row); 91 | Q_INVOKABLE void markAsRead(int row); 92 | 93 | Q_INVOKABLE void setAllAsUnread(); 94 | Q_INVOKABLE void setAllAsRead(); 95 | 96 | Q_INVOKABLE int countRead(); 97 | Q_INVOKABLE int countUnread(); 98 | Q_INVOKABLE int count(); 99 | 100 | public Q_SLOTS: 101 | void updateFlags(); 102 | void init(); 103 | 104 | private: 105 | QString _dashboardId; 106 | 107 | void createItems(const QString &dashboardId); 108 | void sort(); 109 | }; 110 | 111 | #endif // TABMODEL_H 112 | -------------------------------------------------------------------------------- /src/utils.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2014-2022 Michal Kosciesza 2 | * 3 | * This Source Code Form is subject to the terms of the Mozilla Public 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | */ 7 | 8 | #ifndef UTILS_H 9 | #define UTILS_H 10 | 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | #include "dashboardmodel.h" 18 | #include "entrymodel.h" 19 | #include "feedmodel.h" 20 | #include "settings.h" 21 | #include "tabmodel.h" 22 | 23 | class Utils : public QObject { 24 | Q_OBJECT 25 | 26 | public: 27 | explicit Utils(QObject *parent = nullptr); 28 | Q_INVOKABLE void setEntryModel(const QString &feedId); 29 | Q_INVOKABLE void setFeedModel(const QString &tabId); 30 | Q_INVOKABLE void setRootModel(); 31 | Q_INVOKABLE void setDashboardModel(); 32 | Q_INVOKABLE void setTabModel(const QString &dashboardId); 33 | Q_INVOKABLE QList dashboards() const; 34 | Q_INVOKABLE void copyToClipboard(const QString &text) const; 35 | Q_INVOKABLE QString defaultDashboardName() const; 36 | Q_INVOKABLE QString getHumanFriendlyTimeString(int date) const; 37 | Q_INVOKABLE QString getHumanFriendlySizeString(int size) const; 38 | Q_INVOKABLE int countUnread() const; 39 | Q_INVOKABLE void resetWebView() const; 40 | Q_INVOKABLE void resetFetcher(int type) const; 41 | Q_INVOKABLE QString formatHtml(QString data, bool offline, 42 | const QString &style = {}) const; 43 | Q_INVOKABLE QString readAsset(const QString &path) const; 44 | static QString hash(const QString &url); 45 | static int monthsTo(const QDate &from, const QDate &to); 46 | static int yearsTo(const QDate &from, const QDate &to); 47 | static bool isSameWeek(const QDate &date1, const QDate &date2); 48 | static void addExtension(const QString &contentType, QString *path); 49 | static void log(const QString &data); 50 | static void resetWebViewStatic(); 51 | 52 | public slots: 53 | void updateModels(); 54 | 55 | private: 56 | std::unique_ptr entryModel; 57 | std::unique_ptr feedModel; 58 | std::unique_ptr tabModel; 59 | std::unique_ptr dashboardModel; 60 | }; 61 | 62 | #endif // UTILS_H 63 | --------------------------------------------------------------------------------