Compare commits

...
Sign in to create a new pull request.

28 commits

Author SHA1 Message Date
3f492b6160 Fix problem with HDPI screens
On high dpi screens the thml was shown way too small, this let's it
scale properly.
2021-05-24 22:10:23 +02:00
4b804873a6 Fix open in browser on enter
This patch fixes the opening of the current item in a browser which
was broken for a long time.
2020-06-13 00:20:46 +02:00
0bb19eae06 Remove duplicate import 2020-06-13 00:08:20 +02:00
f65d9b6231 Make Ctrl+W close the application
Many other applications have a Ctrl+W to close a window, adding this
as a second option to close the application because it only has one
window.
2020-06-12 23:51:38 +02:00
3e0b62b109 Remove opening in speaker: URL scheme
Back in the day on OSX this has been used to pass the current item
to a application called Speaker which would read the content. That
application is not available anymore so we can remove the
functionality from FeedTheMonkey.
2020-06-12 23:42:42 +02:00
ea85197874 Tweak dark mode and font size to appear closer to Adwaita-dark in GNOME
The colors are now closer to the Adwaita-dark mode which I'm using as
my primary theme. The header has been redesigned slightly to appear
more consistent with other default apps too.
2020-06-12 23:37:00 +02:00
cb649951ae Make sidebar dissapear if thiner than 200px
Often I wanted to make the sidebar dissapear because I don't need it.
This patch let's you make it dissapear when it's thinner than 200px
and reappear if it's wider.
2020-06-12 23:34:58 +02:00
3a0b18e51e Replace image URLs
My old jabs.nu domain doesn't exist anymore, I moved the screenshot
and the logo file included in the readme to a different server.

The screenshot has been renewt to the dark mode one.
2020-06-12 23:22:00 +02:00
ab1306a7b8 Update QtWebEngine te 1.8
When running with AppImage and on Ubuntu I'm getting the error that
QtWebEngine 1.7 is not installed, it seems that per default 1.8 is
installed nowadays.
2019-04-27 23:01:07 +02:00
0c5825afb8 Add deploy step
This step deploys the AppImage to GitHub so that I can create
a release which contains the AppImage within it.
2019-03-31 10:25:10 +02:00
11524e9f14 Fix problem with arrow navigation
For some reason the arrow navigation stopped working, this adds
some workarounds to make it workable again.
2018-09-11 23:04:56 +02:00
0a195f8a8f Move JS into HTML and add NOT_LOGGED_IN handling
For some reason the JS never got loaded when it was in it's own
file, therefor I moved it into the HTML where it gets called.

Also when a session id on the server was expired or something, you
weren't able to log out, there is now code which fixes that.
2018-09-11 01:05:23 +02:00
2c263f77db Fix version in desktop file
We had a wrong version in the desktop file.
2018-02-05 22:45:17 +01:00
13c241f3b9 Fix not responding next/previous when focus in webview
For some reason in the latest Qt versions the webview took over the
focus from the keyboard, once clicked on the webview the arrow
keys wouldn't register up and thus you couldn't navigate with them
anymore.

This patch fixes this problem by using window.location.href and
checkinf for those special urls. This is way easier to use than
WebChannels.
2018-01-30 22:55:16 +01:00
f025ad4d2a Add feedback on login errors
There was no feedback on any login errors when a user provided a
wrong url, username, password or a disabled API. This commit
adds feedback to the user in this cases.

