Skip to content

Commit

Permalink
changing QTextBrowser to QWebView for better markdown
Browse files Browse the repository at this point in the history
  • Loading branch information
vitiacat committed Jul 20, 2022
1 parent 70fb35f commit 56e08ef
Show file tree
Hide file tree
Showing 6 changed files with 1,844 additions and 23 deletions.
57 changes: 38 additions & 19 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
import grequests
import requests
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import QThread, QUrl, QTimer, pyqtSignal
from PyQt5.QtCore import QThread, QUrl, QTimer, pyqtSignal, QObject, pyqtProperty
from PyQt5.QtWebChannel import QWebChannel
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWidgets import QApplication, QMainWindow, QProgressBar, QTextBrowser, QLabel, QToolButton, QLineEdit, \
QComboBox, QCheckBox
from PyQt5.QtGui import QIcon, QDesktopServices, QCursor
Expand Down Expand Up @@ -65,6 +67,24 @@ def open_link(url):
}


class Document(QObject):
textChanged = pyqtSignal(str)

def __init__(self, parent=None):
super().__init__(parent)
self.m_text = ""

def get_text(self):
return self.m_text

def set_text(self, text):
if self.m_text == text:
return
self.m_text = text
self.textChanged.emit(self.m_text)

text = pyqtProperty(str, fget=get_text, fset=set_text, notify=textChanged)

class ModrinthBrowser(QMainWindow):

def get_menu(self, is_view, item):
Expand Down Expand Up @@ -138,14 +158,27 @@ def open_mod(self, item):
info = info.json()
dialog = QtWidgets.QDialog()
ViewDialog().setupUi(dialog)
browser: QTextBrowser = dialog.findChild(QTextBrowser, 'textBrowser')

document = Document()
channel = QWebChannel()
channel.registerObject("content", document)

view: QWebEngineView = QWebEngineView()
dialog.findChild(QtWidgets.QGridLayout, 'gridLayout_2').addWidget(view)
view.page().setWebChannel(channel)
view.setUrl(QUrl.fromLocalFile(os.path.join(os.path.dirname(__file__), 'web', 'index.html')))
document.set_text(info['body'])


button: QToolButton = dialog.findChild(QToolButton, 'menuButton')
button.clicked.connect(lambda: self.get_menu(True, item).popup(QCursor.pos()))
label: QLabel = dialog.findChild(QLabel, 'label')
label.setText(info['title'])
browser.anchorClicked.connect(open_link)
browser.setMarkdown(info['body'])
browser.setOpenLinks(False)

#browser: QTextBrowser = dialog.findChild(QTextBrowser, 'textBrowser')
# browser.anchorClicked.connect(open_link)
# browser.setMarkdown(info['body'])
# browser.setOpenLinks(False)
dialog.exec()

def open_settings(self):
Expand Down Expand Up @@ -279,20 +312,6 @@ def add_to_list(self, mod: ModInfo, i, count):
self.list.setItem(count_, 8, QtWidgets.QTableWidgetItem(mod.project_id))
self.status_progress.setValue(int(i / count * 100))

class GetJSON(QThread):
result = pyqtSignal(dict)

def __init__(self, url):
QtCore.QThread.__init__(self)
self.url = url

def run(self):
try:
r = requests.get(self.url)
self.result.emit(r.json())
except Exception as e:
self.text.emit({'error': str(e)})

class DownloadFile(QThread):

progress = pyqtSignal(int, int)
Expand Down
2 changes: 1 addition & 1 deletion ui/view.ui
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
</layout>
</item>
<item row="1" column="0">
<widget class="QTextBrowser" name="textBrowser"/>
<layout class="QGridLayout" name="gridLayout_2"/>
</item>
</layout>
</widget>
Expand Down
29 changes: 29 additions & 0 deletions web/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<!doctype html>
<html lang="en">
<meta charset="utf-8">
<head>
<link rel="stylesheet" type="text/css" href="markdown.css">
<script src="marked.js"></script>
<script src="qrc:/qtwebchannel/qwebchannel.js"></script>
</head>
<body>
<div id="placeholder"></div>
<script>
'use strict';

var placeholder = document.getElementById('placeholder');

var updateText = function(text) {
placeholder.innerHTML = marked(text);
}

