Merge pull request #1386 from siddhantdixit/theme-option

Added user theme preference option in Settings
This commit is contained in:
Micah Lee 2021-08-20 11:48:03 -07:00 committed by GitHub
commit b777d877bb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 108 additions and 8 deletions

View File

@ -110,6 +110,7 @@ class Settings(object):
"tor_bridges_use_custom_bridges": "", "tor_bridges_use_custom_bridges": "",
"persistent_tabs": [], "persistent_tabs": [],
"locale": None, # this gets defined in fill_in_defaults() "locale": None, # this gets defined in fill_in_defaults()
"theme": 0
} }
self._settings = {} self._settings = {}
self.fill_in_defaults() self.fill_in_defaults()

View File

@ -34,6 +34,7 @@ class TestSettings:
"tor_bridges_use_meek_lite_azure": False, "tor_bridges_use_meek_lite_azure": False,
"tor_bridges_use_custom_bridges": "", "tor_bridges_use_custom_bridges": "",
"persistent_tabs": [], "persistent_tabs": [],
"theme":0
} }
for key in settings_obj._settings: for key in settings_obj._settings:
# Skip locale, it will not always default to the same thing # Skip locale, it will not always default to the same thing

View File

@ -28,7 +28,11 @@ import psutil
import getpass import getpass
from PySide2 import QtCore, QtWidgets, QtGui from PySide2 import QtCore, QtWidgets, QtGui
from PySide2.QtCore import Slot,Qt
from PySide2.QtGui import QPalette, QColor
from onionshare_cli.common import Common from onionshare_cli.common import Common
from onionshare_cli.settings import Settings
from .gui_common import GuiCommon from .gui_common import GuiCommon
from .widgets import Alert from .widgets import Alert
@ -47,7 +51,12 @@ class Application(QtWidgets.QApplication):
QtWidgets.QApplication.__init__(self, sys.argv) QtWidgets.QApplication.__init__(self, sys.argv)
# Check color mode on starting the app # Check color mode on starting the app
self.color_mode = self.get_color_mode() self.color_mode = self.get_color_mode(common)
# Enable Dark Theme
if self.color_mode == "dark":
self.setDarkMode()
self.installEventFilter(self) self.installEventFilter(self)
def eventFilter(self, obj, event): def eventFilter(self, obj, event):
@ -65,9 +74,36 @@ class Application(QtWidgets.QApplication):
return False return False
return True return True
def get_color_mode(self): def setDarkMode(self):
return "dark" if self.is_dark_mode() else "light" self.setStyle("Fusion")
dark_palette = QPalette()
dark_palette.setColor(QPalette.Window, QColor(53, 53, 53))
dark_palette.setColor(QPalette.WindowText, Qt.white)
dark_palette.setColor(QPalette.Base, QColor(25, 25, 25))
dark_palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53))
dark_palette.setColor(QPalette.ToolTipBase, Qt.white)
dark_palette.setColor(QPalette.ToolTipText, Qt.white)
dark_palette.setColor(QPalette.Text, Qt.white)
dark_palette.setColor(QPalette.Button, QColor(53, 53, 53))
dark_palette.setColor(QPalette.ButtonText, Qt.white)
dark_palette.setColor(QPalette.BrightText, Qt.red)
dark_palette.setColor(QPalette.Link, QColor(42, 130, 218))
dark_palette.setColor(QPalette.Highlight, QColor(42, 130, 218))
dark_palette.setColor(QPalette.HighlightedText, Qt.black)
self.setPalette(dark_palette)
self.setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }")
def get_color_mode(self, common):
curr_settings = Settings(common)
curr_settings.load()
current_theme = curr_settings.get("theme")
if current_theme == 1:
return "light"
elif current_theme == 2:
return "dark"
else:
return "dark" if self.is_dark_mode() else "light"
def main(): def main():
""" """

View File

@ -87,6 +87,12 @@ class GuiCommon:
new_tab_button_background = "#ffffff" new_tab_button_background = "#ffffff"
new_tab_button_border = "#efeff0" new_tab_button_border = "#efeff0"
new_tab_button_text_color = "#4e0d4e" new_tab_button_text_color = "#4e0d4e"
downloads_uploads_progress_bar_border_color = "#4E064F"
downloads_uploads_progress_bar_chunk_color = "#4E064F"
share_zip_progess_bar_border_color = "#4E064F"
share_zip_progess_bar_chunk_color = "#4E064F"
history_background_color = "#ffffff"
history_label_color = "#000000"
if color_mode == "dark": if color_mode == "dark":
header_color = "#F2F2F2" header_color = "#F2F2F2"
title_color = "#F2F2F2" title_color = "#F2F2F2"
@ -94,6 +100,9 @@ class GuiCommon:
new_tab_button_background = "#5F5F5F" new_tab_button_background = "#5F5F5F"
new_tab_button_border = "#878787" new_tab_button_border = "#878787"
new_tab_button_text_color = "#FFFFFF" new_tab_button_text_color = "#FFFFFF"
share_zip_progess_bar_border_color = "#F2F2F2"
history_background_color = "#191919"
history_label_color = "#ffffff"
return { return {
# OnionShareGui styles # OnionShareGui styles
@ -193,9 +202,17 @@ class GuiCommon:
border: 0; border: 0;
border-radius: 5px; border-radius: 5px;
}""", }""",
"downloads_uploads_not_empty": """
QWidget{
background-color: """
+ history_background_color
+""";
}""",
"downloads_uploads_empty": """ "downloads_uploads_empty": """
QWidget { QWidget {
background-color: #ffffff; background-color: """
+ history_background_color
+""";
border: 1px solid #999999; border: 1px solid #999999;
} }
QWidget QLabel { QWidget QLabel {
@ -233,7 +250,7 @@ class GuiCommon:
"downloads_uploads_progress_bar": """ "downloads_uploads_progress_bar": """
QProgressBar { QProgressBar {
border: 1px solid """ border: 1px solid """
+ header_color + downloads_uploads_progress_bar_border_color
+ """; + """;
background-color: #ffffff !important; background-color: #ffffff !important;
text-align: center; text-align: center;
@ -242,10 +259,16 @@ class GuiCommon:
} }
QProgressBar::chunk { QProgressBar::chunk {
background-color: """ background-color: """
+ header_color + downloads_uploads_progress_bar_chunk_color
+ """; + """;
width: 10px; width: 10px;
}""", }""",
"history_default_label" : """
QLabel {
color: """
+ history_label_color
+ """;
}""",
"history_individual_file_timestamp_label": """ "history_individual_file_timestamp_label": """
QLabel { QLabel {
color: #666666; color: #666666;
@ -298,7 +321,7 @@ class GuiCommon:
"share_zip_progess_bar": """ "share_zip_progess_bar": """
QProgressBar { QProgressBar {
border: 1px solid """ border: 1px solid """
+ header_color + share_zip_progess_bar_border_color
+ """; + """;
background-color: #ffffff !important; background-color: #ffffff !important;
text-align: center; text-align: center;
@ -307,7 +330,7 @@ class GuiCommon:
QProgressBar::chunk { QProgressBar::chunk {
border: 0px; border: 0px;
background-color: """ background-color: """
+ header_color + share_zip_progess_bar_chunk_color
+ """; + """;
width: 10px; width: 10px;
}""", }""",

View File

@ -115,6 +115,10 @@
"gui_receive_mode_warning": "Receive mode lets people upload files to your computer.<br><br><b>Some files can potentially take control of your computer if you open them. Only open things from people you trust, or if you know what you are doing.</b>", "gui_receive_mode_warning": "Receive mode lets people upload files to your computer.<br><br><b>Some files can potentially take control of your computer if you open them. Only open things from people you trust, or if you know what you are doing.</b>",
"gui_open_folder_error": "Failed to open folder with xdg-open. The file is here: {}", "gui_open_folder_error": "Failed to open folder with xdg-open. The file is here: {}",
"gui_settings_language_label": "Preferred language", "gui_settings_language_label": "Preferred language",
"gui_settings_theme_label": "Theme",
"gui_settings_theme_auto": "Auto",
"gui_settings_theme_light": "Light",
"gui_settings_theme_dark": "Dark",
"gui_settings_language_changed_notice": "Restart OnionShare for the new language to be applied.", "gui_settings_language_changed_notice": "Restart OnionShare for the new language to be applied.",
"gui_color_mode_changed_notice": "Restart OnionShare for the new color mode to be applied.", "gui_color_mode_changed_notice": "Restart OnionShare for the new color mode to be applied.",
"systray_menu_exit": "Quit", "systray_menu_exit": "Quit",

View File

@ -19,6 +19,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
""" """
from PySide2 import QtCore, QtWidgets, QtGui from PySide2 import QtCore, QtWidgets, QtGui
from PySide2.QtCore import Slot,Qt
from PySide2.QtGui import QPalette, QColor
import sys import sys
import platform import platform
import datetime import datetime
@ -123,6 +125,20 @@ class SettingsDialog(QtWidgets.QDialog):
language_layout.addWidget(self.language_combobox) language_layout.addWidget(self.language_combobox)
language_layout.addStretch() language_layout.addStretch()
#Theme Settings
theme_label = QtWidgets.QLabel(strings._("gui_settings_theme_label"))
self.theme_combobox = QtWidgets.QComboBox()
theme_choices = [
strings._("gui_settings_theme_auto"),
strings._("gui_settings_theme_light"),
strings._("gui_settings_theme_dark")
]
self.theme_combobox.addItems(theme_choices)
theme_layout = QtWidgets.QHBoxLayout()
theme_layout.addWidget(theme_label)
theme_layout.addWidget(self.theme_combobox)
theme_layout.addStretch()
# Connection type: either automatic, control port, or socket file # Connection type: either automatic, control port, or socket file
# Bundled Tor # Bundled Tor
@ -451,6 +467,8 @@ class SettingsDialog(QtWidgets.QDialog):
layout.addSpacing(20) layout.addSpacing(20)
layout.addLayout(language_layout) layout.addLayout(language_layout)
layout.addSpacing(20) layout.addSpacing(20)
layout.addLayout(theme_layout)
layout.addSpacing(20)
layout.addStretch() layout.addStretch()
layout.addLayout(buttons_layout) layout.addLayout(buttons_layout)
@ -477,6 +495,9 @@ class SettingsDialog(QtWidgets.QDialog):
locale_index = self.language_combobox.findData(locale) locale_index = self.language_combobox.findData(locale)
self.language_combobox.setCurrentIndex(locale_index) self.language_combobox.setCurrentIndex(locale_index)
theme_choice = self.old_settings.get("theme")
self.theme_combobox.setCurrentIndex(theme_choice)
connection_type = self.old_settings.get("connection_type") connection_type = self.old_settings.get("connection_type")
if connection_type == "bundled": if connection_type == "bundled":
if self.connection_type_bundled_radio.isEnabled(): if self.connection_type_bundled_radio.isEnabled():
@ -822,6 +843,12 @@ class SettingsDialog(QtWidgets.QDialog):
notice = strings._("gui_settings_language_changed_notice") notice = strings._("gui_settings_language_changed_notice")
Alert(self.common, notice, QtWidgets.QMessageBox.Information) Alert(self.common, notice, QtWidgets.QMessageBox.Information)
# If color mode changed, inform user they need to restart OnionShare
if changed(settings, self.old_settings, ["theme"]):
notice = strings._("gui_color_mode_changed_notice")
Alert(self.common, notice, QtWidgets.QMessageBox.Information)
# Save the new settings # Save the new settings
settings.save() settings.save()
@ -931,6 +958,10 @@ class SettingsDialog(QtWidgets.QDialog):
settings = Settings(self.common) settings = Settings(self.common)
settings.load() # To get the last update timestamp settings.load() # To get the last update timestamp
# Theme
theme_index = self.theme_combobox.currentIndex()
settings.set("theme",theme_index)
# Language # Language
locale_index = self.language_combobox.currentIndex() locale_index = self.language_combobox.currentIndex()
locale = self.language_combobox.itemData(locale_index) locale = self.language_combobox.itemData(locale_index)

View File

@ -148,6 +148,7 @@ class ShareHistoryItem(HistoryItem):
# Change the label # Change the label
self.label.setText(self.get_finished_label_text(self.started_dt)) self.label.setText(self.get_finished_label_text(self.started_dt))
self.label.setStyleSheet(self.common.gui.css["history_default_label"])
self.status = HistoryItem.STATUS_FINISHED self.status = HistoryItem.STATUS_FINISHED
else: else:
@ -439,6 +440,7 @@ class ReceiveHistoryItem(HistoryItem):
# Change the label # Change the label
self.label.setText(self.get_finished_label_text(self.started)) self.label.setText(self.get_finished_label_text(self.started))
self.label.setStyleSheet(self.common.gui.css["history_default_label"])
elif data["action"] == "canceled": elif data["action"] == "canceled":
# Change the status # Change the status
@ -479,6 +481,7 @@ class IndividualFileHistoryItem(HistoryItem):
self.common.gui.css["history_individual_file_timestamp_label"] self.common.gui.css["history_individual_file_timestamp_label"]
) )
self.path_label = QtWidgets.QLabel(self.path) self.path_label = QtWidgets.QLabel(self.path)
self.path_label.setStyleSheet(self.common.gui.css["history_default_label"])
self.status_code_label = QtWidgets.QLabel() self.status_code_label = QtWidgets.QLabel()
# Progress bar # Progress bar
@ -711,6 +714,7 @@ class History(QtWidgets.QWidget):
self.not_empty_layout.addLayout(header_layout) self.not_empty_layout.addLayout(header_layout)
self.not_empty_layout.addWidget(self.item_list) self.not_empty_layout.addWidget(self.item_list)
self.not_empty = QtWidgets.QWidget() self.not_empty = QtWidgets.QWidget()
self.not_empty.setStyleSheet(self.common.gui.css["downloads_uploads_not_empty"])
self.not_empty.setLayout(self.not_empty_layout) self.not_empty.setLayout(self.not_empty_layout)
# Layout # Layout