Fixes #15
2017-06-08 18:31:02 +02:00
4bb5610f7f Add info about AppImage 2017-03-21 22:13:11 +01:00
a48212cac7 Merge pull request #16 from probonopd/test
Update .travis.yml
2017-03-18 05:31:29 +01:00
probonopd
dd958bbaa5 Update .travis.yml 2017-03-17 20:43:59 +01:00
0dc523fe42 Merge pull request #14 from probonopd/patch-1
Continuous builds on Travis CI
2017-03-13 18:10:37 +01:00
probonopd
a920123a52 Update .travis.yml 2017-03-12 17:40:37 +01:00
probonopd
78a85f8e3f -qmldir=./qml/ 2017-03-12 17:33:42 +01:00
probonopd
fcfcda84ae Update .travis.yml 2017-03-12 17:25:47 +01:00
probonopd
4f3a1a8261 -qmldir=/opt/qt58/qml/ 2017-03-12 17:13:37 +01:00
probonopd
75f94b46e7 Update .travis.yml 2017-03-12 17:00:14 +01:00
probonopd
3bc56e2e8f Update .travis.yml 2017-03-12 16:53:20 +01:00
probonopd
cc5398907f Create .travis.yml 2017-03-12 16:46:51 +01:00
cfec5fd9ed Break too long words to prevent horizontal scrolling 2016-10-29 10:51:14 +02:00
c7153e070e Make the MenuBar show- and hidebar
Untill now the MenuBar was not visible untill you pressed the
alt-key, which made it visible. Sadly after that it was not
possible to hide it again. This patch fixes that.
2016-10-29 08:09:20 +02:00
15 changed files with 256 additions and 137 deletions

33
.travis.yml Normal file
View file

@ -0,0 +1,33 @@
language: cpp
compiler: gcc
sudo: require
dist: trusty
before_install:
- sudo add-apt-repository ppa:beineri/opt-qt58-trusty -y
- sudo apt-get update -qq
install:
- sudo apt-get -y install qt58base qt58webengine qt58quickcontrols
- source /opt/qt58/bin/qt58-env.sh
script:
- qmake PREFIX=/usr
- make -j4
- sudo make INSTALL_ROOT=appdir install ; sudo chown -R $USER appdir ; find appdir/
- wget -c "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage"
- chmod a+x linuxdeployqt*.AppImage
- unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH
- "./linuxdeployqt*.AppImage ./appdir/usr/share/applications/*.desktop -qmldir=./qml/
-bundle-non-qt-libs"
- "./linuxdeployqt*.AppImage ./appdir/usr/share/applications/*.desktop -qmldir=./qml/
-appimage"
- find ./appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " "
-f 2-3 | sort | uniq
- mv FeedTheMonkey*.AppImage FeedTheMonkey.AppImage
deploy:
provider: releases
api_key:
secure: d+hHwOnmeLPVvuue6VDCs2LwLS+BFzJF/BB5iObtkCYBwQ8ybnVzUcgnjJKOt37SHI0T9kLegI+Lq/843ECYiGiDjQg4PvCF69V8ODgHv3v1qiN5oG/eroBXd83a0+xhi4BuJt0SwcV9mcv4uD9bCPhj944rmMLH+3qD4ysgImBmbYSbbLecE9+QAs7bfrCwQRfdCePBORX3FHa/p12NEtln7xv6ZRyku9LdJSzAcdgm4zc95ggTAVC1+aQB6J0q2QzWPlQcOkLx+ZYmOqClhbSMFpIyPXP8UpXjYyvUlTAd0+wH8BGf0O3lpOqACc7IKIbj9d5oPmghVZo55SyW+RR77G+az+IbGJ7iXZsMfQZsMvtB7hNYhNvUUxQrAau7Y/ve+6sMQmvA7aMHV8kDUvnNW/c2r2jAWwk+N8QzGcP/rclDCKeOWZqZABmrzTViXZVAeXh4hJ8r6mbq8iwagBUPCsVYhVuerQt/KIoWxyn6/1GmMfKGi3dA/v3u1qU61vzrz3yLlJBmUAVPxZdVmqfRweh4BXjImxFMFmf5PYm5FnDg1gmw8rWsgii7+IPYw7DjTAHpjYbtXvDwDgG1nRXiRp2TGtPPgKW1/Uk8r/j5vfB5WcEZ7exLUgsPPjny5MGvzjqOxeLvwK1Pg9jFBFXIx7l1tNMJQxQU0r3DmBg=
file: FeedTheMonkey.AppImage
on:
repo: jeena/FeedTheMonkey
skip_cleanup: true
draft: true

View file

