Merge pull request #100 from poetaster/master

Implement Sailfish.WebView 1.0
This commit is contained in:
molan-git 2022-11-09 17:23:07 +01:00 committed by GitHub
commit cccd325722
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 138 additions and 12 deletions

1
.gitignore vendored
View file

@ -1,2 +1,3 @@
*.user *.user
README.md README.md
harbour-tooterb.pro.user

View file

@ -73,6 +73,8 @@ DISTFILES += qml/harbour-tooterb.qml \
qml/pages/LoginPage.qml \ qml/pages/LoginPage.qml \
qml/pages/Browser.qml \ qml/pages/Browser.qml \
qml/lib/API.js \ qml/lib/API.js \
qml/lib/server.py \
qml/lib/index.html \
qml/images/icon-s-following \ qml/images/icon-s-following \
qml/images/icon-s-bookmark \ qml/images/icon-s-bookmark \
qml/images/icon-m-emoji.svg \ qml/images/icon-m-emoji.svg \

26
qml/lib/index.html Normal file
View file

@ -0,0 +1,26 @@
<html>
<head>
<meta name="viewport" content="width=device-width, user-scalable=no"/>
<style>
body { font-family: sans-serif; background-color:black;}
button { width: 32%; font-size: 20px; height: 40px; }
#output { width: 100%; text-align: center; font-size: 120px; }
</style>
<script type="text/javascript">
function action(topic) {
var output = document.getElementById('output');
output.textContent = {"one": "1", "two": "2", "three": "3"}[topic]
}
function send(topic) {
var customEvent = new CustomEvent("framescript:log",
{detail: { topic: topic}});
document.dispatchEvent(customEvent);
}
</script>
</head>
<body>
<div id="output"><p>Login Complete</p></div>
</body>
</html>

43
qml/lib/server.py Normal file
View file

@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
# POETASTER
import sys
sys.path.append('/usr/share/harbour-tooterb/qml')
sys.path.append('/usr/share/harbour-tooterb/qml/lib')
sys.path.append('/usr/share/harbour-tooterb/qml/pages')
# POETASTER
import pyotherside
import threading
import time
import random
import os
import http.server
import socketserver
PORT = 8000
directory = '/usr/share/harbour-tooterb/qml/lib'
Handler = http.server.SimpleHTTPRequestHandler
os.chdir(directory)
def serveMe():
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print("serving at port", PORT)
pyotherside.send('finished', PORT)
httpd.serve_forever()
class Downloader:
def __init__(self):
# Set bgthread to a finished thread so we never
# have to check if it is None.
self.bgthread = threading.Thread()
self.bgthread.start()
def serve(self):
if self.bgthread.is_alive():
return
self.bgthread = threading.Thread(target=serveMe)
self.bgthread.start()
downloader = Downloader()

View file

