sailfish, getting somewhere

This commit is contained in:
Hauke Schade 2014-03-14 16:17:51 +01:00
parent 1cfee7081c
commit d48178899c
25 changed files with 1463 additions and 33 deletions

7
harbour-ttrss.desktop Normal file
View file

@ -0,0 +1,7 @@
[Desktop Entry]
Type=Application
X-Nemo-Application-Type=silica-qt5
Name=ttrss
Icon=harbour-ttrss
Exec=harbour-ttrss

60
harbour-ttrss.pro Normal file
View file

@ -0,0 +1,60 @@
# The name of your app.
# NOTICE: name defined in TARGET has a corresponding QML filename.
# If name defined in TARGET is changed, following needs to be
# done to match new name:
# - corresponding QML filename must be changed
# - desktop icon filename must be changed
# - desktop filename must be changed
# - icon definition filename in desktop file must be changed
VERSION = 0.3.4
DEFINES += APP_VERSION=\\\"$$VERSION\\\"
DEFINES += Q_OS_SAILFISH
TARGET = harbour-ttrss
##CONFIG += sailfishapp
QT += quick qml
target.path = /usr/bin
INSTALLS += target
CONFIG += link_pkgconfig
PKGCONFIG += sailfishapp
INCLUDEPATH += /usr/include/sailfishapp
qml_1.files = qml/ttrss/sailfish
qml_1.path = $$INSTALL_ROOT/usr/share/$$TARGET/qml
qml_2.files = qml/ttrss/models
qml_2.path = $$INSTALL_ROOT/usr/share/$$TARGET/qml
qml_3.files = qml/ttrss/resources
qml_3.path = $$INSTALL_ROOT/usr/share/$$TARGET/qml
INSTALLS += qml_1 qml_2 qml_3
icon.files = images/$${TARGET}.png
icon.path = /usr/share/icons/hicolor/86x86/apps
INSTALLS += icon
desktop.files = harbour-ttrss.desktop
desktop.path = /usr/share/applications
INSTALLS += desktop
RESOURCES += \
harmattan.qrc
HEADERS += \
settings.hh \
# mynetworkmanager.hh \
qmlutils.hh
SOURCES += main.cpp \
settings.cpp \
# mynetworkmanager.cpp \
qmlutils.cpp
OTHER_FILES += rpm/harbour-ttrss.spec \
rpm/harbour-ttrss.yaml \
$$files(rpm/*)

BIN
images/harbour-ttrss.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8 KiB

BIN
images/sailfish.xcf Normal file

Binary file not shown.

View file

@ -1,16 +1,44 @@
//Copyright Hauke Schade, 2012-2013
//
//This file is part of TTRss.
//
//TTRss is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
//Free Software Foundation, either version 2 of the License, or (at your option) any later version.
//TTRss is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//You should have received a copy of the GNU General Public License along with TTRss (on a Maemo/Meego system there is a copy
//in /usr/share/common-licenses. If not, see http://www.gnu.org/licenses/.
#if defined(Q_OS_SAILFISH)
#include <QGuiApplication>
#include <sailfishapp.h>
#ifdef QT_QML_DEBUG
#include <QtQuick>
#endif
#else
#include <QtGui/QApplication>
#include <QtDeclarative/QDeclarativeContext>
#include "qmlapplicationviewer.h"
#endif
#include <QTranslator>
#include <QLocale>
#include <QtGui/QApplication>
#include <QtDeclarative/QDeclarativeContext>
#include "qmlapplicationviewer.h"
#include "settings.hh"
#include "mynetworkmanager.hh"
#include "qmlutils.hh"
#if defined(Q_OS_SAILFISH)
#else
#include "mynetworkmanager.hh"
#endif
Q_DECL_EXPORT int main(int argc, char *argv[])
{
#if defined(Q_OS_SAILFISH)
QGuiApplication *app = SailfishApp::application(argc, argv);
#else
QScopedPointer<QApplication> app(createApplication(argc, argv));
#endif
app->setApplicationVersion(APP_VERSION);
app->setApplicationName("ttrss");
@ -29,19 +57,33 @@ Q_DECL_EXPORT int main(int argc, char *argv[])
if (translator.load("qml-translation." + locale, ":/i18n"))
app->installTranslator(&translator);
QmlApplicationViewer viewer;
#if defined(Q_OS_SAILFISH)
QQuickView* viewer = SailfishApp::createView();
#else
QmlApplicationViewer *viewer = new QmlApplicationViewer();
viewer->setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
//QObject::connect(viewer.engine(), SIGNAL(quit()), viewer.data, SLOT(close()));
viewer.setNetworkAccessManagerFactory(MyNetworkManager::instance());
viewer.rootContext()->setContextProperty("network", MyNetworkManager::instance());
viewer->setNetworkAccessManagerFactory(MyNetworkManager::instance());
viewer->rootContext()->setContextProperty("network", MyNetworkManager::instance());
#endif
viewer.rootContext()->setContextProperty("APP_VERSION", APP_VERSION);
viewer->rootContext()->setContextProperty("APP_VERSION", APP_VERSION);
viewer.rootContext()->setContextProperty("QMLUtils", QMLUtils::instance());
viewer.rootContext()->setContextProperty("settings", Settings::instance());
viewer->rootContext()->setContextProperty("QMLUtils", QMLUtils::instance());
viewer->rootContext()->setContextProperty("settings", Settings::instance());
viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
#if defined(Q_OS_SAILFISH)
viewer->setSource(SailfishApp::pathTo("qml/sailfish/harbour-ttrss.qml"));
#else
viewer.setMainQmlFile(QLatin1String("qml/harmattan/main.qml"));
viewer.showExpanded();
#endif
#if defined(Q_OS_SAILFISH)
viewer->show();
#else
viewer->showExpanded();
#endif
return app->exec();
}

View file

@ -1,6 +1,16 @@
// import QtQuick 1.0 // to target S60 5th Edition or Maemo 5
import QtQuick 1.1
import com.nokia.meego 1.0
//Copyright Hauke Schade, 2012-2013
//
//This file is part of TTRss.
//
//TTRss is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
//Free Software Foundation, either version 2 of the License, or (at your option) any later version.
//TTRss is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//You should have received a copy of the GNU General Public License along with TTRss (on a Maemo/Meego system there is a copy
//in /usr/share/common-licenses. If not, see http://www.gnu.org/licenses/.
//import QtQuick 1.1 // harmattan
import QtQuick 2.0 // sailfish
ListModel {
id: root

View file

@ -9,7 +9,8 @@
//You should have received a copy of the GNU General Public License along with TTRss (on a Maemo/Meego system there is a copy
//in /usr/share/common-licenses. If not, see http://www.gnu.org/licenses/.
import QtQuick 1.1
//import QtQuick 1.1 // harmattan
import QtQuick 2.0 // sailfish
QtObject{
id: constant

View file

@ -1,6 +1,16 @@
// import QtQuick 1.0 // to target S60 5th Edition or Maemo 5
import QtQuick 1.1
import com.nokia.meego 1.0
//Copyright Hauke Schade, 2012-2013
//
//This file is part of TTRss.
//
//TTRss is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
//Free Software Foundation, either version 2 of the License, or (at your option) any later version.
//TTRss is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//You should have received a copy of the GNU General Public License along with TTRss (on a Maemo/Meego system there is a copy
//in /usr/share/common-licenses. If not, see http://www.gnu.org/licenses/.
//import QtQuick 1.1 // harmattan
import QtQuick 2.0 // sailfish
ListModel {
id: root

View file

@ -1,6 +1,16 @@
// import QtQuick 1.0 // to target S60 5th Edition or Maemo 5
import QtQuick 1.1
import com.nokia.meego 1.0
//Copyright Hauke Schade, 2012-2013
//
//This file is part of TTRss.
//
//TTRss is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
//Free Software Foundation, either version 2 of the License, or (at your option) any later version.
//TTRss is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//You should have received a copy of the GNU General Public License along with TTRss (on a Maemo/Meego system there is a copy
//in /usr/share/common-licenses. If not, see http://www.gnu.org/licenses/.
//import QtQuick 1.1 // harmattan
import QtQuick 2.0 // sailfish
ListModel {
id: root

View file

@ -0,0 +1,54 @@
/*
Copyright (C) 2013 Jolla Ltd.
Contact: Thomas Perl <thomas.perl@jollamobile.com>
All rights reserved.
You may use this file under the terms of BSD license as follows:
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Jolla Ltd nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import QtQuick 2.0
import Sailfish.Silica 1.0
CoverBackground {
Label {
id: label
anchors.centerIn: parent
text: "My Cover"
}
CoverActionList {
id: coverAction
CoverAction {
iconSource: "image://theme/icon-cover-next"
}
CoverAction {
iconSource: "image://theme/icon-cover-pause"
}
}
}

View file

@ -0,0 +1,139 @@
/*
Copyright (C) 2013 Jolla Ltd.
Contact: Thomas Perl <thomas.perl@jollamobile.com>
All rights reserved.
You may use this file under the terms of BSD license as follows:
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Jolla Ltd nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import QtQuick 2.0
import Sailfish.Silica 1.0
import "pages"
import "../models/tinytinyrss.js" as TTRss
import "../models" 1.0
ApplicationWindow
{
id: rootWindow
initialPage: Component { MainPage { } }
cover: Qt.resolvedUrl("cover/CoverPage.qml")
function getTTRSS() {
return TTRss;
}
property bool showAll: false
Constants{ id: constant }
CategoryModel {
id: categories
}
FeedModel {
id: feeds
onFeedUnreadChanged: {
var op = function(x) { return x - oldAmount + feed.unreadcount }
categories.updateUnreadCountForId(feed.categoryId, op)
// update the 'All Feeds' Category
categories.updateUnreadCountForId(TTRss.constants['categories']['ALL'], op)
// if there is an 'all feed items' update that aswell
if (feeds.count > 1) {
var m = feeds.get(0)
if (m.isCat) // just check to be sure
feeds.setProperty(0, "unreadcount", op(m.unreadcount))
}
}
}
FeedItemModel {
id: feedItems
onItemUnreadChanged: {
var op = item.unread ?
function(x) { return x + 1 } :
function(x) { return x - 1 }
// update the feed's category
feeds.updateUnreadCountForId(item.feedId, op)
// update special for all feeditems category
categories.updateUnreadCountForId(
TTRss.constants['categories']['SPECIAL'],
op)
// if the item is new, update 'special feeds' for 'fresh articles'
// TODO
if (item.unread && false)
categories.updateUnreadCountForId(
TTRss.constants['categories']['SPECIAL'],
op)
// if item was is starred/published, update special feeds aswell
if (item.rss)
categories.updateUnreadCountForId(
TTRss.constants['categories']['SPECIAL'],
op)
if (item.marked)
categories.updateUnreadCountForId(
TTRss.constants['categories']['SPECIAL'],
op)
// maybe check if currently viewing special feeds and update published
// not nesseccary because this is updated by mark unread
}
onItemPublishedChanged: {
var op = item.rss ?
function(x) { return x + 1 } :
function(x) { return x - 1 }
// if the item is unread, update 'special feeds'
if (item.unread)
categories.updateUnreadCountForId(
TTRss.constants['categories']['SPECIAL'],
op)
// maybe check if currently viewing special feeds and update published
// not nesseccary because this is updated by mark unread
}
onItemStarChanged: {
var op = item.marked ?
function(x) { return x + 1 } :
function(x) { return x - 1 }
// if the item is unread, update 'special feeds'
if (item.unread)
categories.updateUnreadCountForId(
TTRss.constants['categories']['SPECIAL'],
op)
// maybe check if currently viewing special feeds and update starred
// not nesseccary because this is updated by mark unread
}
}
}

View file

@ -0,0 +1,34 @@
//Copyright Hauke Schade, 2012-2013
//
//This file is part of TTRss.
//
//TTRss is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
//Free Software Foundation, either version 2 of the License, or (at your option) any later version.
//TTRss is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//You should have received a copy of the GNU General Public License along with TTRss (on a Maemo/Meego system there is a copy
//in /usr/share/common-licenses. If not, see http://www.gnu.org/licenses/.
import QtQuick 2.0
import Sailfish.Silica 1.0
MenuItem {
text: qsTr("About")
onClicked: {
var params = {
title : 'ttrss ' + APP_VERSION,
iconSource: Qt.resolvedUrl('/usr/share/icons/hicolor/86x86/apps/harbour-ttrss.png'),
// slogan : '',
donatebutton: qsTr("Buy me a beer"),
donateurl: constant.donateUrl,
text: qsTr("Author: %1").arg("Hauke Schade") + "<br/>"
+ qsTr("Thanks to:") + " "
+ "Francois Cattin, Jakub Kožíšek, Alberto Mardegan, gwmgdemj, equeim",
homepageurl: constant.sourceRepoSite,
issuetrackertext: qsTr("If you encounter bugs or have feature requests, please visit the Issue Tracker"),
issuetrackerurl: constant.issueTrackerUrl
}
pageStack.push(Qt.resolvedUrl("AboutPage.qml"), params);
}
}

View file

@ -0,0 +1,176 @@
//Copyright Hauke Schade, 2012-2013
//
//This file is part of TTRss.
//
//TTRss is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
//Free Software Foundation, either version 2 of the License, or (at your option) any later version.
//TTRss is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//You should have received a copy of the GNU General Public License along with TTRss (on a Maemo/Meego system there is a copy
//in /usr/share/common-licenses. If not, see http://www.gnu.org/licenses/.
import QtQuick 2.0
import Sailfish.Silica 1.0
Page {
id: aboutPage
property alias iconSource: icon.source
property alias title: title.title
property alias slogan: slogan.text
property alias donatetext: donatetext.text
property alias donatebutton: donatebutton.text
property string donateurl: donate.text
property alias homepagebutton: homepagebutton.text
property string homepageurl: ''
property alias text: content.text
property alias issuetrackerbutton: issuetrackerbutton.text
property alias issuetrackertext: issuetrackertext.text
property string issuetrackerurl: ''
SilicaFlickable {
anchors.fill: parent
contentHeight: aboutContainer.height + 10
contentWidth: parent.width
PullDownMenu {
MenuItem {
text: qsTr("License")
onClicked: {
var params = {
title: qsTr("License"),
iconSource: iconSource,
text: "This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.<br>
<br>
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.<br>
<br>
You should have received a copy of the GNU General Public License
along with this program. If not, see <a href=\"http://www.gnu.org/licenses/\">http://www.gnu.org/licenses/</a>."
}
pageStack.push("TextPage.qml", params)
}
}
MenuItem {
text: qsTr("Privacy Policy")
onClicked: {
var params = {
title: qsTr("Privacy Policy"),
iconSource: iconSource,
text: "ttrss will collect the login information you give at startup and nothing more.
Your login data is stored in a configuration file on your device and nowhere else.
ttrss will only use it to establish connections to the available services and/or servers.
The login data is not given to any third party and is not used for any other purpose than the functions of ttrss.
<br><br>
If you have any questions, concerns, or comments about our privacy policy you may contact us via:<br>
<a href='mailto:cnlpete@cnlpete.de'>cnlpete@cnlpete.de</a>"
}
pageStack.push("TextPage.qml", params)
}
}
}
Item {
id: aboutContainer
width: parent.width
height: aboutColumn.height
Column {
id: aboutColumn
anchors {
left: parent.left
top: parent.top
right: parent.right
margins: 10
}
spacing: 10
PageHeader {
id: title
}
Image {
id: icon
source: ''
anchors.horizontalCenter: parent.horizontalCenter
}
Label {
id: slogan
text: ''
visible: text !== ''
anchors.horizontalCenter: parent.horizontalCenter
}
Label {
id: donatetext
text: ''
visible: text !== ''
anchors.horizontalCenter: parent.horizontalCenter
}
Button {
id: donatebutton
width: parent.width
text: qsTr("Donate")
visible: donateurl !== ''
onClicked: {
Qt.openUrlExternally(donateurl)
}
}
Button {
id: homepagebutton
width: parent.width
text: qsTr("Homepage")
visible: homepageurl !== ''
onClicked: {
Qt.openUrlExternally(homepageurl)
}
}
Item {
width: 1
height: 50
}
Label {
id: content
text: ''
width: aboutPage.width
wrapMode: Text.WordWrap
}
Item {
width: 1
height: 50
}
Label {
id: issuetrackertext
text: ''
visible: text !== ''
width: aboutPage.width
wrapMode: Text.WordWrap
}
Button {
id: issuetrackerbutton
width: parent.width
text: qsTr("Issuetracker")
visible: issuetrackerurl !== ''
onClicked: {
Qt.openUrlExternally(issuetrackerurl)
}
}
}
}
}
}

View file

@ -0,0 +1,62 @@
//Copyright Hauke Schade, 2012-2013
//
//This file is part of TTRss.
//
//TTRss is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
//Free Software Foundation, either version 2 of the License, or (at your option) any later version.
//TTRss is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//You should have received a copy of the GNU General Public License along with TTRss (on a Maemo/Meego system there is a copy
//in /usr/share/common-licenses. If not, see http://www.gnu.org/licenses/.
import QtQuick 2.0
import Sailfish.Silica 1.0
Page {
id: categoriesPage
SilicaListView {
id: listView
anchors.fill: parent
model: categories
PullDownMenu {
AboutItem {}
SettingsItem {}
ToggleShowAllItem {
onUpdateView: {
categories.update()
}
}
}
delegate: CategoryDelegate {
onClicked: {
categories.selectedIndex = index
showCategory(model)
}
}
header: PageHeader {
title: qsTr("Tiny Tiny RSS Reader")
}
ViewPlaceholder {
enabled: listView.count == 0
text: network.loading ?
qsTr("Loading") :
rootWindow.showAll ? qsTr("No categories to display") : qsTr("No categories have unread items")
}
ScrollDecorator {
flickable: listView
}
}
function showCategory(categoryModel) {
if(categoryModel != null) {
pageStack.push("Feeds.qml", {
category: categoryModel
})
}
}
}

View file

@ -0,0 +1,50 @@
//Copyright Hauke Schade, 2012-2013
//
//This file is part of TTRss.
//
//TTRss is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
//Free Software Foundation, either version 2 of the License, or (at your option) any later version.
//TTRss is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//You should have received a copy of the GNU General Public License along with TTRss (on a Maemo/Meego system there is a copy
//in /usr/share/common-licenses. If not, see http://www.gnu.org/licenses/.
import QtQuick 2.0
import Sailfish.Silica 1.0
ListItem {
id: listItem
signal clicked
property alias pressed: mouseArea.pressed
contentHeight: Theme.itemSizeMedium
width: parent.width
Label {
text: model.title
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.margins: Theme.paddingMedium
anchors.right: bubble.left
truncationMode: TruncationMode.Elide
font.weight: Font.Bold
font.pixelSize: Theme.fontSizeLarge
color: listItem.highlighted ? Theme.highlightColor : ((model.unreadcount > 0) ? Theme.primaryColor : Theme.secondaryColor)
}
Label {
id: bubble
text: model.unreadcount
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.margins: Theme.paddingMedium
font.pixelSize: Theme.fontSizeMedium
color: listItem.highlighted ? Theme.highlightColor : ((model.unreadcount > 0) ? Theme.primaryColor : Theme.secondaryColor)
}
MouseArea {
id: mouseArea
anchors.fill: parent
onClicked: listItem.clicked()
}
}

View file

@ -0,0 +1,89 @@
//Copyright Hauke Schade, 2012-2013
//
//This file is part of TTRss.
//
//TTRss is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
//Free Software Foundation, either version 2 of the License, or (at your option) any later version.
//TTRss is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//You should have received a copy of the GNU General Public License along with TTRss (on a Maemo/Meego system there is a copy
//in /usr/share/common-licenses. If not, see http://www.gnu.org/licenses/.
import QtQuick 2.0
import Sailfish.Silica 1.0
ListItem {
id: listItem
signal clicked
property alias pressed: mouseArea.pressed
contentHeight: Theme.itemSizeSmall
width: parent.width
menu: contextMenu
Image {
id: icon
sourceSize.height: 80
sourceSize.width: 80
asynchronous: true
width: 60
height:60
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
anchors.margins: Theme.paddingMedium
source: model.icon
onStatusChanged: {
if (status === Image.Error)
feeds.unsetIcon(index)
}
visible: settings.displayIcons && model.icon != ''
}
Label {
text: model.title
anchors.verticalCenter: parent.verticalCenter
anchors.left: icon.visible ? icon.right : parent.left
anchors.margins: Theme.paddingMedium
anchors.right: bubble.left
truncationMode: TruncationMode.Elide
font.weight: Font.Bold
font.pixelSize: Theme.fontSizeMedium
color: listItem.highlighted ? Theme.highlightColor : ((model.unreadcount > 0) ? Theme.primaryColor : Theme.secondaryColor)
}
Label {
id: bubble
text: model.unreadcount
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.margins: Theme.paddingMedium
font.pixelSize: Theme.fontSizeMedium
color: listItem.highlighted ? Theme.highlightColor : ((model.unreadcount > 0) ? Theme.primaryColor : Theme.secondaryColor)
}
MouseArea {
id: mouseArea
anchors.fill: parent
onClicked: listItem.clicked()
}
Component {
id: contextMenu
ContextMenu {
MenuItem {
text: qsTr("Mark all read")
onClicked: {
feeds.catchUp()
} }
// MenuItem {
// text: qsTr("Unsubscribe")
// enabled: feedMenu.feedId >= 0
// onClicked: {
// var ttrss = rootWindow.getTTRSS()
// ttrss.unsubscribe(feedMenu.feedId, function() { feeds.update() })
// } }
}
}
}

View file

@ -0,0 +1,109 @@
//Copyright Hauke Schade, 2012-2013
//
//This file is part of TTRss.
//
//TTRss is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
//Free Software Foundation, either version 2 of the License, or (at your option) any later version.
//TTRss is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//You should have received a copy of the GNU General Public License along with TTRss (on a Maemo/Meego system there is a copy
//in /usr/share/common-licenses. If not, see http://www.gnu.org/licenses/.
import QtQuick 2.0
import Sailfish.Silica 1.0
ListItem {
id: listItem
signal clicked
property alias pressed: mouseArea.pressed
contentHeight: Theme.itemSizeMedium
width: parent.width
Row {
spacing: Theme.paddingMedium
anchors.fill: parent
anchors.leftMargin: icon.visible ? icon.width + Theme.paddingMedium : 0
Image {
source: "../../resources/ic_star_enabled.png"
visible: model.marked
anchors.verticalCenter: parent.verticalCenter
opacity: 0.5
}
Image {
source: "../../resources/ic_rss_enabled.png"
visible: model.rss
anchors.verticalCenter: parent.verticalCenter
opacity: 0.5
}
}
Row {
anchors.fill: parent
anchors.margins: Theme.paddingMedium
spacing: Theme.paddingMedium
clip: true
Image {
id: icon
sourceSize.height: 80
sourceSize.width: 80
asynchronous: true
width: 60
height: 60
anchors.verticalCenter: parent.verticalCenter
source: feed.isCat ? model.icon : ''
visible: settings.displayIcons && model.icon != '' && feed.isCat && status == Image.Ready
}
Column {
width: parent.width
Label {
id: mainText
width: parent.width
text: model.title
font.weight: Font.Bold
font.pixelSize: Theme.fontSizeMedium
color: listItem.highlighted ? Theme.highlightColor : ((model.unreadcount > 0) ? Theme.primaryColor : Theme.secondaryColor)
elide: Text.ElideRight
truncationMode: TruncationMode.Elide
}
Label {
id: subText
width: parent.width
text: model.subtitle
font.weight: Font.Light
font.pixelSize: Theme.fontSizeSmall
color: listItem.highlighted ? Theme.highlightColor : ((model.unreadcount > 0) ? Theme.primaryColor : Theme.secondaryColor)
maximumLineCount: 4
elide: Text.ElideRight
truncationMode: TruncationMode.Elide
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
visible: text != ""
}
// Row {
// id: myrow
// property variant mymod: model
// spacing: constant.paddingMedium
// Repeater {
// model: myrow.mymod.labels
// LabelLabel {
// label: myrow.mymod.labels.get(index)
// }
// }
// }
}
}
MouseArea {
id: mouseArea
anchors.fill: parent
onClicked: listItem.clicked();
onPressAndHold: listItem.pressAndHold();
}
}

View file

@ -0,0 +1,91 @@
//Copyright Hauke Schade, 2012-2013
//
//This file is part of TTRss.
//
//TTRss is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
//Free Software Foundation, either version 2 of the License, or (at your option) any later version.
//TTRss is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//You should have received a copy of the GNU General Public License along with TTRss (on a Maemo/Meego system there is a copy
//in /usr/share/common-licenses. If not, see http://www.gnu.org/licenses/.
import QtQuick 2.0
import Sailfish.Silica 1.0
Page {
id: feeditemsPage
property variant feed
Component.onCompleted: {
feedItems.feed = feeditemsPage.feed
feedItems.hasMoreItems = false
feedItems.continuation = 0
feedItems.clear()
feedItems.update()
}
SilicaListView {
id: listView
anchors.fill: parent
model: feedItems
PullDownMenu {
AboutItem {}
SettingsItem {}
ToggleShowAllItem {
onUpdateView: {
feedItems.continuation = 0
feedItems.hasMoreItems = false
feedItems.clear()
feedItems.update()
}
}
MenuItem {
text: qsTr('Mark all read')
onClicked: {
feedItems.catchUp()
}
}
}
section.delegate: SectionHeader {}
section.property: "date"
delegate: FeedItemDelegate {
onClicked: {
feedItems.selectedIndex = index
pageStack.push("FeedItem.qml", { isCat: feed.isCat })
}
}
footer: Button {
id: foot
text: qsTr("Load more")
visible: settings.feeditemsOrder === 0 && feedItems.hasMoreItems
height: settings.feeditemsOrder === 0 && feedItems.hasMoreItems ? 51 : 0
width: parent.width
onClicked: feedItems.update()
}
header: PageHeader {
title: feed.title
}
ViewPlaceholder {
enabled: listView.count == 0
text: network.loading ?
qsTr("Loading") :
rootWindow.showAll ? qsTr("No items in feed") : qsTr("No unread items in feed")
}
ScrollDecorator {
flickable: listView
}
}
function showFeed(feedModel) {
if(feedModel != null) {
pageStack.push("FeedItems.qml", {
feed: feedModel
})
}
}
}

View file

@ -0,0 +1,68 @@
//Copyright Hauke Schade, 2012-2013
//
//This file is part of TTRss.
//
//TTRss is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
//Free Software Foundation, either version 2 of the License, or (at your option) any later version.
//TTRss is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//You should have received a copy of the GNU General Public License along with TTRss (on a Maemo/Meego system there is a copy
//in /usr/share/common-licenses. If not, see http://www.gnu.org/licenses/.
import QtQuick 2.0
import Sailfish.Silica 1.0
Page {
id: feedsPage
property variant category
Component.onCompleted: {
feeds.category = feedsPage.category
feeds.clear()
feeds.update()
}
SilicaListView {
id: listView
anchors.fill: parent
model: feeds
PullDownMenu {
AboutItem {}
SettingsItem {}
ToggleShowAllItem {
onUpdateView: {
feeds.update()
}
}
}
delegate: FeedDelegate {
onClicked: {
feeds.selectedIndex = index
showFeed(model)
}
}
header: PageHeader {
title: category.title
}
ViewPlaceholder {
enabled: listView.count == 0
text: network.loading ?
qsTr("Loading") :
rootWindow.showAll ? qsTr("No feeds in category") : qsTr("Category has no unread items")
}
ScrollDecorator {
flickable: listView
}
}
function showFeed(feedModel) {
if(feedModel != null) {
pageStack.push("FeedItems.qml", {
feed: feedModel
})
}
}
}

View file

@ -0,0 +1,204 @@
//Copyright Hauke Schade, 2012-2013
//
//This file is part of TTRss.
//
//TTRss is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
//Free Software Foundation, either version 2 of the License, or (at your option) any later version.
//TTRss is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//You should have received a copy of the GNU General Public License along with TTRss (on a Maemo/Meego system there is a copy
//in /usr/share/common-licenses. If not, see http://www.gnu.org/licenses/.
import QtQuick 2.0
import Sailfish.Silica 1.0
Page {
SilicaFlickable {
contentHeight: contentcontainer.height
contentWidth: parent.width
anchors.fill: parent
PullDownMenu {
AboutItem {}
SettingsItem {}
MenuItem {
text: qsTr("No Account Yet?")
onClicked: {
rootWindow.openFile(Qt.openUrlExternally("http://tt-rss.org/redmine/projects/tt-rss/wiki"));
}
}
}
Rectangle {
width: parent.width
anchors.margins: Theme.paddingLarge
Column {
id: contentcontainer
width: 350
anchors.horizontalCenter: parent.horizontalCenter
Image {
width: 256
height: 256
anchors.horizontalCenter: parent.horizontalCenter
source: "../../resources/ttrss256.png"
anchors.bottomMargin: Theme.paddingLarge
}
Label {
id: serverLabel
text: qsTr("Server:")
width: parent.width
font.pixelSize: Theme.fontSizeMedium
}
TextField {
id: server
text: ""
width: parent.width
// enabled: !network.loading
}
Label {
id: usernameLabel
text: qsTr("Username:")
width: parent.width
font.pixelSize: Theme.fontSizeMedium
}
TextField {
id: username
text: ""
width: parent.width
// enabled: !network.loading
}
Label {
id: passwordLabel
text: qsTr("Password:")
width: parent.width
font.pixelSize: Theme.fontSizeMedium
}
TextField {
id: password
echoMode: TextInput.Password
width: parent.width
// enabled: !network.loading
}
Button {
id: loginButton
text: qsTr("Login")
width: parent.width
onClicked: {
// check the servername for httpauth data and set/extract those
var httpauthregex = /(https?:\/\/)?(\w+):(\w+)@(\w.+)/
var servername = server.text
var regexres = servername.match(httpauthregex)
if (regexres !== null) {
server.text = (regexres[1]?regexres[1]:'') + regexres[4]
settings.httpauthusername = regexres[2]
settings.httpauthpassword = regexres[3]
}
settings.servername = server.text
settings.username = username.text
settings.password = password.text
startLogin();
}
// enabled: !network.loading
}
Button {
id: clearButton
text: qsTr("Clear")
width: parent.width
onClicked: {
server.text = ''
username.text = ''
password.text = ''
settings.httpauthusername = ''
settings.httpauthpassword = ''
settings.servername = server.text
settings.username = username.text
settings.password = password.text
}
// enabled: !network.loading
}
}
}
}
BusyIndicator {
id: busyindicator1
visible: false //network.loading
running: visible
anchors {
horizontalCenter: parent.horizontalCenter
verticalCenter: parent.verticalCenter
}
size: BusyIndicatorSize.Large
}
function enableLoginBox(focus) {
if(focus) {
password.forceActiveFocus();
}
}
function startLogin() {
var ttrss = rootWindow.getTTRSS();
ttrss.clearState();
ttrss.setLoginDetails(username.text, password.text, server.text);
if (settings.httpauthusername != '' && settings.httpauthpassword != '') {
ttrss.setHttpAuthInfo(settings.httpauthusername, settings.httpauthpassword);
console.log('doing http basic auth with username ' + settings.httpauthusername)
}
ttrss.login(loginSuccessfull);
}
function loginSuccessfull(retcode, text) {
if(retcode) {
//login failed....don't autlogin
settings.autologin = false
//Let the user know
// loginErrorDialog.text = text;
// loginErrorDialog.open();
}
else {
//Login succeeded, auto login next Time
settings.autologin = true
rootWindow.getTTRSS().updateConfig(configSuccessfull);
}
}
function configSuccessfull(retcode, text) {
if(retcode) {
//Let the user know
// loginErrorDialog.text = text;
// loginErrorDialog.open();
}
else {
categories.update()
//Now show the categories View
if (settings.useAllFeedsOnStartup) {
var ttrss = rootWindow.getTTRSS()
pageStack.replace("Feeds.qml", {
category: {
categoryId: ttrss.constants['categories']['ALL'],
title: constant.allFeeds,
unreadcount: 0
}
})
}
else
pageStack.replace(Qt.resolvedUrl('Categories.qml'))
}
}
Component.onCompleted: {
server.text = settings.servername
username.text = settings.username
password.text = settings.password
if(settings.autologin && settings.useAutologin)
startLogin();
}
}

View file

@ -0,0 +1,20 @@
//Copyright Hauke Schade, 2012-2013
//
//This file is part of TTRss.
//
//TTRss is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
//Free Software Foundation, either version 2 of the License, or (at your option) any later version.
//TTRss is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//You should have received a copy of the GNU General Public License along with TTRss (on a Maemo/Meego system there is a copy
//in /usr/share/common-licenses. If not, see http://www.gnu.org/licenses/.
import QtQuick 2.0
import Sailfish.Silica 1.0
MenuItem {
text: qsTr("Settings")
onClicked: {
pageStack.push(Qt.resolvedUrl("Settings.qml"));
}
}

View file

@ -0,0 +1,45 @@
//Copyright Hauke Schade, 2012-2013
//
//This file is part of TTRss.
//
//TTRss is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
//Free Software Foundation, either version 2 of the License, or (at your option) any later version.
//TTRss is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//You should have received a copy of the GNU General Public License along with TTRss (on a Maemo/Meego system there is a copy
//in /usr/share/common-licenses. If not, see http://www.gnu.org/licenses/.
import QtQuick 2.0
import Sailfish.Silica 1.0
MenuItem {
property bool showAll
property bool notInitialAssignment: false
signal updateView(bool showAll)
text: showAll ? qsTr("Show Unread Only") : qsTr("Show All")
onClicked: {
var ttrss = rootWindow.getTTRSS()
ttrss.setShowAll(!showAll)
showAll = !showAll
}
onShowAllChanged: {
// send the signal only if this is not the initial assignment
if (notInitialAssignment)
updateView(showAll)
}
Component.onCompleted: {
var ttrss = rootWindow.getTTRSS()
showAll = ttrss.getShowAll()
notInitialAssignment = true
}
onVisibleChanged: {
if (visible && notInitialAssignment) {
var ttrss = rootWindow.getTTRSS()
showAll = ttrss.getShowAll()
}
}
}

View file

@ -1,4 +1,4 @@
# checksum 0x5b42 version 0x70013
# checksum 0xf003 version 0x90018
# This file was generated by the Qt Quick Application wizard of Qt Creator.
# The code below adds the QmlApplicationViewer to the project and handles the
# activation of QML debugging.
@ -22,7 +22,7 @@ contains(CONFIG,qdeclarative-boostable):contains(MEEGO_EDITION,harmattan) {
DEFINES += HARMATTAN_BOOSTER
}
# This file was generated by an application wizard of Qt Creator.
# The code below handles deployment to Symbian and Maemo, aswell as copying
# The code below handles deployment to Android and Maemo, aswell as copying
# of the application data to shadow build directories on desktop.
# It is recommended not to modify this file, since newer versions of Qt Creator
# may offer an updated version of it.
@ -30,7 +30,11 @@ contains(CONFIG,qdeclarative-boostable):contains(MEEGO_EDITION,harmattan) {
defineTest(qtcAddDeployment) {
for(deploymentfolder, DEPLOYMENTFOLDERS) {
item = item$${deploymentfolder}
itemsources = $${item}.sources
greaterThan(QT_MAJOR_VERSION, 4) {
itemsources = $${item}.files
} else {
itemsources = $${item}.sources
}
$$itemsources = $$eval($${deploymentfolder}.source)
itempath = $${item}.path
$$itempath= $$eval($${deploymentfolder}.target)
@ -41,9 +45,44 @@ for(deploymentfolder, DEPLOYMENTFOLDERS) {
MAINPROFILEPWD = $$PWD
symbian {
isEmpty(ICON):exists($${TARGET}.svg):ICON = $${TARGET}.svg
isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x20000 0x2000000
android-no-sdk {
for(deploymentfolder, DEPLOYMENTFOLDERS) {
item = item$${deploymentfolder}
itemfiles = $${item}.files
$$itemfiles = $$eval($${deploymentfolder}.source)
itempath = $${item}.path
$$itempath = /data/user/qt/$$eval($${deploymentfolder}.target)
export($$itemfiles)
export($$itempath)
INSTALLS += $$item
}
target.path = /data/user/qt
export(target.path)
INSTALLS += target
} else:android {
for(deploymentfolder, DEPLOYMENTFOLDERS) {
item = item$${deploymentfolder}
itemfiles = $${item}.files
$$itemfiles = $$eval($${deploymentfolder}.source)
itempath = $${item}.path
$$itempath = /assets/$$eval($${deploymentfolder}.target)
export($$itemfiles)
export($$itempath)
INSTALLS += $$item
}
x86 {
target.path = /libs/x86
} else: armeabi-v7a {
target.path = /libs/armeabi-v7a
} else {
target.path = /libs/armeabi
}
export(target.path)
INSTALLS += target
} else:win32 {
copyCommand =
for(deploymentfolder, DEPLOYMENTFOLDERS) {
@ -113,7 +152,11 @@ symbian {
QMAKE_EXTRA_TARGETS += first copydeploymentfolders
}
}
installPrefix = /opt/$${TARGET}
!isEmpty(target.path) {
installPrefix = $${target.path}
} else {
installPrefix = /opt/$${TARGET}
}
for(deploymentfolder, DEPLOYMENTFOLDERS) {
item = item$${deploymentfolder}
itemfiles = $${item}.files
@ -133,16 +176,16 @@ symbian {
INSTALLS += icon desktopfile
}
target.path = $${installPrefix}/bin
export(target.path)
isEmpty(target.path) {
target.path = $${installPrefix}/bin
export(target.path)
}
INSTALLS += target
}
export (ICON)
export (INSTALLS)
export (DEPLOYMENT)
export (TARGET.EPOCHEAPSIZE)
export (TARGET.CAPABILITY)
export (LIBS)
export (QMAKE_EXTRA_TARGETS)
}

75
rpm/harbour-ttrss.spec Normal file
View file

@ -0,0 +1,75 @@
#
# Do NOT Edit the Auto-generated Part!
# Generated by: spectacle version 0.27
#
Name: harbour-ttrss
# >> macros
# << macros
%{!?qtc_qmake:%define qtc_qmake %qmake}
%{!?qtc_qmake5:%define qtc_qmake5 %qmake5}
%{!?qtc_make:%define qtc_make make}
%{?qtc_builddir:%define _builddir %qtc_builddir}
Summary: The Tiny Tiny RSS Reader for Sailfish
Version: 0.3.4
Release: 1
Group: Qt/Qt
License: LICENSE
URL: http://example.org/
Source0: %{name}-%{version}.tar.bz2
Source100: harbour-ttrss.yaml
Requires: sailfishsilica-qt5 >= 0.10.9
BuildRequires: pkgconfig(Qt5Quick)
BuildRequires: pkgconfig(Qt5Qml)
BuildRequires: pkgconfig(Qt5Core)
BuildRequires: pkgconfig(sailfishapp) >= 0.0.10
BuildRequires: desktop-file-utils
%description
ttrss is a Tiny Tiny RSS Reader App for the Nokia N9 smart phone, written using Qt/QML. It uses the Tiny Tiny RSS JSON API.
%prep
%setup -q -n %{name}-%{version}
# >> setup
# << setup
%build
# >> build pre
# << build pre
%qtc_qmake5
%qtc_make %{?_smp_mflags}
# >> build post
# << build post
%install
rm -rf %{buildroot}
# >> install pre
# << install pre
%qmake5_install
# >> install post
# << install post
desktop-file-install --delete-original \
--dir %{buildroot}%{_datadir}/applications \
%{buildroot}%{_datadir}/applications/*.desktop
%files
%defattr(-,root,root,-)
/usr/share/harbour-ttrss/qml
%{_bindir}
%{_datadir}/%{name}/qml
%{_datadir}/applications/%{name}.desktop
%{_datadir}/icons/hicolor/86x86/apps/%{name}.png
/usr/bin
/usr/share/harbour-ttrss
/usr/share/applications
/usr/share/icons/hicolor/86x86/apps
# >> files
# << files

31
rpm/harbour-ttrss.yaml Normal file
View file

@ -0,0 +1,31 @@
Name: harbour-ttrss
Summary: The Tiny Tiny RSS Reader for Sailfish
Version: 0.3.4
Release: 1
Group: Qt/Qt
URL: http://example.org/
License: LICENSE
Sources:
- '%{name}-%{version}.tar.bz2'
Description: |-
ttrss is a Tiny Tiny RSS Reader App for the Nokia N9 smart phone, written using Qt/QML. It uses the Tiny Tiny RSS JSON API.
Configure: none
Builder: qtc5
PkgConfigBR:
- Qt5Quick
- Qt5Qml
- Qt5Core
- sailfishapp >= 0.0.10
Requires:
- sailfishsilica-qt5 >= 0.10.9
Files:
- /usr/share/harbour-ttrss/qml
- '%{_bindir}'
- '%{_datadir}/%{name}/qml'
- '%{_datadir}/applications/%{name}.desktop'
- '%{_datadir}/icons/hicolor/86x86/apps/%{name}.png'
- /usr/bin
- /usr/share/harbour-ttrss
- /usr/share/applications
- /usr/share/icons/hicolor/86x86/apps
PkgBR: []