@ -1,6 +1,6 @@
# FeedTheMonkey
<img align=right src="http://jabs.nu/feedthemonkey/feedthemonkey-icon.png" width='256' alt='Icon'>
<img align=right src="http://jeena.net/feedthemonkey/feedthemonkey-icon.png" width='256' alt='Icon'>
FeedTheMonkey is a desktop client for [TinyTinyRSS](http://tt-rss.org). That means that
it doesn't work as a standalone feed reader but only as a client for the TinyTinyRSS API
@ -11,10 +11,12 @@ to have Qt 5.6 installed to be able to compile and have a account on a TinyTinyR
## Installation
Download the latest release code from: https://github.com/jeena/FeedTheMonkey/releases/latest
If you run Linux then there is an AppImage on the [Latest release](https://github.com/jeena/FeedTheMonkey/releases/latest) page. You download it, make executable and are able to run, it should work on most of the distributions out there.
For ArchLinux I package it and it's available on https://aur.archlinux.org/packages/feedthemonkey/
You can compile and install it everywhere Qt is suported, this means on macOS, Windows
and Linux. For ArchLinux I package it and it's available on https://aur.archlinux.org/packages/feedthemonkey/
and Linux.
## Keyboard shortcuts
@ -41,13 +43,13 @@ the use on a desktop computer but I'd like to see it on a mobile device too.
## Screenshot
![Feed the Monkey screenshot](http://jabs.nu/feedthemonkey/screenshot.png)
![Feed the Monkey screenshot](http://jeena.net/feedthemonkey/feedthemonkey-dark.png)
## License
This file is part of FeedTheMonkey.
Copyright 2015 Jeena
Copyright 2015-2017 Jeena
FeedTheMonkey is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View file

@ -25,13 +25,12 @@ html, body {
body {
background: #eee;
font-family: sans-serif;
padding: 2em;
font-weight: lighter;
word-wrap: break-word;
}
.nightmode {
background: #111;
color: #aaa;
background: #353535;
color: #ddd;
}
.nightmode::-webkit-scrollbar {
@ -50,32 +49,28 @@ body {
}
h1 {
font-weight: lighter;
font-size: 1.4em;
margin: 0;
padding: 0;
}
#date {
border-bottom: 1px solid #aaa;
margin-bottom: 1em;
padding-bottom: 1em;
display: block;
}
.nightmode #date {
border-bottom-color: #333;
}
.starred:after {
content: "*";
}
header {
padding: 2em;
border-bottom: 1px solid #aaa;
}
.nightmode header {
border-bottom-color: #222;
}
header p {
color: #aaa;
color: #666;
margin: 0;
padding: 0;
font-size: 0.8em;
}
.nightmode header p {
@ -89,6 +84,7 @@ a {
article {
line-height: 1.6;
margin: 2em;
}
article a {

View file

@ -4,7 +4,96 @@
<meta charset="utf-8">
<title>TTRSS</title>
<link href="content.css" media="all" rel="stylesheet">
<script type="text/javascript" src="content.js"></script>
<script type="text/javascript">
/*
* This file is part of FeedTheMonkey.
*
* Copyright 2015 Jeena
*
* FeedTheMonkey 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 3 of the License, or
* (at your option) any later version.
*
* FeedTheMonkey 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 FeedTheMonkey. If not, see <http://www.gnu.org/licenses/>.
*/
function $(id) {
return document.getElementById(id);
}
function setArticle(article) {
window.scrollTo(0, 0);
$("date").innerHTML = "";
$("title").innerHTML = "";
$("title").href = "";
$("title").title = "";
$("feed_title").innerHTML = "";
$("author").innerHTML = "";
$("article").innerHTML = "";
if(article === "empty") {
$("article").innerHTML = "No unread articles to display.";
} else if(article === "loading") {
$("article").innerHTML = "Loading <blink>&hellip;</blink>";
} else if (article === "logout") {
} else if(article) {
$("date").innerHTML = (new Date(parseInt(article.updated, 10) * 1000));
$("title").innerHTML = article.title;
$("title").href = article.link;
$("title").title = article.link;
$("feed_title").innerHTML = article.feed_title;
$("title").className = article.marked ? "starred" : "";
$("author").innerHTML = "";
if(article.author && article.author.length > 0)
$("author").innerHTML = "&ndash; " + article.author
$("article").innerHTML = article.content;
var as = $("article").getElementsByTagName("a");
for(var i = 0; i < as.length; i++) {
as[i].target = "";
}
}
}
function setFont(font, size) {
document.body.style.fontFamily = font;
document.body.style.fontSize = size + "pt";
}
function setNightmode(nightmode) {
if(nightmode) document.body.className = "nightmode";
else document.body.className = "";
}
function checkKey(e) {
e = e || window.event;
if (e.keyCode === 37) {
window.location.href = "feedthemonkey:previous";
} else if (e.keyCode === 39) {
window.location.href = "feedthemonkey:next";
} else if(e.keyCode == 13) {
window.location.href = "feedthemonkey:open";
}
}
window.addEventListener("keydown", checkKey);
</script>
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
</head>
<body class=''>

View file

@ -1,73 +0,0 @@
/*
* This file is part of FeedTheMonkey.
*
* Copyright 2015 Jeena
*
* FeedTheMonkey 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 3 of the License, or
* (at your option) any later version.
*
* FeedTheMonkey 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 FeedTheMonkey. If not, see <http://www.gnu.org/licenses/>.
*/
function $(id) {
return document.getElementById(id);
}
function setArticle(article) {
window.scrollTo(0, 0);
$("date").innerHTML = "";
$("title").innerHTML = "";
$("title").href = "";
$("title").title = "";
$("feed_title").innerHTML = "";
$("author").innerHTML = "";
$("article").innerHTML = "";
if(article === "empty") {
$("article").innerHTML = "No unread articles to display.";
} else if(article === "loading") {
$("article").innerHTML = "Loading <blink>&hellip;</blink>";
} else if (article === "logout") {
} else if(article) {
$("date").innerHTML = (new Date(parseInt(article.updated, 10) * 1000));
$("title").innerHTML = article.title;
$("title").href = article.link;
$("title").title = article.link;
$("feed_title").innerHTML = article.feed_title;
$("title").className = article.marked ? "starred" : "";
$("author").innerHTML = "";
if(article.author && article.author.length > 0)
$("author").innerHTML = "&ndash; " + article.author
$("article").innerHTML = article.content;
var as = $("article").getElementsByTagName("a");
for(var i = 0; i < as.length; i++) {
as[i].target = "";
}
}
}
function setFont(font, size) {
document.body.style.fontFamily = font;
document.body.style.fontSize = size + "pt";
}
function setNightmode(nightmode) {
if(nightmode) document.body.className = "nightmode";
else document.body.className = "";
}

View file

@ -2,6 +2,5 @@
<qresource prefix="/html">
<file>content.css</file>
<file>content.html</file>
<file>content.js</file>
</qresource>
</RCC>

View file

@ -1,5 +1,4 @@
[Desktop Entry]
Version=2.0.0
Comment=A desktop client for the TinyTinyRSS feed reader.
Exec=feedthemonkey
GenericName=Feed Reader
@ -9,4 +8,4 @@ NoDisplay=false
StartupNotify=true
Terminal=false
Type=Application
Categories=Network;Qt
Categories=Network;Qt;

View file

@ -17,12 +17,11 @@
* along with FeedTheMonkey. If not, see <http://www.gnu.org/licenses/>.
*/
import QtWebEngine 1.0
import QtWebEngine 1.8
import QtQuick 2.0
import QtQuick.Controls 1.3
import QtQuick.Layouts 1.1
import QtQuick.Controls.Styles 1.3
import QtQuick.Controls 1.3
import TTRSS 1.0
Item {
@ -85,9 +84,17 @@ Item {
webView.runJavaScript("if(typeof setNightmode == \"function\") setNightmode(" + (content.nightmode ? "true" : "false") + ")")
}
onNavigationRequested: {
if (request.navigationType != WebEngineView.LinkClickedNavigation) {
if (request.url == "feedthemonkey:previous") {
request.action = WebEngineView.IgnoreRequest;
app.showPreviousPost();
} else if (request.url == "feedthemonkey:next") {
request.action = WebEngineView.IgnoreRequest;
app.showNextPost();
} else if (request.url == "feedthemonkey:open") {
request.action = WebEngineView.IgnoreRequest;
Qt.openUrlExternally(post.link)
} else if (request.navigationType !== WebEngineNavigationRequest.LinkClickedNavigation) {
request.action = WebEngineView.AcceptRequest;
} else {
request.action = WebEngineView.IgnoreRequest;

View file

@ -33,7 +33,7 @@ Item {
}
id: item
height: d.height + t.height + e.height + 20
height: d.height + t.height + e.height + 2
Item {
anchors.fill: parent
@ -81,7 +81,7 @@ Item {
Label {
id: t
text: title
color: nightmode ? (read ? "#555" : "#aaa") : (read ? "gray" : "black")
color: nightmode ? (read ? "#888" : "#ddd") : (read ? "gray" : "black")
font.pointSize: textFontSize
textFormat: Text.PlainText
wrapMode: Text.WrapAnywhere

View file

@ -48,6 +48,21 @@ ScrollView {
}
}
onWidthChanged: {
// Hide sidebar if smaller than 200px wide
if(width < 200) {
width = 0;
}
}
Rectangle {
width: 1
color: app.nightmode ? "#111" : "lightgray"
anchors.right: parent.right
anchors.top: parent.top
height: parent.height
}
ListView {
id: listView
@ -67,12 +82,12 @@ ScrollView {
highlightFollowsCurrentItem: false
highlight: Component {
Rectangle {
width: listView.currentItem.width
width: listView.currentItem.width -1
height: listView.currentItem.height
color: nightmode ? "#444" : "lightblue"
opacity: 0.5
color: nightmode ? "#15539e" : "lightblue"
y: listView.currentItem.y
}
}
onCurrentItemChanged: {
@ -85,8 +100,6 @@ ScrollView {
}
item.content.post = server.posts[currentIndex]
//content.flickableItem.contentY = 0
previousPost = item.content.post
}
}

View file

@ -35,6 +35,11 @@ MenuBar {
Menu {
visible: menuBar.visible
title: qsTr("File")
MenuItem {
text: qsTr("Close &Window")
shortcut: "Ctrl+W"
onTriggered: Qt.quit()
}
MenuItem {
text: qsTr("Exit")
shortcut: "Ctrl+Q"
@ -132,7 +137,7 @@ MenuBar {
title: qsTr("Help")
MenuItem {
text: qsTr("About")
onTriggered: Qt.openUrlExternally("http://jabs.nu/feedthemonkey");
onTriggered: Qt.openUrlExternally("http://jeena.net/feedthemonkey/index.html");
}
}

View file

@ -21,6 +21,7 @@ import QtQuick 2.3
import QtQuick.Controls 1.3
import QtQuick.Window 2.0
import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.1
import Qt.labs.settings 1.0
import TTRSS 1.0
@ -28,7 +29,7 @@ ApplicationWindow {
id: app
title: "FeedTheMonkey"
visible: true
color: nightmode ? "#111" : "#eee"
color: nightmode ? "#2d2d2d" : "#eee"
minimumWidth: 480
minimumHeight: 320
@ -47,6 +48,17 @@ ApplicationWindow {
property int textFontSizeIndex: defaultTextFontSizeIndex
property int textFontSize: fontSizes[textFontSizeIndex]
property bool nightmode: false
property bool showMenuBar: false
menuBar: TheMenuBar {
id: menu
serverLogin: serverLogin
server: server
sidebar: sidebar
content: content
visible: app.showMenuBar
__contentItem.visible: visible
}
Settings {
id: settings
@ -60,14 +72,6 @@ ApplicationWindow {
property alias nightmode: app.nightmode
}
property TheMenuBar menu: TheMenuBar {
id: menu
serverLogin: serverLogin
server: server
sidebar: sidebar
content: content
}
function loggedIn() {
if(serverLogin.loggedIn()) {
menu.loggedIn = true;
@ -109,6 +113,14 @@ ApplicationWindow {
return forEscapingHTML.getText(0, forEscapingHTML.length)
}
function showNextPost() {
sidebar.next()
}
function showPreviousPost() {
sidebar.previous()
}
function keyPressed(event) {
switch (event.key) {
case Qt.Key_Right:
@ -147,10 +159,6 @@ ApplicationWindow {
case Qt.Key_Return:
Qt.openUrlExternally(content.post.link)
break
case Qt.Key_S: {
console.log(Qt.openUrlExternally("speaker:"+ removeHTML(content.post.content)))
break
}
default:
break
}
@ -172,7 +180,6 @@ ApplicationWindow {
content: content
server: server
Layout.minimumWidth: 200
implicitWidth: 300
textFontSize: app.textFontSize
nightmode: app.nightmode
@ -192,7 +199,7 @@ ApplicationWindow {
Keys.onReleased: {
switch (event.key) {
case Qt.Key_Alt:
app.menuBar = menu
app.showMenuBar = !app.showMenuBar
break
default:
break
@ -206,14 +213,27 @@ ApplicationWindow {
visible: !serverLogin.loggedIn()
function login() {
console.log("FOO")
serverLogin.login(serverUrl, userName, password)
}
}
MessageDialog {
id: loginErrorAlert
title: "A login error occured"
text: serverLogin.loginError
onAccepted: visible = false
}
ServerLogin {
id: serverLogin
onSessionIdChanged: app.loggedIn()
onLoginErrorChanged: {
console.log("loginError:", loginError)
if(loginError.length > 0) {
loginErrorAlert.visible = true
}
}
}
Server {

View file

@ -31,6 +31,7 @@
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
app.setOrganizationName("Jeena");
app.setOrganizationDomain("jeena.net");

View file

@ -88,23 +88,47 @@ void TinyTinyRSSLogin::reply()
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
if (reply) {
if (reply->error() == QNetworkReply::NoError) {
QString jsonString = QString(reply->readAll());
QJsonDocument json = QJsonDocument::fromJson(jsonString.toUtf8());
mSessionId = json.object().value("content").toObject().value("session_id").toString();
if(json.object().value("content").toObject().value("error").toString().length() > 0) {
emit sessionIdChanged(mSessionId);
mLoginError = json.object().value("content").toObject().value("error").toString();
qWarning() << mLoginError;
emit loginErrorChanged(mLoginError);
QSettings settings;
settings.setValue("sessionId", mSessionId);
settings.setValue("serverUrl", mServerUrl);
settings.sync();
if(mLoginError == "NOT_LOGGED_IN") {
mSessionId = nullptr;
mServerUrl = nullptr;
QSettings settings;
settings.remove("sessionId");
settings.remove("serverUrl");
settings.sync();
emit sessionIdChanged(mSessionId);
}
} else {
mSessionId = json.object().value("content").toObject().value("session_id").toString();
emit sessionIdChanged(mSessionId);
QSettings settings;
settings.setValue("sessionId", mSessionId);
settings.setValue("serverUrl", mServerUrl);
settings.sync();
}
} else {
int httpStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
//do some error management
qWarning() << "HTTP error: " << httpStatus << " :: " << reply->error();
mLoginError = "HTTP error: "
+ reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString()
+ " :: "
+ reply->errorString();
qWarning() << mLoginError;
emit loginErrorChanged(mLoginError);
}
reply->deleteLater();
}

View file

@ -30,12 +30,14 @@ class TinyTinyRSSLogin : public QObject
Q_OBJECT
Q_PROPERTY(QString sessionId READ sessionId NOTIFY sessionIdChanged)
Q_PROPERTY(QUrl serverUrl READ serverUrl)
Q_PROPERTY(QString loginError READ loginError NOTIFY loginErrorChanged)
public:
TinyTinyRSSLogin(QObject *parent = 0);
~TinyTinyRSSLogin();
QString sessionId() const { return mSessionId; }
QUrl serverUrl() const { return mServerUrl; }
QString loginError() const { return mLoginError; }
Q_INVOKABLE bool loggedIn();
Q_INVOKABLE void login(const QString serverUrl, const QString user, const QString password);
@ -43,6 +45,7 @@ public:
signals:
void sessionIdChanged(QString);
void loginErrorChanged(QString);
private slots:
void reply();
@ -50,6 +53,7 @@ private slots:
private:
QString mSessionId;
QUrl mServerUrl;
QString mLoginError;
QNetworkAccessManager *mNetworkManager;
};