new QWebChannel(qt.webChannelTransport,
function(channel) {
var content = channel.objects.content;
updateText(content.text);
content.textChanged.connect(updateText);
}
);
</script>
</body>
</html>
260 changes: 260 additions & 0 deletions web/markdown.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,260 @@
body{
margin: 0 auto;
font-family: Georgia, Palatino, serif;
color: #444444;
line-height: 1;
max-width: 960px;
padding: 30px;
}
h1, h2, h3, h4 {
color: #111111;
font-weight: 400;
}
h1, h2, h3, h4, h5, p {
margin-bottom: 24px;
padding: 0;
}
h1 {
font-size: 48px;
}
h2 {
font-size: 36px;
/* The bottom margin is small. It's designed to be used with gray meta text
* below a post title. */
margin: 24px 0 6px;
}
h3 {
font-size: 24px;
}
h4 {
font-size: 21px;
}
h5 {
font-size: 18px;
}
a {
color: #0099ff;
margin: 0;
padding: 0;
vertical-align: baseline;
}
a:hover {
text-decoration: none;
color: #ff6600;
}
a:visited {
color: purple;
}
ul, ol {
padding: 0;
margin: 0;
}
li {
line-height: 24px;
}
li ul, li ul {
margin-left: 24px;
}
p, ul, ol {
font-size: 16px;
line-height: 24px;
max-width: 540px;
}
pre {
padding: 0px 24px;
max-width: 800px;
white-space: pre-wrap;
}
code {
font-family: Consolas, Monaco, Andale Mono, monospace;
line-height: 1.5;
font-size: 13px;
}
aside {
display: block;
float: right;
width: 390px;
}
blockquote {
border-left:.5em solid #eee;
padding: 0 2em;
margin-left:0;
max-width: 476px;
}
blockquote cite {
font-size:14px;
line-height:20px;
color:#bfbfbf;
}
blockquote cite:before {
content: '\2014 \00A0';
}

blockquote p {
color: #666;
max-width: 460px;
}
hr {
width: 540px;
text-align: left;
margin: 0 auto 0 0;
color: #999;
}

/* Code below this line is copyright Twitter Inc. */

button,
input,
select,
textarea {
font-size: 100%;
margin: 0;
vertical-align: baseline;
*vertical-align: middle;
}
button, input {
line-height: normal;
*overflow: visible;
}
button::-moz-focus-inner, input::-moz-focus-inner {
border: 0;
padding: 0;
}
button,
input[type="button"],
input[type="reset"],
input[type="submit"] {
cursor: pointer;
-webkit-appearance: button;
}
input[type=checkbox], input[type=radio] {
cursor: pointer;
}
/* override default chrome & firefox settings */
input:not([type="image"]), textarea {
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
}

input[type="search"] {
-webkit-appearance: textfield;
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
label,
input,
select,
textarea {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 13px;
font-weight: normal;
line-height: normal;
margin-bottom: 18px;
}
input[type=checkbox], input[type=radio] {
cursor: pointer;
margin-bottom: 0;
}
input[type=text],
input[type=password],
textarea,
select {
display: inline-block;
width: 210px;
padding: 4px;
font-size: 13px;
font-weight: normal;
line-height: 18px;
height: 18px;
color: #808080;
border: 1px solid #ccc;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
select, input[type=file] {
height: 27px;
line-height: 27px;
}
textarea {
height: auto;
}

/* grey out placeholders */
:-moz-placeholder {
color: #bfbfbf;
}
::-webkit-input-placeholder {
color: #bfbfbf;
}

input[type=text],
input[type=password],
select,
textarea {
-webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
-moz-transition: border linear 0.2s, box-shadow linear 0.2s;
transition: border linear 0.2s, box-shadow linear 0.2s;
-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
}
input[type=text]:focus, input[type=password]:focus, textarea:focus {
outline: none;
border-color: rgba(82, 168, 236, 0.8);
-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
}

/* buttons */
button {
display: inline-block;
padding: 4px 14px;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 13px;
line-height: 18px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
background-color: #0064cd;
background-repeat: repeat-x;
background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));
background-image: -moz-linear-gradient(top, #049cdb, #0064cd);
background-image: -ms-linear-gradient(top, #049cdb, #0064cd);
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));
background-image: -webkit-linear-gradient(top, #049cdb, #0064cd);
background-image: -o-linear-gradient(top, #049cdb, #0064cd);
background-image: linear-gradient(top, #049cdb, #0064cd);
color: #fff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
border: 1px solid #004b9a;
border-bottom-color: #003f81;
-webkit-transition: 0.1s linear all;
-moz-transition: 0.1s linear all;
transition: 0.1s linear all;
border-color: #0064cd #0064cd #003f81;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
}
button:hover {
color: #fff;
background-position: 0 -15px;
text-decoration: none;
}
button:active {
-webkit-box-shadow: inset 0 3px 7px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-moz-box-shadow: inset 0 3px 7px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 3px 7px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
}
button::-moz-focus-inner {
padding: 0;
border: 0;
}
Loading

0 comments on commit 56e08ef

Please sign in to comment.