Merge pull request #100 from poetaster/master
Implement Sailfish.WebView 1.0
This commit is contained in:
commit
cccd325722
7 changed files with 138 additions and 12 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,2 +1,3 @@
|
||||||
*.user
|
*.user
|
||||||
README.md
|
README.md
|
||||||
|
harbour-tooterb.pro.user
|
||||||
|
|
|
@ -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
26
qml/lib/index.html
Normal 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
43
qml/lib/server.py
Normal 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()
|
|
@ -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 {}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue