Edit book: In dark mode, make the preview panel also dark. Fixes #1888071 [[Enhancement] Make Editor file preview background color customizable](https://bugs.launchpad.net/calibre/+bug/1888071)

This commit is contained in:
Kovid Goyal 2020-07-29 23:10:23 +05:30
parent c11e2176f6
commit ff086a69bb
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 108 additions and 7 deletions

64
resources/dark_mode.css Normal file
View File

@ -0,0 +1,64 @@
/*
* dark_mode.css
* Copyright (C) 2020 Kovid Goyal
*
* Distributed under terms of the MIT license.
*/
::-webkit-scrollbar {
background: #2B2B2B;
width: 14px;
}
::-webkit-scrollbar-button {
background: #4B4B4B;
border: 1px solid #4B4B4B;
border-radius: 0;
height: 14px;
width: 14px;
}
::-webkit-scrollbar-thumb {
background: #666666;
border: 1px solid #959595;
border-radius: 2px;
}
::-webkit-scrollbar-thumb:hover {
background: #929292;
}
::-webkit-scrollbar-thumb:active {
background: #929292;
}
::-webkit-scrollbar-thumb:vertical {
min-height: 40px;
}
::-webkit-scrollbar-track {
background: #4B4B4B;
border: 2px solid #4B4B4B;
border-radius: 0;
}
::-webkit-scrollbar-track:hover {
background: #666666;
}
::-webkit-scrollbar-track:active {
background: #333333;
}
::-webkit-scrollbar-corner {
background: #999999;
}
::-webkit-scrollbar-button:vertical:start {
width: 14px;
height: 14px;
background-repeat: no-repeat;
background-position: center;
background-image: url(data:image/png;base64,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)
}
::-webkit-scrollbar-button:vertical:end {
width: 14px;
height: 14px;
background-repeat: no-repeat;
background-position: center;
background-image: url(data:image/png;base64,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)
}

View File

@ -9,23 +9,23 @@ from calibre.constants import dark_link_color
dark_link_color = QColor(dark_link_color)
dark_color = QColor(45,45,45)
dark_text_color = QColor('#eee')
def dark_palette():
p = QPalette()
dark_color = QColor(45,45,45)
disabled_color = QColor(127,127,127)
text_color = QColor('#eee')
p.setColor(p.Window, dark_color)
p.setColor(p.WindowText, text_color)
p.setColor(p.WindowText, dark_text_color)
p.setColor(p.Base, QColor(18,18,18))
p.setColor(p.AlternateBase, dark_color)
p.setColor(p.ToolTipBase, dark_color)
p.setColor(p.ToolTipText, text_color)
p.setColor(p.Text, text_color)
p.setColor(p.ToolTipText, dark_text_color)
p.setColor(p.Text, dark_text_color)
p.setColor(p.Disabled, p.Text, disabled_color)
p.setColor(p.Button, dark_color)
p.setColor(p.ButtonText, text_color)
p.setColor(p.ButtonText, dark_text_color)
p.setColor(p.Disabled, p.ButtonText, disabled_color)
p.setColor(p.BrightText, Qt.red)
p.setColor(p.Link, dark_link_color)

View File

@ -3,6 +3,7 @@
# License: GPLv3 Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
from __future__ import absolute_import, division, print_function, unicode_literals
import json
import textwrap
import time
from collections import defaultdict
@ -24,7 +25,8 @@ from calibre.constants import (
)
from calibre.ebooks.oeb.base import OEB_DOCS, XHTML_MIME, serialize
from calibre.ebooks.oeb.polish.parsing import parse
from calibre.gui2 import NO_URL_FORMATTING, error_dialog, open_url
from calibre.gui2 import NO_URL_FORMATTING, error_dialog, is_dark_theme, open_url
from calibre.gui2.palette import dark_color, dark_text_color
from calibre.gui2.tweak_book import TOP, actions, current_container, editors, tprefs
from calibre.gui2.tweak_book.file_list import OpenWithHandler
from calibre.gui2.viewer.web_view import handle_mathjax_request, send_reply
@ -243,10 +245,37 @@ def create_profile():
compile_editor()
js = P('editor.js', data=True, allow_user_override=False)
cparser = P('csscolorparser.js', data=True, allow_user_override=False)
dark_mode_css = P('dark_mode.css', data=True, allow_user_override=False).decode('utf-8')
insert_scripts(ans,
create_script('csscolorparser.js', cparser),
create_script('editor.js', js),
create_script('dark-mode.js', '''
(function() {if (%s) {
var dark_bg = "%s", dark_fg = "%s", css = %s;
function apply_css() {
var style = document.createElement('style');
style.textContent = css;
document.documentElement.appendChild(style);
}
function apply_dark_mode(event) {
if (document.documentElement) {
document.documentElement.style.backgroundColor = dark_bg;
document.documentElement.style.color = dark_fg;
}
if (document.body) {
document.body.style.backgroundColor = dark_bg;
document.body.style.color = dark_fg;
}
}
apply_css();
apply_dark_mode();
document.addEventListener("DOMContentLoaded", apply_dark_mode);
} })();
''' % (
'true' if is_dark_theme() else 'false', dark_color.name(), dark_text_color.name(), json.dumps(dark_mode_css)),
injection_point=QWebEngineScript.DocumentCreation)
)
url_handler = UrlSchemeHandler(ans)
ans.installUrlSchemeHandler(QByteArray(FAKE_PROTOCOL.encode('ascii')), url_handler)
@ -443,7 +472,9 @@ class Preview(QWidget):
self.view._page.bridge.request_sync.connect(self.request_sync)
self.view._page.bridge.request_split.connect(self.request_split)
self.view._page.bridge.live_css_data.connect(self.live_css_data)
self.view._page.bridge.bridge_ready.connect(self.on_bridge_ready)
self.view._page.loadFinished.connect(self.load_finished)
self.view._page.loadStarted.connect(self.load_started)
self.view.render_process_restarted.connect(self.render_process_restarted)
self.pending_go_to_anchor = None
self.inspector = self.view.inspector
@ -649,6 +680,12 @@ class Preview(QWidget):
def stop_split(self):
actions['split-in-preview'].setChecked(False)
def load_started(self):
pass
def on_bridge_ready(self):
pass
def load_finished(self, ok):
if self.pending_go_to_anchor:
self.view._page.go_to_anchor(self.pending_go_to_anchor)