@ -1,10 +1,33 @@
import QtQuick 2.0 import QtQuick 2.0
import QtWebKit 3.0
import Sailfish.Silica 1.0 import Sailfish.Silica 1.0
import Sailfish.WebView 1.0
import Sailfish.WebEngine 1.0
import io.thp.pyotherside 1.5
import "../lib/API.js" as Logic import "../lib/API.js" as Logic
Page { Page {
// Python connections and signals, callable from QML side
// This is not ideal but keeps the page from erroring out on redirect
Python {
id: py
Component.onCompleted: {
addImportPath(Qt.resolvedUrl('../lib/'));
importModule('server', function () {});
setHandler('finished', function(newvalue) {
console.debug(newvalue)
});
startDownload();
}
function startDownload() {
call('server.downloader.serve', function() {});
console.debug("called")
}
}
id: loginPage id: loginPage
// The effective value will be restricted by ApplicationWindow.allowedOrientations // The effective value will be restricted by ApplicationWindow.allowedOrientations
allowedOrientations: Orientation.All allowedOrientations: Orientation.All
@ -39,7 +62,7 @@ Page {
EnterKey.onClicked: { EnterKey.onClicked: {
Logic.api = Logic.mastodonAPI({ instance: instance.text, api_user_token: "" }); Logic.api = Logic.mastodonAPI({ instance: instance.text, api_user_token: "" });
Logic.api.registerApplication("Tooter", Logic.api.registerApplication("Tooter",
'http://localhost/harbour-tooter', // redirect uri, we will need this later on 'http://localhost:8000/index.html', // redirect uri, we will need this later on
["read", "write", "follow"], //scopes ["read", "write", "follow"], //scopes
"http://grave-design.com/harbour-tooter", //website on the login screen "http://grave-design.com/harbour-tooter", //website on the login screen
function(data) { function(data) {
@ -90,22 +113,50 @@ Page {
} }
} }
} }
WebView {
SilicaWebView {
id: webView id: webView
/* This will probably be required from 4.4 on. */
Component.onCompleted: {
WebEngineSettings.setPreference("security.disable_cors_checks", true, WebEngineSettings.BoolPref)
WebEngineSettings.setPreference("security.fileuri.strict_origin_policy", false, WebEngineSettings.BoolPref)
}
onViewInitialized: {
//webview.loadFrameScript(Qt.resolvedUrl("../html/framescript.js"));
//webview.addMessageListener("webview:action");
//webview.runJavaScript("return latlon('" + lat + "','" + lon + "')");
}
onRecvAsyncMessage: {
console.log('async changed: ' + url)
console.debug(message)
switch (message) {
case "embed:contentOrientationChanged":
break
case "webview:action":
if ( data.topic != lon ) {
//webview.runJavaScript("return latlon('" + lat + "','" + lon + "')");
//if (debug) console.debug(data.topic)
//if (debug) console.debug(data.also)
//if (debug) console.debug(data.src)
}
break
}
}
visible: false visible: false
opacity: 0 //opacity: 0
anchors { anchors {
top: parent.top top: parent.top
left: parent.left left: parent.left
right: parent.right right: parent.right
bottom: parent.bottom bottom: parent.bottom
} }
onLoadingChanged: { onLoadingChanged: {
console.log(url) console.log('loading changed: ' + url)
if ( if (
(url+"").substr(0, 37) === 'http://localhost/harbour-tooter?code=' || (url+"").substr(0, 38) === 'http://localhost:8000/index.html?code=' ||
(url+"").substr(0, 38) === 'https://localhost/harbour-tooter?code=' (url+"").substr(0, 39) === 'https://localhost:8000/index.html?code='
) { ) {
visible = false; visible = false;
@ -136,7 +187,7 @@ Page {
} }
switch (loadRequest.status) /*switch (loadRequest.status)
{ {
case WebView.LoadSucceededStatus: case WebView.LoadSucceededStatus:
opacity = 1 opacity = 1
@ -147,7 +198,7 @@ Page {
default: default:
//opacity = 0 //opacity = 0
break break
} }*/
} }
FadeAnimation on opacity {} FadeAnimation on opacity {}

View file

@ -1,6 +1,6 @@
# #
# Do NOT Edit the Auto-generated Part! # Do NOT Edit the Auto-generated Part!
# Generated by: spectacle version 0.27 # Generated by: spectacle version 0.32
# #
Name: harbour-tooterb Name: harbour-tooterb
@ -21,6 +21,8 @@ URL: http://example.org/
Source0: %{name}-%{version}.tar.bz2 Source0: %{name}-%{version}.tar.bz2
Source100: harbour-tooterb.yaml Source100: harbour-tooterb.yaml
Requires: sailfishsilica-qt5 >= 0.10.9 Requires: sailfishsilica-qt5 >= 0.10.9
Requires: nemo-qml-plugin-configuration-qt5
Requires: nemo-qml-plugin-notifications-qt5
BuildRequires: pkgconfig(sailfishapp) >= 1.0.2 BuildRequires: pkgconfig(sailfishapp) >= 1.0.2
BuildRequires: pkgconfig(Qt5Core) BuildRequires: pkgconfig(Qt5Core)
BuildRequires: pkgconfig(Qt5Qml) BuildRequires: pkgconfig(Qt5Qml)

View file

@ -27,7 +27,8 @@ PkgConfigBR:
- Qt5Quick - Qt5Quick
- Qt5DBus - Qt5DBus
- Qt5Multimedia - Qt5Multimedia
- nemonotifications-qt5 #- nemonotifications-qt5 nemo-qml-plugin-notifications-qt5
- nemo-qml-plugin-notifications-qt5-devel
- openssl - openssl
# Build dependencies without a pkgconfig setup can be listed here # Build dependencies without a pkgconfig setup can be listed here