From 88a97bb5557c491aa8a46f182c77db6f85f364ea Mon Sep 17 00:00:00 2001 From: Jeena Date: Wed, 12 Aug 2020 22:10:56 +0200 Subject: [PATCH 1/3] Clean up and initialized everything for v3 written in Rust and GTK This commit just removes all the Qt and QML code and sets up everything as preperation for the rewrite in Rust and GTK. There is no new code yet, just a hello world, but the structure is there. --- .gitignore | 6 +- Cargo.lock | 6 + Cargo.toml | 14 +++ FeedTheMonkey.pro | 66 ---------- README.md | 21 ++-- html/html.qrc | 6 - misc/misc.qrc | 7 -- ports/arch/PKGBUILD | 25 ---- ports/osx/deploy.sh | 51 -------- qml/Content.qml | 116 ------------------ qml/Login.qml | 84 ------------- qml/PostListItem.qml | 123 ------------------- qml/Sidebar.qml | 106 ---------------- qml/TheMenuBar.qml | 144 ---------------------- qml/main.qml | 254 --------------------------------------- qml/qml.qrc | 10 -- src/main.cpp | 49 -------- src/main.rs | 3 + src/post.cpp | 79 ------------ src/post.h | 89 -------------- src/tinytinyrss.cpp | 150 ----------------------- src/tinytinyrss.h | 68 ----------- src/tinytinyrsslogin.cpp | 135 --------------------- src/tinytinyrsslogin.h | 60 --------- 24 files changed, 33 insertions(+), 1639 deletions(-) create mode 100644 Cargo.lock create mode 100644 Cargo.toml delete mode 100644 FeedTheMonkey.pro delete mode 100644 html/html.qrc delete mode 100644 misc/misc.qrc delete mode 100644 ports/arch/PKGBUILD delete mode 100755 ports/osx/deploy.sh delete mode 100644 qml/Content.qml delete mode 100644 qml/Login.qml delete mode 100644 qml/PostListItem.qml delete mode 100644 qml/Sidebar.qml delete mode 100644 qml/TheMenuBar.qml delete mode 100644 qml/main.qml delete mode 100644 qml/qml.qrc delete mode 100644 src/main.cpp create mode 100644 src/main.rs delete mode 100644 src/post.cpp delete mode 100644 src/post.h delete mode 100644 src/tinytinyrss.cpp delete mode 100644 src/tinytinyrss.h delete mode 100644 src/tinytinyrsslogin.cpp delete mode 100644 src/tinytinyrsslogin.h diff --git a/.gitignore b/.gitignore index dce9578..f3e4def 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -.DS_Store -FeedTheMonkey.pro.user* -build +#Added by cargo + +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..28b8141 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,6 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "feedthemonkey" +version = "3.0.0" + diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..f7f7a9d --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "feedthemonkey" +version = "3.0.0" +authors = ["Jeena "] +edition = "2018" +readme = "README.md" +repository = "https://github.com/jeena/feedthemonkey" +descrition = "Desktop client for the TinyTinyRSS feed reader" +licese = "GPL-3.0-or-later" +license-file = "COPYING" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/FeedTheMonkey.pro b/FeedTheMonkey.pro deleted file mode 100644 index 91d3739..0000000 --- a/FeedTheMonkey.pro +++ /dev/null @@ -1,66 +0,0 @@ -requires(contains(QT_CONFIG, accessibility)) - -qtHaveModule(widgets) { - QT += widgets # QApplication is required to get native styling with QtQuickControls -} - -TARGET = feedthemonkey - -TEMPLATE = app -QT += qml quick webenginewidgets webengine -CONFIG += c++11 -CONFIG += qtquickcompiler - -SOURCES += \ - src/main.cpp \ - src/post.cpp \ - src/tinytinyrss.cpp \ - src/tinytinyrsslogin.cpp - -RESOURCES += \ - html/html.qrc \ - qml/qml.qrc \ - -mac { - RC_FILE = misc/Icon.icns - TARGET = FeedTheMonkey -} - -unix { - isEmpty(PREFIX) { - PREFIX = /usr/local - } - - target.path = $$PREFIX/bin - - shortcutfiles.files = misc/feedthemonkey.desktop - shortcutfiles.path = $$PREFIX/share/applications/ - data.files += misc/feedthemonkey.xpm - data.path = $$PREFIX/share/pixmaps/ - - INSTALLS += shortcutfiles - INSTALLS += data -} - -INSTALLS += target - - -# Needed for bringing browser from background to foreground using QDesktopServices: http://bugreports.qt-project.org/browse/QTBUG-8336 -TARGET.CAPABILITY += SwEvent - -# Additional import path used to resolve QML modules in Qt Creator's code model -QML_IMPORT_PATH = - -OTHER_FILES += - -HEADERS += \ - src/post.h \ - src/tinytinyrss.h \ - src/tinytinyrsslogin.h - -DISTFILES += \ - misc/feedthemonkey.desktop \ - misc/feedthemonkey.xpm \ - misc/Icon.icns \ - README.md \ - LICENSE.txt diff --git a/README.md b/README.md index 155358a..5454f06 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ + # FeedTheMonkey Icon @@ -6,17 +7,11 @@ FeedTheMonkey is a desktop client for [TinyTinyRSS](http://tt-rss.org). That mea it doesn't work as a standalone feed reader but only as a client for the TinyTinyRSS API which it uses to get the normalized feeds and to synchronize the "article read" marks. -It is written in C++ with Qt and QML, it also uses Blink to show the contents. You need -to have Qt 5.6 installed to be able to compile and have a account on a TinyTinyRSS server. +It is written in Rust and GTK. You need to have an account on a TinyTinyRSS server. ## Installation -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. +TBD ## Keyboard shortcuts @@ -33,13 +28,11 @@ The keyboard shortcuts are inspired by other feed readers which are inspired by `Ctrl -` zoom out `Ctrl 0` reset zoom -On macOS use `Cmd` instead of `Ctrl`. - ## Trivia -This is version 2 of FeedTheMonkey, you can find version 1 which was written in PyQt in the v1 branch -of this repo. My goal is to make this usable on many different targets, for now it is only for -the use on a desktop computer but I'd like to see it on a mobile device too. +This is version 3 of FeedTheMonkey, you can find version 1 which was written +in PyQt in the v1 branch of this repo and version 2 which was written in C++ +and Qt/QML in the v2 branch. ## Screenshot @@ -49,7 +42,7 @@ the use on a desktop computer but I'd like to see it on a mobile device too. This file is part of FeedTheMonkey. -Copyright 2015-2017 Jeena +Copyright 2020 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 diff --git a/html/html.qrc b/html/html.qrc deleted file mode 100644 index c6cf166..0000000 --- a/html/html.qrc +++ /dev/null @@ -1,6 +0,0 @@ - - - content.css - content.html - - diff --git a/misc/misc.qrc b/misc/misc.qrc deleted file mode 100644 index 615a2a0..0000000 --- a/misc/misc.qrc +++ /dev/null @@ -1,7 +0,0 @@ - - - feedthemonkey.xpm - Icon.icns - feedthemonkey.desktop - - diff --git a/ports/arch/PKGBUILD b/ports/arch/PKGBUILD deleted file mode 100644 index 07c344b..0000000 --- a/ports/arch/PKGBUILD +++ /dev/null @@ -1,25 +0,0 @@ -# Maintainer: Jeena - -pkgname=feedthemonkey -_name=FeedTheMonkey -pkgver=2.2.0 -pkgrel=1 -pkgdesc="Desktop client for the TinyTinyRSS reader" -arch=('i686' 'x86_64') -url="http://jabs.nu/feedthemonkey" -license=('GPL3') -depends=('qt5-declarative' 'qt5-quick1' 'qt5-quickcontrols' 'qt5-webengine') -source=("https://github.com/jeena/${_name}/archive/v${pkgver}.tar.gz") -md5sums=('SKIP') - -build() { - cd "${_name}-$pkgver" - qmake-qt5 PREFIX=${pkgdir}/usr - make -} - -package() { - cd "${_name}-$pkgver" - make install - install -D -m644 COPYING "${pkgdir}/usr/share/licenses/${pkgname}/COPYING" -} diff --git a/ports/osx/deploy.sh b/ports/osx/deploy.sh deleted file mode 100755 index 369e2ec..0000000 --- a/ports/osx/deploy.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/sh - -# The macdeployqt app you get while installing Qt is broken for newer Qt -# versions like 5.4 which we use, we will have to replace it. -# -# Download and compile https://github.com/MaximAlien/macdeployqt do not -# use the .dmg which is too old. Move the new macdeployqt so it is in -# $QTDIR/bin/macdeployqt. -# -# Use fixqtlibspath.sh to fix your Qt installation, you need to change the -# path in this script, you don't have to run the Predator part. -# -# Build FeedTheMonkey.app in QtCreator as Release. - -if [[ "" == "$QTDIR" ]]; then - QTDIR=~/Qt/5.4/clang_64/ -fi - -BUILDDIR=$1 -APPDIR=$BUILDDIR/FeedTheMonkey.app -CONTENTSDIR=$APPDIR/Contents -ABSPATH=$(cd "$(dirname "$0")"; pwd) - -if [[ "" == "$BUILDDIR" ]]; then - echo "Usage: $0 path/to/build/" - exit 1 -fi - -# libexec -mkdir -p $APPDIR/Contents/libexec -cp $QTDIR/libexec/QtWebProcess $CONTENTSDIR/libexec -cat > $CONTENTSDIR/libexec/qt.conf << EOF -[Paths] -Plugins = ../PlugIns -Qml2Imports = ../Imports/qtquick2 -EOF - -# lab settings -mkdir -p $CONTENTSDIR/Imports/qtquick2/Qt/labs -cp -R $QTDIR/qml/Qt/labs/settings $CONTENTSDIR/Imports/qtquick2/Qt/labs -cat > $CONTENTSDIR/Resources/qt.conf << EOF -[Paths] -Plugins = PlugIns -Qml2Imports = Imports/qtquick2 -EOF - -# deploy -$QTDIR/bin/macdeployqt $APPDIR -no-strip -qmldir=$ABSPATH/../../qml -executable=$CONTENTSDIR/libexec/QtWebProcess - -open $BUILDDIR - diff --git a/qml/Content.qml b/qml/Content.qml deleted file mode 100644 index 07440be..0000000 --- a/qml/Content.qml +++ /dev/null @@ -1,116 +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 . - */ - -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 TTRSS 1.0 - -Item { - id: content - property Post post - property ApplicationWindow app - - property int textFontSize: 14 - property bool nightmode - property int scrollJump: 48 - property int pageJump: parent.height - Layout.minimumWidth: 400 - onTextFontSizeChanged: webView.setDefaults() - onNightmodeChanged: webView.setDefaults() - - function scrollDown(jump) { - if(!jump) { - webView.runJavaScript("window.scrollTo(0, document.body.scrollHeight - " + height + ");") - } else { - webView.runJavaScript("window.scrollBy(0, " + jump + ");") - } - } - - function scrollUp(jump) { - if(!jump) { - webView.runJavaScript("window.scrollTo(0, 0);") - } else { - webView.runJavaScript("window.scrollBy(0, -" + jump + ");") - } - } - - function loggedOut() { - post = null - } - - Label { id: fontLabel } - - WebEngineView { - id: webView - anchors.fill: parent - url: "../html/content.html" - - property Post post: content.post - - function setPost() { - if(post) { - webView.runJavaScript("setArticle(" + post.jsonString + ")") - } else { - webView.runJavaScript("setArticle('logout')") - } - } - - function setDefaults() { - // font name needs to be enclosed in single quotes - // and this is needed for El Capitain because ".SF NS Text" won't work - var defFont = ", system, -apple-system, '.SFNSDisplay-Regular', 'Helvetica Neue', 'Lucida Grande'"; - var font = "'" + fontLabel.font.family + "'" + defFont; - webView.runJavaScript("document.body.style.fontFamily = \"" + font + "\";"); - webView.runJavaScript("document.body.style.fontSize = '" + content.textFontSize + "pt';"); - webView.runJavaScript("if(typeof setNightmode == \"function\") setNightmode(" + (content.nightmode ? "true" : "false") + ")") - } - - onNavigationRequested: { - 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; - Qt.openUrlExternally(request.url); - } - } - - onLoadingChanged: { - if(!loading) { - setPost() - setDefaults() - } - } - - onPostChanged: setPost() - Keys.onPressed: app.keyPressed(event) - } -} - diff --git a/qml/Login.qml b/qml/Login.qml deleted file mode 100644 index 5948a12..0000000 --- a/qml/Login.qml +++ /dev/null @@ -1,84 +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 . - */ - -import QtQuick 2.0 -import QtQuick.Controls 1.2 - -Rectangle { - color: "transparent" - anchors.fill: parent - - property string serverUrl: serverUrl.text - property string userName: userName.text - property string password: password.text - - Column { - anchors.centerIn: parent - width: parent.width / 2 - anchors.margins: parent.width / 4 - spacing: 10 - - Text { - text: qsTr("Please specify a server url, a username and a password.") - wrapMode: Text.WordWrap - anchors.left: parent.left - anchors.right: parent.right - anchors.margins: 20 - font.pointSize: 20 - } - - TextField { - id: serverUrl - placeholderText: "http://example.com/ttrss/" - anchors.left: parent.left - anchors.right: parent.right - anchors.margins: 20 - validator: RegExpValidator { regExp: /https?:\/\/.+/ } - onAccepted: login() - } - - TextField { - id: userName - placeholderText: qsTr("username") - anchors.left: parent.left - anchors.right: parent.right - anchors.margins: 20 - onAccepted: login() - } - - TextField { - id: password - placeholderText: qsTr("password") - anchors.left: parent.left - anchors.right: parent.right - anchors.margins: 20 - echoMode: TextInput.Password - onAccepted: login() - } - - Button { - id: loginButton - text: "Ok" - anchors.right: parent.right - anchors.margins: 20 - onClicked: login() - } - } - -} diff --git a/qml/PostListItem.qml b/qml/PostListItem.qml deleted file mode 100644 index 63bf813..0000000 --- a/qml/PostListItem.qml +++ /dev/null @@ -1,123 +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 . - */ - -import QtQuick 2.0 -import QtQuick.Controls 1.3 - -Item { - property int textFontSize: 14 - property int smallfontSize: 11 - property bool nightmode - - Component.onCompleted: fixFontSize() - onTextFontSizeChanged: fixFontSize() - - function fixFontSize() { - smallfontSize = textFontSize * 0.8 - } - - id: item - height: d.height + t.height + e.height + 2 - - Item { - anchors.fill: parent - - Item { - anchors.fill: parent - anchors.leftMargin: 15 - anchors.rightMargin: 15 - anchors.topMargin: 10 - anchors.bottomMargin: 10 - - Column { - id: column - width: parent.width - - Item { - width: parent.width - height: d.height - - Label { - text: feedTitle - font.pointSize: smallfontSize - textFormat: Text.PlainText - color: nightmode ? "#888" : "gray" - wrapMode: Text.WrapAnywhere - renderType: Text.NativeRendering - elide: Text.ElideLeft - anchors.top: parent.top - anchors.left: parent.left - anchors.right: d.left - maximumLineCount: 1 - } - Label { - id: d - text: date.toLocaleString(Qt.locale(), Locale.ShortFormat) - font.pointSize: smallfontSize - textFormat: Text.PlainText - color: nightmode ? "#888" : "gray" - wrapMode: Text.WrapAtWordBoundaryOrAnywhere - renderType: Text.NativeRendering - anchors.right: parent.right - anchors.top: parent.top - } - } - Label { - id: t - text: title - color: nightmode ? (read ? "#888" : "#ddd") : (read ? "gray" : "black") - font.pointSize: textFontSize - textFormat: Text.PlainText - wrapMode: Text.WrapAnywhere - renderType: Text.NativeRendering - width: parent.width - elide: Text.ElideRight - maximumLineCount: 1 - - } - Label { - id: e - text: excerpt - font.pointSize: smallfontSize - //textFormat: Text.RichText - color: nightmode ? "#888" : "gray" - wrapMode: Text.WrapAnywhere - renderType: Text.NativeRendering - width: parent.width - elide: Text.ElideRight - maximumLineCount: 1 - } - } - } - - Rectangle { - anchors.top: parent.bottom - width: parent.width - height: 1 - color: nightmode ? "#222" : "lightgray" - } - } - - MouseArea { - anchors.fill: parent - onClicked: { - parent.parent.parent.currentIndex = index - } - } -} diff --git a/qml/Sidebar.qml b/qml/Sidebar.qml deleted file mode 100644 index 84de4cb..0000000 --- a/qml/Sidebar.qml +++ /dev/null @@ -1,106 +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 . - */ - -import QtQuick 2.0 -import TTRSS 1.0 -import QtQuick.Controls 1.3 -import QtQuick.Layouts 1.1 -import QtQuick.Controls.Styles 1.3 - -ScrollView { - id: item - - property Server server - property Content content - property Post previousPost - property int textFontSize: 14 - property bool nightmode - - style: ScrollViewStyle { - transientScrollBars: true - } - - function next() { - if(listView.count > listView.currentIndex) { - listView.currentIndex++; - } - } - - function previous() { - if(listView.currentIndex > 0) { - listView.currentIndex--; - } - } - - 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 - - focus: true - anchors.fill: parent - spacing: 1 - model: item.server.posts - - delegate: Component { - PostListItem { - textFontSize: item.textFontSize - nightmode: app.nightmode - width: listView.width - } - } - - highlightFollowsCurrentItem: false - highlight: Component { - Rectangle { - width: listView.currentItem.width -1 - height: listView.currentItem.height - color: nightmode ? "#15539e" : "lightblue" - y: listView.currentItem.y - } - - } - - onCurrentItemChanged: { - if(previousPost) { - if(!previousPost.dontChangeRead) { - previousPost.read = true; - } else { - previousPost.dontChangeRead = false; - } - } - - item.content.post = server.posts[currentIndex] - previousPost = item.content.post - } - } -} diff --git a/qml/TheMenuBar.qml b/qml/TheMenuBar.qml deleted file mode 100644 index 34c0310..0000000 --- a/qml/TheMenuBar.qml +++ /dev/null @@ -1,144 +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 . - */ - -import QtQuick.Controls 1.2 -import QtQuick.Window 2.0 -import QtQuick 2.0 -import TTRSS 1.0 - -MenuBar { - id: menuBar - property bool loggedIn: false - property ServerLogin serverLogin - property Server server - property Sidebar sidebar - property Content content - property bool visible: true - property var oldVisibility - - 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" - onTriggered: Qt.quit() - } - } - - Menu { - visible: menuBar.visible - title: qsTr("Action") - MenuItem { - text: qsTr("Reload") - shortcut: "R" - enabled: loggedIn - onTriggered: server.reload() - } - MenuItem { - text: qsTr("Set &Unread") - shortcut: "U" - enabled: loggedIn - onTriggered: { - content.post.dontChangeRead = true - content.post.read = false - } - } - MenuItem { - text: qsTr("Next") - shortcut: "J" - enabled: loggedIn - onTriggered: sidebar.next() - } - MenuItem { - text: qsTr("Previous") - shortcut: "K" - enabled: loggedIn - onTriggered: sidebar.previous() - } - MenuItem { - text: qsTr("Open in Browser") - shortcut: "N" - enabled: loggedIn - onTriggered: Qt.openUrlExternally(content.post.link) - } - MenuItem { - text: qsTr("Log Out") - enabled: loggedIn - onTriggered: serverLogin.logout() - } - } - - Menu { - visible: menuBar.visible - title: qsTr("View") - MenuItem { - text: qsTr("Night mode") - shortcut: "1" - onTriggered: app.toggleNightmode() - } - MenuItem { - text: qsTr("Zoom In") - shortcut: "Ctrl++" - enabled: loggedIn - onTriggered: app.zoomIn() - } - MenuItem { - text: qsTr("Zoom Out") - shortcut: "Ctrl+-" - enabled: loggedIn - onTriggered: app.zoomOut() - } - MenuItem { - text: qsTr("Reset") - shortcut: "Ctrl+0" - enabled: loggedIn - onTriggered: app.zoomReset() - } - MenuItem { - text: qsTr("Fullscreen") - shortcut: "F11" - enabled: loggedIn - onTriggered: { - if(app.visibility == Window.FullScreen) { - app.visibility = oldVisibility - } else { - oldVisibility = app.visibility - app.showFullScreen() - } - - } - } - } - - Menu { - visible: menuBar.visible - title: qsTr("Help") - MenuItem { - text: qsTr("About") - onTriggered: Qt.openUrlExternally("http://jeena.net/feedthemonkey/index.html"); - } - } - -} diff --git a/qml/main.qml b/qml/main.qml deleted file mode 100644 index 0b6074b..0000000 --- a/qml/main.qml +++ /dev/null @@ -1,254 +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 . - */ - -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 - -ApplicationWindow { - id: app - title: "FeedTheMonkey" - visible: true - color: nightmode ? "#2d2d2d" : "#eee" - - minimumWidth: 480 - minimumHeight: 320 - - width: 800 - height: 640 - x: 200 - y: 200 - - property Server server: server - property Sidebar sidebar: sidebar - property Content content: content - - property variant fontSizes: [7,9,11,13,15,17,19,21,23,25,27,29,31] - property int defaultTextFontSizeIndex: 3 - 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 - category: "window" - property alias x: app.x - property alias y: app.y - property alias width: app.width - property alias height: app.height - property alias sidebarWidth: sidebar.width - property alias textFontSizeIndex: app.textFontSizeIndex - property alias nightmode: app.nightmode - } - - function loggedIn() { - if(serverLogin.loggedIn()) { - menu.loggedIn = true; - contentView.visible = true - login.visible = false; - server.initialize(serverLogin.serverUrl, serverLogin.sessionId); - } else { - menu.loggedIn = false - contentView.visible = false - login.visible = true - server.loggedOut() - content.loggedOut() - } - } - - function toggleNightmode() { - app.nightmode = !app.nightmode - } - - function zoomIn() { - if(textFontSizeIndex + 1 < fontSizes.length) { - textFontSize = fontSizes[++textFontSizeIndex] - } - } - - function zoomOut() { - if(textFontSizeIndex - 1 > 0) { - textFontSize = fontSizes[--textFontSizeIndex] - } - } - - function zoomReset() { - textFontSizeIndex = defaultTextFontSizeIndex - textFontSize = fontSizes[textFontSizeIndex] - } - - function removeHTML(str) { - forEscapingHTML.text = str - return forEscapingHTML.getText(0, forEscapingHTML.length) - } - - function showNextPost() { - sidebar.next() - } - - function showPreviousPost() { - sidebar.previous() - } - - function keyPressed(event) { - switch (event.key) { - case Qt.Key_Right: - case Qt.Key_J: - case Qt.Key_j: - sidebar.next() - break - case Qt.Key_Left: - case Qt.Key_K: - case Qt.Key_k: - sidebar.previous() - break - case Qt.Key_1: - toggleNightmode() - break - case Qt.Key_Home: - content.scrollUp() - break - case Qt.Key_End: - content.scrollDown() - break - case Qt.Key_PageUp: - content.scrollUp(content.pageJump) - break - case Qt.Key_PageDown: - case Qt.Key_Space: - content.scrollDown(content.pageJump) - break - case Qt.Key_Down: - content.scrollDown(content.scrollJump) - break - case Qt.Key_Up: - content.scrollUp(content.scrollJump) - break - case Qt.Key_Enter: - case Qt.Key_Return: - Qt.openUrlExternally(content.post.link) - break - default: - break - } - } - - SplitView { - id: contentView - anchors.fill: parent - orientation: Qt.Horizontal - visible: serverLogin.loggedIn() - focus: true - handleDelegate: Rectangle { - width: 1 - color: app.nightmode ? "#333" : "#aaa" - } - - Sidebar { - id: sidebar - content: content - server: server - - implicitWidth: 300 - textFontSize: app.textFontSize - nightmode: app.nightmode - } - - Content { - id: content - app: app - - Layout.minimumWidth: 200 - implicitWidth: 624 - textFontSize: app.textFontSize - nightmode: app.nightmode - } - - Keys.onPressed: keyPressed(event) - Keys.onReleased: { - switch (event.key) { - case Qt.Key_Alt: - app.showMenuBar = !app.showMenuBar - break - default: - break - } - } - } - - Login { - id: login - anchors.fill: parent - visible: !serverLogin.loggedIn() - - function login() { - 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 { - id: server - } - - TextArea { - id: forEscapingHTML - visible: false - textFormat: TextEdit.RichText - } - - Component.onCompleted: { - if(serverLogin.loggedIn()) { - loggedIn(); - } - } -} diff --git a/qml/qml.qrc b/qml/qml.qrc deleted file mode 100644 index c0ff3c6..0000000 --- a/qml/qml.qrc +++ /dev/null @@ -1,10 +0,0 @@ - - - main.qml - TheMenuBar.qml - Content.qml - Login.qml - PostListItem.qml - Sidebar.qml - - diff --git a/src/main.cpp b/src/main.cpp deleted file mode 100644 index 48475bb..0000000 --- a/src/main.cpp +++ /dev/null @@ -1,49 +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 . - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "tinytinyrsslogin.h" -#include "tinytinyrss.h" -#include "post.h" - -int main(int argc, char *argv[]) -{ - QGuiApplication app(argc, argv); - app.setOrganizationName("Jeena"); - app.setOrganizationDomain("jeena.net"); - app.setApplicationName("FeedTheMonkey"); - - QtWebEngine::initialize(); - - qmlRegisterType("TTRSS", 1, 0, "ServerLogin"); - qmlRegisterType("TTRSS", 1, 0, "Server"); - qmlRegisterType("TTRSS", 1, 0, "Post"); - - QQmlApplicationEngine engine; - engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml"))); - - return app.exec(); -} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/src/post.cpp b/src/post.cpp deleted file mode 100644 index 2d3179b..0000000 --- a/src/post.cpp +++ /dev/null @@ -1,79 +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 . - */ - -#include "post.h" -#include -#include -#include - -Post::Post(QObject *parent) : QObject(parent) -{ - -} - -Post::Post(QJsonObject post, QObject *parent) : QObject(parent) -{ - mTitle = html2text(post.value("title").toString().trimmed()); - mFeedTitle = html2text(post.value("feed_title").toString().trimmed()); - mId = post.value("id").toInt(); - mFeedId = post.value("feed_id").toString().trimmed(); - mAuthor = post.value("author").toString().trimmed(); - QUrl url(post.value("link").toString().trimmed()); - mLink = url; - QDateTime timestamp; - timestamp.setTime_t(post.value("updated").toInt()); - mDate = timestamp; - mContent = post.value("content").toString().trimmed(); - mExcerpt = html2text(post.value("excerpt").toString().remove(QRegExp("<[^>]*>")).replace("…", " ...").trimmed().replace("(\\s+)", " ").replace("\n", "")); - mStarred = post.value("marked").toBool(); - mRead = !post.value("unread").toBool(); - mDontChangeRead = false; - - QJsonDocument doc(post); - QString result(doc.toJson(QJsonDocument::Indented)); - mJsonString = result; -} - -Post::~Post() -{ - -} - -void Post::setRead(bool r) -{ - if(mRead == r) return; - - mRead = r; - emit readChanged(mRead); -} - -void Post::setDontChangeRead(bool r) -{ - if(mDontChangeRead == r) return; - - mDontChangeRead = r; - emit dontChangeReadChanged(mDontChangeRead); -} - -QString Post::html2text(const QString htmlString) -{ - QTextDocument doc; - doc.setHtml(htmlString); - return doc.toPlainText(); -} diff --git a/src/post.h b/src/post.h deleted file mode 100644 index 56ab9ff..0000000 --- a/src/post.h +++ /dev/null @@ -1,89 +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 . - */ - -#ifndef POST_H -#define POST_H - -#include -#include -#include -#include - -class Post : public QObject -{ - Q_OBJECT - Q_PROPERTY(QString title READ title CONSTANT) - Q_PROPERTY(QString feedTitle READ feedTitle CONSTANT) - Q_PROPERTY(int id READ id CONSTANT) - Q_PROPERTY(QString feedId READ feedId CONSTANT) - Q_PROPERTY(QString author READ author CONSTANT) - Q_PROPERTY(QUrl link READ link CONSTANT) - Q_PROPERTY(QDateTime date READ date CONSTANT) - Q_PROPERTY(QString content READ content CONSTANT) - Q_PROPERTY(QString excerpt READ excerpt CONSTANT) - Q_PROPERTY(bool starred READ starred NOTIFY starredChanged) - Q_PROPERTY(bool read READ read WRITE setRead NOTIFY readChanged) - Q_PROPERTY(bool dontChangeRead READ dontChangeRead WRITE setDontChangeRead NOTIFY dontChangeReadChanged) - Q_PROPERTY(QString jsonString READ jsonString CONSTANT) - -public: - Post(QObject *parent = 0); - Post(QJsonObject post, QObject *parent = 0); - ~Post(); - QString title() const { return mTitle; } - QString feedTitle() const { return mFeedTitle; } - int id() const { return mId; } - QString feedId() const { return mFeedId; } - QString author() const { return mAuthor; } - QUrl link() const { return mLink; } - QDateTime date() const { return mDate; } - QString content() const { return mContent; } - QString excerpt() const { return mExcerpt; } - bool starred() const { return mStarred; } - bool read() { return mRead; } - void setRead(bool r); - bool dontChangeRead() const { return mDontChangeRead; } - void setDontChangeRead(bool r); - QString jsonString() const { return mJsonString; } - -signals: - void starredChanged(bool); - void readChanged(bool); - void dontChangeReadChanged(bool); - -public slots: - -private: - QString mTitle; - QString mFeedTitle; - int mId; - QString mFeedId; - QString mAuthor; - QUrl mLink; - QDateTime mDate; - QString mContent; - QString mExcerpt; - bool mStarred; - bool mRead; - bool mDontChangeRead; - QString mJsonString; - QString html2text(const QString htmlString); -}; - -#endif // POST_H diff --git a/src/tinytinyrss.cpp b/src/tinytinyrss.cpp deleted file mode 100644 index 4806c04..0000000 --- a/src/tinytinyrss.cpp +++ /dev/null @@ -1,150 +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 . - */ - -#include "tinytinyrss.h" -#include -#include -#include -#include - -TinyTinyRSS::TinyTinyRSS(QObject *parent) : - QObject(parent) -{ - qRegisterMetaType >(); - - mNetworkManager = new QNetworkAccessManager(this); - mPosts = QList(); -} - -TinyTinyRSS::~TinyTinyRSS() -{ - mPosts.clear(); - delete mNetworkManager; -} - -void TinyTinyRSS::initialize(const QString serverUrl, const QString sessionId) -{ - mServerUrl = serverUrl; - mSessionId = sessionId; - reload(); -} - -void TinyTinyRSS::reload() -{ - QVariantMap opts; - opts.insert("show_excerpt", false); - opts.insert("view_mode", "unread"); - opts.insert("show_content", true); - opts.insert("feed_id", -4); - opts.insert("skip", 0); - - doOperation("getHeadlines", opts, [this] (const QJsonObject &json) { - - mPosts.clear(); - - QJsonArray posts = json.value("content").toArray(); - for(int i = 0; i < posts.count(); i++) - { - QJsonObject postJson = posts.at(i).toObject(); - Post *post = new Post(postJson, this); - connect(post, SIGNAL(readChanged(bool)), this, SLOT(onPostReadChanged(bool))); - mPosts.append(post); - } - - emit postsChanged(mPosts); - }); -} - -void TinyTinyRSS::loggedOut() -{ - mServerUrl = nullptr; - mSessionId = nullptr; - mPosts.clear(); - emit postsChanged(mPosts); -} - -void TinyTinyRSS::doOperation(QString operation, QVariantMap opts, std::function callback) -{ - QVariantMap options; - options.insert("sid", mSessionId); - options.insert("op", operation); - - QMapIterator i(opts); - while (i.hasNext()) { - i.next(); - options.insert(i.key(), i.value()); - } - - QJsonObject jsonobj = QJsonObject::fromVariantMap(options); - QJsonDocument json = QJsonDocument(jsonobj); - - QNetworkRequest request(mServerUrl); - request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); - - QNetworkReply *reply = mNetworkManager->post(request, json.toJson()); - - connect(reply, &QNetworkReply::finished, [callback, reply] () { - if (reply) { - if (reply->error() == QNetworkReply::NoError) { - QString jsonString = QString(reply->readAll()); - QJsonDocument json = QJsonDocument::fromJson(jsonString.toUtf8()); - callback(json.object()); - } else { - int httpStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - //do some error management - qWarning() << "HTTP error: " << httpStatus; - } - reply->deleteLater(); - } - }); -} - -void TinyTinyRSS::onPostReadChanged(bool r) -{ - Post *post = (Post *)sender(); - - updateArticle(post->id(), 2, !r, [post] (const QJsonObject &) { - // not doing anything with this yet. - }); -} - -void TinyTinyRSS::updateArticle(int articleId, int field, bool trueFalse, std::function callback) -{ - QVariantMap opts; - opts.insert("article_ids", articleId); - opts.insert("field", field); - opts.insert("mode", trueFalse ? 1 : 0); - - doOperation("updateArticle", opts, callback); -} - -QQmlListProperty TinyTinyRSS::posts() -{ - return QQmlListProperty(this, mPosts); -} - -int TinyTinyRSS::postsCount() const -{ - return mPosts.count(); -} - -Post *TinyTinyRSS::post(int index) const -{ - return mPosts.at(index); -} diff --git a/src/tinytinyrss.h b/src/tinytinyrss.h deleted file mode 100644 index 2e85464..0000000 --- a/src/tinytinyrss.h +++ /dev/null @@ -1,68 +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 . - */ - -#ifndef TINYTINYRSS_H -#define TINYTINYRSS_H - -#include -#include -#include -#include -#include -#include - -#include - -#include "post.h" - -class TinyTinyRSS : public QObject -{ - Q_OBJECT - Q_PROPERTY(QQmlListProperty posts READ posts NOTIFY postsChanged) - -public: - TinyTinyRSS(QObject *parent = 0); - ~TinyTinyRSS(); - - Q_INVOKABLE void initialize(const QString serverUrl, const QString sessionId); - Q_INVOKABLE void reload(); - Q_INVOKABLE void loggedOut(); - - - QQmlListProperty posts(); - int postsCount() const; - Post *post(int) const; - -signals: - void postsChanged(QList); - -private slots: - void onPostReadChanged(bool); - -private: - void doOperation(QString operation, QVariantMap opts, std::function callback); - void updateArticle(int articleId, int field, bool trueFalse, std::function callback); - - QString mServerUrl; - QString mSessionId; - QList mPosts; - QNetworkAccessManager *mNetworkManager; -}; - -#endif // TINYTINYRSS_H diff --git a/src/tinytinyrsslogin.cpp b/src/tinytinyrsslogin.cpp deleted file mode 100644 index 2648e7a..0000000 --- a/src/tinytinyrsslogin.cpp +++ /dev/null @@ -1,135 +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 . - */ - -#include "tinytinyrsslogin.h" -#include -#include -#include -#include - -#define APP_URL "net.jeena" -#define APP_NAME "FeedTheMonkey" - -TinyTinyRSSLogin::TinyTinyRSSLogin(QObject *parent) : - QObject(parent) -{ - mNetworkManager = new QNetworkAccessManager(this); - - QSettings settings; - mSessionId = settings.value("sessionId").toString(); - mServerUrl = settings.value("serverUrl").toString(); -} - -TinyTinyRSSLogin::~TinyTinyRSSLogin() -{ - delete mNetworkManager; -} - -bool TinyTinyRSSLogin::loggedIn() -{ - return !mSessionId.isEmpty(); -} - -void TinyTinyRSSLogin::login(const QString serverUrl, const QString user, const QString password) -{ - mServerUrl = QUrl(serverUrl + "/api/"); - - QVariantMap options; - options.insert("op", "login"); - options.insert("user", user); - options.insert("password", password); - - QJsonObject jsonobj = QJsonObject::fromVariantMap(options); - QJsonDocument json = QJsonDocument(jsonobj); - - QNetworkRequest request(mServerUrl); - request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); - - QNetworkReply *reply = mNetworkManager->post(request, json.toJson()); - connect(reply, SIGNAL(finished()), this, SLOT(reply())); -} - -void TinyTinyRSSLogin::logout() -{ - if(mSessionId.length() > 0 && mServerUrl.toString().length() > 0) { - QVariantMap options; - options.insert("op", "logout"); - options.insert("sid", mSessionId); - - QJsonObject jsonobj = QJsonObject::fromVariantMap(options); - QJsonDocument json = QJsonDocument(jsonobj); - - QNetworkRequest request(mServerUrl); - request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); - - QNetworkReply *reply = mNetworkManager->post(request, json.toJson()); - connect(reply, SIGNAL(finished()), this, SLOT(reply())); - } -} - -void TinyTinyRSSLogin::reply() -{ - QNetworkReply *reply = qobject_cast(sender()); - - if (reply) { - - if (reply->error() == QNetworkReply::NoError) { - - QString jsonString = QString(reply->readAll()); - QJsonDocument json = QJsonDocument::fromJson(jsonString.toUtf8()); - if(json.object().value("content").toObject().value("error").toString().length() > 0) { - - mLoginError = json.object().value("content").toObject().value("error").toString(); - qWarning() << mLoginError; - emit loginErrorChanged(mLoginError); - - 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 { - mLoginError = "HTTP error: " - + reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString() - + " :: " - + reply->errorString(); - qWarning() << mLoginError; - - emit loginErrorChanged(mLoginError); - } - reply->deleteLater(); - } -} diff --git a/src/tinytinyrsslogin.h b/src/tinytinyrsslogin.h deleted file mode 100644 index 5c21887..0000000 --- a/src/tinytinyrsslogin.h +++ /dev/null @@ -1,60 +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 . - */ - -#ifndef TINYTINYRSSLOGIN_H -#define TINYTINYRSSLOGIN_H - -#include -#include -#include -#include - -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); - Q_INVOKABLE void logout(); - -signals: - void sessionIdChanged(QString); - void loginErrorChanged(QString); - -private slots: - void reply(); - -private: - QString mSessionId; - QUrl mServerUrl; - QString mLoginError; - QNetworkAccessManager *mNetworkManager; -}; - -#endif // TINYTINYRSSLOGIN_H From 01be7e88c3df1361d91c3c9fb2c64c41ec47517d Mon Sep 17 00:00:00 2001 From: Jeena Date: Wed, 12 Aug 2020 22:26:38 +0200 Subject: [PATCH 2/3] Create a GTK hello world application This commit sets everything up to be able to initialize a GTK application with a window and a button. --- Cargo.lock | 643 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 13 +- src/main.rs | 31 ++- 3 files changed, 683 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 28b8141..8bc3fcf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,649 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "anyhow" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "atk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "atk-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "glib 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "atk-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "system-deps 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "cairo-rs" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cairo-sys-rs 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "glib 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "system-deps 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cc" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "either" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "feedthemonkey" version = "3.0.0" +dependencies = [ + "gio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gtk 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", +] +[[package]] +name = "futures" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-executor 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "futures-channel" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "futures-core" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "futures-executor" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "futures-io" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "futures-macro" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro-hack 0.5.18 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "futures-sink" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "futures-task" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "once_cell 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "futures-util" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.23 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.18 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-nested 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "gdk" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cairo-rs 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cairo-sys-rs 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gdk-pixbuf 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gdk-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gio-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "glib 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "pango 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gdk-pixbuf-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gio-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "glib 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gio-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "system-deps 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "gdk-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cairo-sys-rs 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gdk-pixbuf-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gio-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "pango-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", + "system-deps 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "gio" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "gio-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "glib 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "once_cell 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "gio-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "system-deps 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "glib" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-executor 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-macros 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "once_cell 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "glib-macros" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "anyhow 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", + "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-error 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "glib-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "system-deps 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "gobject-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "system-deps 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "gtk" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "atk 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cairo-rs 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cairo-sys-rs 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.58 (registry+https://github.com/rust-lang/crates.io-index)", + "gdk 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gdk-pixbuf 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gdk-pixbuf-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gdk-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gio-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "glib 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gtk-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "once_cell 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pango 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pango-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "gtk-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "atk-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cairo-sys-rs 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gdk-pixbuf-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gdk-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gio-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "pango-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "system-deps 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "heck" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "itertools" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "either 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libc" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "memchr" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "once_cell" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "pango" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "glib 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "once_cell 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pango-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "pango-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)", + "system-deps 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "pin-project" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "pin-project-internal 0.4.23 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "pin-project-internal" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "pkg-config" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro-error-attr 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "proc-macro-nested" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "proc-macro2" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "quote" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde" +version = "1.0.115" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "slab" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "strum" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "strum_macros" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "syn" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "system-deps" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", + "strum 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "strum_macros 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "version-compare 0.0.10 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thiserror" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "thiserror-impl 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "toml" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.115 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unicode-segmentation" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "version-compare" +version = "0.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "version_check" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[metadata] +"checksum anyhow 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)" = "6b602bfe940d21c130f3895acd65221e8a61270debe89d628b9cb4e3ccb8569b" +"checksum atk 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "812b4911e210bd51b24596244523c856ca749e6223c50a7fbbba3f89ee37c426" +"checksum atk-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f530e4af131d94cc4fa15c5c9d0348f0ef28bac64ba660b6b2a1cf2605dedfce" +"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +"checksum cairo-rs 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c5c0f2e047e8ca53d0ff249c54ae047931d7a6ebe05d00af73e0ffeb6e34bdb8" +"checksum cairo-sys-rs 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ed2639b9ad5f1d6efa76de95558e11339e7318426d84ac4890b86c03e828ca7" +"checksum cc 1.0.58 (registry+https://github.com/rust-lang/crates.io-index)" = "f9a06fb2e53271d7c279ec1efea6ab691c35a2ae67ec0d91d7acec0caf13b518" +"checksum either 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cd56b59865bce947ac5958779cfa508f6c3b9497cc762b7e24a12d11ccde2c4f" +"checksum futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613" +"checksum futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5" +"checksum futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399" +"checksum futures-executor 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314" +"checksum futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789" +"checksum futures-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39" +"checksum futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc" +"checksum futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626" +"checksum futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6" +"checksum gdk 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5726681d558da88e07e4bffee21d4e7e5b02b4eb2de0b7d995a8b25813a7ed99" +"checksum gdk-pixbuf 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8f6dae3cb99dd49b758b88f0132f8d401108e63ae8edd45f432d42cdff99998a" +"checksum gdk-pixbuf-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bfe468a7f43e97b8d193a762b6c5cf67a7d36cacbc0b9291dbcae24bfea1e8f" +"checksum gdk-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0a9653cfc500fd268015b1ac055ddbc3df7a5c9ea3f4ccef147b3957bd140d69" +"checksum gio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c5492e80b45e6c56214894a9a0cbe1340ab5066eb44a2dbe151393b6d7942c0" +"checksum gio-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "35993626299fbcaa73c0a19be8fdd01c950f9f3d3ac9cb4fb5532b924ab1a5d7" +"checksum glib 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a5e0533f48640d86e8e2f3cee778a9f97588d4a0bec8be065ee51ea52346d6c1" +"checksum glib-macros 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "41486a26d1366a8032b160b59065a59fb528530a46a49f627e7048fb8c064039" +"checksum glib-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6cda4af5c2f4507b7a3535b798dca2135293f4bc3a17f399ce244ef15841c4c" +"checksum gobject-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "952133b60c318a62bf82ee75b93acc7e84028a093e06b9e27981c2b6fe68218c" +"checksum gtk 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04e8dfefe08ae2c0e3a8a221a5440a891a5e3402ba7c01078182f700c38ef345" +"checksum gtk-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "89acda6f084863307d948ba64a4b1ef674e8527dddab147ee4cdcc194c880457" +"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" +"checksum itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +"checksum libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f02823cf78b754822df5f7f268fb59822e7296276d3e069d8e8cb26a14bd10" +"checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" +"checksum once_cell 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" +"checksum pango 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9937068580bebd8ced19975938573803273ccbcbd598c58d4906efd4ac87c438" +"checksum pango-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24d2650c8b62d116c020abd0cea26a4ed96526afda89b1c4ea567131fdefc890" +"checksum pin-project 0.4.23 (registry+https://github.com/rust-lang/crates.io-index)" = "ca4433fff2ae79342e497d9f8ee990d174071408f28f726d6d83af93e58e48aa" +"checksum pin-project-internal 0.4.23 (registry+https://github.com/rust-lang/crates.io-index)" = "2c0e815c3ee9a031fdf5af21c10aa17c573c9c6a566328d99e3936c34e36461f" +"checksum pin-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +"checksum pkg-config 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)" = "d36492546b6af1463394d46f0c834346f31548646f6ba10849802c9c9a27ac33" +"checksum proc-macro-crate 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +"checksum proc-macro-error 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +"checksum proc-macro-error-attr 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +"checksum proc-macro-hack 0.5.18 (registry+https://github.com/rust-lang/crates.io-index)" = "99c605b9a0adc77b7211c6b1f722dcb613d68d66859a44f3d485a6da332b0598" +"checksum proc-macro-nested 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eba180dafb9038b050a4c280019bbedf9f2467b61e5d892dcad585bb57aadc5a" +"checksum proc-macro2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)" = "04f5f085b5d71e2188cb8271e5da0161ad52c3f227a661a3c135fdf28e258b12" +"checksum quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +"checksum serde 1.0.115 (registry+https://github.com/rust-lang/crates.io-index)" = "e54c9a88f2da7238af84b5101443f0c0d0a3bbdc455e34a5c9497b1903ed55d5" +"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +"checksum strum 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "57bd81eb48f4c437cadc685403cad539345bf703d78e63707418431cecd4522b" +"checksum strum_macros 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "87c85aa3f8ea653bfd3ddf25f7ee357ee4d204731f6aa9ad04002306f6e2774c" +"checksum syn 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)" = "e69abc24912995b3038597a7a593be5053eb0fb44f3cc5beec0deb421790c1f4" +"checksum system-deps 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0f3ecc17269a19353b3558b313bba738b25d82993e30d62a18406a24aba4649b" +"checksum thiserror 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)" = "7dfdd070ccd8ccb78f4ad66bf1982dc37f620ef696c6b5028fe2ed83dd3d0d08" +"checksum thiserror-impl 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)" = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793" +"checksum toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" +"checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" +"checksum unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +"checksum version-compare 0.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d63556a25bae6ea31b52e640d7c41d1ab27faba4ccb600013837a3d0b3994ca1" +"checksum version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" diff --git a/Cargo.toml b/Cargo.toml index f7f7a9d..427c2b5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,10 +5,17 @@ authors = ["Jeena "] edition = "2018" readme = "README.md" repository = "https://github.com/jeena/feedthemonkey" -descrition = "Desktop client for the TinyTinyRSS feed reader" -licese = "GPL-3.0-or-later" -license-file = "COPYING" +description = "Desktop client for the TinyTinyRSS feed reader" +license = "GPL-3.0-or-later" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] + +[dependencies.gtk] +version = "0.9.0" +features = ["v3_16"] + +[dependencies.gio] +version = "" +features = ["v2_44"] diff --git a/src/main.rs b/src/main.rs index e7a11a9..e01b5e0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,32 @@ +extern crate gtk; +extern crate gio; + +use gtk::prelude::*; +use gio::prelude::*; + +use gtk::{Application, ApplicationWindow, Button}; + + fn main() { - println!("Hello, world!"); + + let application = Application::new( + Some("net.jeena.feedthemonkey"), + Default::default(), + ).expect("failed to initialize GTK application"); + + application.connect_activate(|app| { + let window = ApplicationWindow::new(app); + window.set_title("FeedTheMonkey"); + window.set_default_size(350, 70); + + let button = Button::with_label("Click me!"); + button.connect_clicked(|_| { + println!("Clicked!"); + }); + window.add(&button); + + window.show_all(); + }); + + application.run(&[]); } From 54d57c0daaba7b7873ff59ce2e38050dceebabcf Mon Sep 17 00:00:00 2001 From: Jeena Date: Tue, 25 Aug 2020 00:01:13 +0200 Subject: [PATCH 3/3] Add Settings and a main window --- .travis.yml | 33 --------- .vscode/launch.json | 45 ++++++++++++ Cargo.lock | 166 ++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 4 ++ src/app.rs | 63 +++++++++++++++++ src/main.rs | 35 ++-------- src/settings.rs | 20 ++++++ 7 files changed, 303 insertions(+), 63 deletions(-) delete mode 100644 .travis.yml create mode 100644 .vscode/launch.json create mode 100644 src/app.rs create mode 100644 src/settings.rs diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index fcc6e8d..0000000 --- a/.travis.yml +++ /dev/null @@ -1,33 +0,0 @@ -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 diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..0fe0de3 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,45 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "lldb", + "request": "launch", + "name": "Debug executable 'feedthemonkey'", + "cargo": { + "args": [ + "build", + "--bin=feedthemonkey", + "--package=feedthemonkey" + ], + "filter": { + "name": "feedthemonkey", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug unit tests in executable 'feedthemonkey'", + "cargo": { + "args": [ + "test", + "--no-run", + "--bin=feedthemonkey", + "--package=feedthemonkey" + ], + "filter": { + "name": "feedthemonkey", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 8bc3fcf..4b72dc6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -63,6 +63,24 @@ name = "cc" version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "confy" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "directories 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.115 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "directories" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "either" version = "1.6.0" @@ -72,8 +90,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "feedthemonkey" version = "3.0.0" dependencies = [ + "confy 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "gio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "gtk 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.115 (registry+https://github.com/rust-lang/crates.io-index)", + "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "url_serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -358,6 +380,26 @@ dependencies = [ "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "idna" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-normalization 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "idna" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-normalization 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "itertools" version = "0.9.0" @@ -371,6 +413,11 @@ name = "libc" version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "matches" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "memchr" version = "2.3.3" @@ -406,6 +453,16 @@ dependencies = [ "system-deps 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "percent-encoding" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "pin-project" version = "0.4.23" @@ -494,6 +551,19 @@ dependencies = [ name = "serde" version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde_derive 1.0.115 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde_derive" +version = "1.0.115" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "slab" @@ -558,6 +628,19 @@ dependencies = [ "syn 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tinyvec" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "toml" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.115 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "toml" version = "0.5.6" @@ -566,6 +649,22 @@ dependencies = [ "serde 1.0.115 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "unicode-bidi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unicode-normalization" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "tinyvec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "unicode-segmentation" version = "1.6.0" @@ -576,6 +675,36 @@ name = "unicode-xid" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "url" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "url" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.115 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "url_serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.115 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "version-compare" version = "0.0.10" @@ -586,6 +715,25 @@ name = "version_check" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [metadata] "checksum anyhow 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)" = "6b602bfe940d21c130f3895acd65221e8a61270debe89d628b9cb4e3ccb8569b" "checksum atk 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "812b4911e210bd51b24596244523c856ca749e6223c50a7fbbba3f89ee37c426" @@ -594,6 +742,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum cairo-rs 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c5c0f2e047e8ca53d0ff249c54ae047931d7a6ebe05d00af73e0ffeb6e34bdb8" "checksum cairo-sys-rs 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ed2639b9ad5f1d6efa76de95558e11339e7318426d84ac4890b86c03e828ca7" "checksum cc 1.0.58 (registry+https://github.com/rust-lang/crates.io-index)" = "f9a06fb2e53271d7c279ec1efea6ab691c35a2ae67ec0d91d7acec0caf13b518" +"checksum confy 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4b1400cd0dae7f27d2c7ced9492e1398d2e2df614570092a4936c73b416dedea" +"checksum directories 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc2561db021b6f1321d0f16b67ed28ce843ef4610dfaa432e3ffa2e8a3050ebf" "checksum either 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cd56b59865bce947ac5958779cfa508f6c3b9497cc762b7e24a12d11ccde2c4f" "checksum futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613" "checksum futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5" @@ -617,12 +767,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum gtk 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04e8dfefe08ae2c0e3a8a221a5440a891a5e3402ba7c01078182f700c38ef345" "checksum gtk-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "89acda6f084863307d948ba64a4b1ef674e8527dddab147ee4cdcc194c880457" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" +"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" +"checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" "checksum itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" "checksum libc 0.2.74 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f02823cf78b754822df5f7f268fb59822e7296276d3e069d8e8cb26a14bd10" +"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" "checksum once_cell 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" "checksum pango 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9937068580bebd8ced19975938573803273ccbcbd598c58d4906efd4ac87c438" "checksum pango-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24d2650c8b62d116c020abd0cea26a4ed96526afda89b1c4ea567131fdefc890" +"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" +"checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" "checksum pin-project 0.4.23 (registry+https://github.com/rust-lang/crates.io-index)" = "ca4433fff2ae79342e497d9f8ee990d174071408f28f726d6d83af93e58e48aa" "checksum pin-project-internal 0.4.23 (registry+https://github.com/rust-lang/crates.io-index)" = "2c0e815c3ee9a031fdf5af21c10aa17c573c9c6a566328d99e3936c34e36461f" "checksum pin-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" @@ -635,6 +790,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum proc-macro2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)" = "04f5f085b5d71e2188cb8271e5da0161ad52c3f227a661a3c135fdf28e258b12" "checksum quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" "checksum serde 1.0.115 (registry+https://github.com/rust-lang/crates.io-index)" = "e54c9a88f2da7238af84b5101443f0c0d0a3bbdc455e34a5c9497b1903ed55d5" +"checksum serde_derive 1.0.115 (registry+https://github.com/rust-lang/crates.io-index)" = "609feed1d0a73cc36a0182a840a9b37b4a82f0b1150369f0536a9e3f2a31dc48" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum strum 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "57bd81eb48f4c437cadc685403cad539345bf703d78e63707418431cecd4522b" "checksum strum_macros 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "87c85aa3f8ea653bfd3ddf25f7ee357ee4d204731f6aa9ad04002306f6e2774c" @@ -642,8 +798,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum system-deps 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0f3ecc17269a19353b3558b313bba738b25d82993e30d62a18406a24aba4649b" "checksum thiserror 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)" = "7dfdd070ccd8ccb78f4ad66bf1982dc37f620ef696c6b5028fe2ed83dd3d0d08" "checksum thiserror-impl 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)" = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793" +"checksum tinyvec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "238ce071d267c5710f9d31451efec16c5ee22de34df17cc05e56cbc92e967117" +"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" "checksum toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" +"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +"checksum unicode-normalization 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6fb19cf769fa8c6a80a162df694621ebeb4dafb606470b2b2fce0be40a98a977" "checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" "checksum unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +"checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" +"checksum url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" +"checksum url_serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "74e7d099f1ee52f823d4bdd60c93c3602043c728f5db3b97bdb548467f7bddea" "checksum version-compare 0.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d63556a25bae6ea31b52e640d7c41d1ab27faba4ccb600013837a3d0b3994ca1" "checksum version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" +"checksum winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/Cargo.toml b/Cargo.toml index 427c2b5..67a3e39 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,10 @@ license = "GPL-3.0-or-later" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +url = { version = "2.1.1", features = ["serde"] } +url_serde = "0.2.0" +confy = "0.3.1" +serde = { version = "1.0", features = ["derive"] } [dependencies.gtk] version = "0.9.0" diff --git a/src/app.rs b/src/app.rs new file mode 100644 index 0000000..e36f740 --- /dev/null +++ b/src/app.rs @@ -0,0 +1,63 @@ +extern crate gio; +extern crate gtk; +extern crate confy; + +use gio::prelude::*; +use gtk::prelude::*; +use std::string::String; +use crate::settings::Settings; + +const APP_ID: &str = "net.jeena.feedthemonkey"; + +#[derive(Debug)] +pub struct App { + uiapp: gtk::Application, + settings: Option, +} + +impl App { + pub fn new() -> Self { + let app = gtk::Application::new( + Some(&APP_ID), + gio::ApplicationFlags::FLAGS_NONE, + ) + .expect("Application::new failed"); + + app.connect_activate(|app| { + // We create the main window. + let win = gtk::ApplicationWindow::new(app); + + // Then we set its size and a title. + win.set_default_size(320, 200); + win.set_title("FeedTheMonkey"); + + // Don't forget to make all widgets visible. + win.show_all(); + }); + + let conf: Result = confy::load(&APP_ID); + + match conf { + Ok(s) => Self { uiapp: app, settings: Some(s) }, + Err(_) => Self { uiapp: app, settings: None }, + } + } + + pub fn run(&self, argv: &[String]) { +/* + match self.settings { + Some(_) => self.show_content(), + None => match confy::store(&APP_ID, Settings::default()) { // TODO: Replace default data with login form data + Ok(_) => println!("New settings stored"), + Err(e) => eprint!("Error while storing settings: {}", e) + } + } +*/ + self.uiapp.run(&argv); + } + + pub fn show_content(&self) { + println!("Show content") + } + +} diff --git a/src/main.rs b/src/main.rs index e01b5e0..78bee0b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,32 +1,7 @@ -extern crate gtk; -extern crate gio; - -use gtk::prelude::*; -use gio::prelude::*; - -use gtk::{Application, ApplicationWindow, Button}; - +mod app; +mod settings; fn main() { - - let application = Application::new( - Some("net.jeena.feedthemonkey"), - Default::default(), - ).expect("failed to initialize GTK application"); - - application.connect_activate(|app| { - let window = ApplicationWindow::new(app); - window.set_title("FeedTheMonkey"); - window.set_default_size(350, 70); - - let button = Button::with_label("Click me!"); - button.connect_clicked(|_| { - println!("Clicked!"); - }); - window.add(&button); - - window.show_all(); - }); - - application.run(&[]); -} + let app = app::App::new(); + app.run(&std::env::args().collect::>()); +} \ No newline at end of file diff --git a/src/settings.rs b/src/settings.rs new file mode 100644 index 0000000..6f29238 --- /dev/null +++ b/src/settings.rs @@ -0,0 +1,20 @@ +extern crate confy; + +use std::string::String; +use url::Url; +use serde::{Serialize, Deserialize}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct Settings { + pub session_id: String, + pub server_url: Url, +} + +impl ::std::default::Default for Settings { + fn default() -> Self { + Self { + session_id: String::from("abcdefg"), + server_url: Url::parse("https://example.com").expect("Not a URL"), + } + } +} \ No newline at end of file