From d78dd24291e34ebe847bb2f5d3794973e6c3dd5e Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Tue, 12 May 2020 21:51:57 +0200 Subject: [PATCH 1/7] Some minor fixes, add qApp info, and a PNG app icon --- nw/__init__.py | 3 +++ nw/assets/icons/novelWriter.png | Bin 0 -> 32303 bytes nw/gui/elements/doctree.py | 4 ++-- nw/gui/elements/searchbar.py | 4 ++-- 4 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 nw/assets/icons/novelWriter.png diff --git a/nw/__init__.py b/nw/__init__.py index 3330c6b6..332b7009 100644 --- a/nw/__init__.py +++ b/nw/__init__.py @@ -31,6 +31,7 @@ import logging from os import path, remove, rename +from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QApplication from nw.guimain import GuiMain @@ -225,6 +226,8 @@ def main(sysArgs=None): nwApp = QApplication([__package__,("-style=%s" % qtStyle)]) nwApp.setApplicationName(__package__) nwApp.setApplicationVersion(__version__) + nwApp.setWindowIcon(QIcon(CONFIG.appIcon)) + nwApp.setOrganizationDomain("novelwriter.io") nwGUI = GuiMain() sys.exit(nwApp.exec_()) diff --git a/nw/assets/icons/novelWriter.png b/nw/assets/icons/novelWriter.png new file mode 100644 index 0000000000000000000000000000000000000000..4543f575787d5034bd4a80e8ae21a2298a8646fb GIT binary patch literal 32303 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 literal 0 HcmV?d00001 diff --git a/nw/gui/elements/doctree.py b/nw/gui/elements/doctree.py index 92a006de..e67bd1b6 100644 --- a/nw/gui/elements/doctree.py +++ b/nw/gui/elements/doctree.py @@ -31,7 +31,7 @@ import nw from PyQt5.QtCore import Qt, QSize from PyQt5.QtGui import QFont, QColor from PyQt5.QtWidgets import ( - QTreeWidget, QTreeWidgetItem, QAbstractItemView, QApplication, QMessageBox + qApp, QTreeWidget, QTreeWidgetItem, QAbstractItemView, QMessageBox ) from nw.core import NWDoc @@ -207,7 +207,7 @@ class GuiDocTree(QTreeWidget): """Move an item up or down in the tree, but only if the treeView has focus. This also applies when the menu is used. """ - if QApplication.focusWidget() == self and self.theParent.hasProject: + if qApp.focusWidget() == self and self.theParent.hasProject: tHandle = self.getSelectedHandle() tItem = self._getTreeItem(tHandle) pItem = tItem.parent() diff --git a/nw/gui/elements/searchbar.py b/nw/gui/elements/searchbar.py index 68518d8d..ad9f9e81 100644 --- a/nw/gui/elements/searchbar.py +++ b/nw/gui/elements/searchbar.py @@ -30,7 +30,7 @@ import nw from PyQt5.QtCore import Qt from PyQt5.QtWidgets import ( - QFrame, QGridLayout, QLabel, QLineEdit, QPushButton, QApplication + qApp, QFrame, QGridLayout, QLabel, QLineEdit, QPushButton ) from nw.constants import nwDocAction @@ -127,7 +127,7 @@ class GuiSearchBar(QFrame): return def _doSearch(self): - modKey = QApplication.keyboardModifiers() + modKey = qApp.keyboardModifiers() if modKey == Qt.ShiftModifier: self.theParent.docEditor.docAction(nwDocAction.GO_PREV) else: From 405ef4823757246415287b7f390b89622a33ab4f Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Wed, 13 May 2020 19:45:00 +0200 Subject: [PATCH 2/7] Updated the license text file in assets --- nw/assets/graphics/license.txt | 8 -------- nw/assets/license.txt | 12 ++++++++++++ 2 files changed, 12 insertions(+), 8 deletions(-) delete mode 100644 nw/assets/graphics/license.txt create mode 100644 nw/assets/license.txt diff --git a/nw/assets/graphics/license.txt b/nw/assets/graphics/license.txt deleted file mode 100644 index 8a822fd2..00000000 --- a/nw/assets/graphics/license.txt +++ /dev/null @@ -1,8 +0,0 @@ -FROM ICON SET: Typicons -LICENSE: Creative Commons (Attribution-Share Alike 3.0 Unported) -https://creativecommons.org/licenses/by-sa/3.0/ - -Apllies to: -export.svg -merge.svg -split.svg diff --git a/nw/assets/license.txt b/nw/assets/license.txt new file mode 100644 index 00000000..1330c631 --- /dev/null +++ b/nw/assets/license.txt @@ -0,0 +1,12 @@ +FROM ICON SET: Typicons +LICENSE: Creative Commons (Attribution-Share Alike 3.0 Unported) +https://creativecommons.org/licenses/by-sa/3.0/ + +Applies to: + * graphics/export.svg + * graphics/merge.svg + * graphics/split.svg + * icons/globe-dark.svg + * icons/globe.svg + * icons/time-dark.svg + * icons/time.svg From e865e5b4482cebbdb9dfd5af959a48c283a3d140 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Wed, 13 May 2020 23:23:13 +0200 Subject: [PATCH 3/7] Added support for icon themes in the source. Still need to add it to preferences. --- nw/assets/{ => graphics}/license.txt | 4 - nw/assets/icons/globe-dark.svg | 56 ------ nw/assets/icons/globe.svg | 56 ------ nw/assets/icons/typicons_grey_dark/README.md | 17 ++ .../icons/typicons_grey_dark/backspace.svg | 56 ++++++ nw/assets/icons/typicons_grey_dark/book.svg | 56 ++++++ nw/assets/icons/typicons_grey_dark/cancel.svg | 56 ++++++ nw/assets/icons/typicons_grey_dark/delete.svg | 56 ++++++ .../typicons_grey_dark/document-text.svg | 61 ++++++ .../icons/typicons_grey_dark/download.svg | 55 ++++++ nw/assets/icons/typicons_grey_dark/flag.svg | 56 ++++++ nw/assets/icons/typicons_grey_dark/folder.svg | 56 ++++++ nw/assets/icons/typicons_grey_dark/globe.svg | 57 ++++++ .../icons/typicons_grey_dark/globe_max.svg | 57 ++++++ nw/assets/icons/typicons_grey_dark/icons.conf | 37 ++++ .../typicons_grey_dark/input-checked.svg | 56 ++++++ nw/assets/icons/typicons_grey_dark/key.svg | 56 ++++++ .../icons/typicons_grey_dark/location.svg | 56 ++++++ nw/assets/icons/typicons_grey_dark/minus.svg | 56 ++++++ nw/assets/icons/typicons_grey_dark/pencil.svg | 55 ++++++ nw/assets/icons/typicons_grey_dark/plus.svg | 56 ++++++ nw/assets/icons/typicons_grey_dark/puzzle.svg | 56 ++++++ .../typicons_grey_dark/search-replace.svg | 60 ++++++ nw/assets/icons/typicons_grey_dark/search.svg | 58 ++++++ nw/assets/icons/typicons_grey_dark/star.svg | 56 ++++++ .../stopwatch.svg} | 43 ++-- .../stopwatch_max.svg} | 47 ++--- nw/assets/icons/typicons_grey_dark/time.svg | 56 ++++++ nw/assets/icons/typicons_grey_dark/times.svg | 56 ++++++ nw/assets/icons/typicons_grey_dark/trash.svg | 56 ++++++ nw/assets/icons/typicons_grey_dark/user.svg | 56 ++++++ nw/assets/icons/typicons_grey_light/README.md | 17 ++ .../icons/typicons_grey_light/backspace.svg | 55 ++++++ nw/assets/icons/typicons_grey_light/book.svg | 55 ++++++ .../icons/typicons_grey_light/cancel.svg | 55 ++++++ .../icons/typicons_grey_light/delete.svg | 55 ++++++ .../typicons_grey_light/document-text.svg | 60 ++++++ .../icons/typicons_grey_light/download.svg | 54 +++++ nw/assets/icons/typicons_grey_light/flag.svg | 55 ++++++ .../icons/typicons_grey_light/folder.svg | 55 ++++++ nw/assets/icons/typicons_grey_light/globe.svg | 57 ++++++ .../icons/typicons_grey_light/globe_max.svg | 56 ++++++ .../icons/typicons_grey_light/icons.conf | 37 ++++ .../typicons_grey_light/input-checked.svg | 55 ++++++ nw/assets/icons/typicons_grey_light/key.svg | 55 ++++++ .../icons/typicons_grey_light/location.svg | 55 ++++++ nw/assets/icons/typicons_grey_light/minus.svg | 55 ++++++ .../icons/typicons_grey_light/pencil.svg | 54 +++++ nw/assets/icons/typicons_grey_light/plus.svg | 55 ++++++ .../icons/typicons_grey_light/puzzle.svg | 55 ++++++ .../typicons_grey_light/search-replace.svg | 60 ++++++ .../icons/typicons_grey_light/search.svg | 58 ++++++ nw/assets/icons/typicons_grey_light/star.svg | 55 ++++++ .../icons/typicons_grey_light/stopwatch.svg | 61 ++++++ .../typicons_grey_light/stopwatch_max.svg | 61 ++++++ nw/assets/icons/typicons_grey_light/time.svg | 55 ++++++ nw/assets/icons/typicons_grey_light/times.svg | 55 ++++++ nw/assets/icons/typicons_grey_light/trash.svg | 55 ++++++ nw/assets/icons/typicons_grey_light/user.svg | 55 ++++++ nw/config.py | 1 + nw/constants/constants.py | 12 ++ nw/gui/dialogs/configeditor.py | 2 +- nw/gui/dialogs/projecteditor.py | 2 +- nw/gui/elements/doctree.py | 11 +- nw/gui/elements/searchbar.py | 2 +- nw/gui/icons.py | 184 +++++++++++------- nw/gui/statusbar.py | 4 +- nw/gui/theme.py | 3 +- nw/guimain.py | 12 +- 69 files changed, 3114 insertions(+), 244 deletions(-) rename nw/assets/{ => graphics}/license.txt (72%) delete mode 100644 nw/assets/icons/globe-dark.svg delete mode 100644 nw/assets/icons/globe.svg create mode 100644 nw/assets/icons/typicons_grey_dark/README.md create mode 100644 nw/assets/icons/typicons_grey_dark/backspace.svg create mode 100644 nw/assets/icons/typicons_grey_dark/book.svg create mode 100644 nw/assets/icons/typicons_grey_dark/cancel.svg create mode 100644 nw/assets/icons/typicons_grey_dark/delete.svg create mode 100644 nw/assets/icons/typicons_grey_dark/document-text.svg create mode 100644 nw/assets/icons/typicons_grey_dark/download.svg create mode 100644 nw/assets/icons/typicons_grey_dark/flag.svg create mode 100644 nw/assets/icons/typicons_grey_dark/folder.svg create mode 100644 nw/assets/icons/typicons_grey_dark/globe.svg create mode 100644 nw/assets/icons/typicons_grey_dark/globe_max.svg create mode 100644 nw/assets/icons/typicons_grey_dark/icons.conf create mode 100644 nw/assets/icons/typicons_grey_dark/input-checked.svg create mode 100644 nw/assets/icons/typicons_grey_dark/key.svg create mode 100644 nw/assets/icons/typicons_grey_dark/location.svg create mode 100644 nw/assets/icons/typicons_grey_dark/minus.svg create mode 100644 nw/assets/icons/typicons_grey_dark/pencil.svg create mode 100644 nw/assets/icons/typicons_grey_dark/plus.svg create mode 100644 nw/assets/icons/typicons_grey_dark/puzzle.svg create mode 100644 nw/assets/icons/typicons_grey_dark/search-replace.svg create mode 100644 nw/assets/icons/typicons_grey_dark/search.svg create mode 100644 nw/assets/icons/typicons_grey_dark/star.svg rename nw/assets/icons/{time-dark.svg => typicons_grey_dark/stopwatch.svg} (76%) rename nw/assets/icons/{time.svg => typicons_grey_dark/stopwatch_max.svg} (72%) create mode 100644 nw/assets/icons/typicons_grey_dark/time.svg create mode 100644 nw/assets/icons/typicons_grey_dark/times.svg create mode 100644 nw/assets/icons/typicons_grey_dark/trash.svg create mode 100644 nw/assets/icons/typicons_grey_dark/user.svg create mode 100644 nw/assets/icons/typicons_grey_light/README.md create mode 100644 nw/assets/icons/typicons_grey_light/backspace.svg create mode 100644 nw/assets/icons/typicons_grey_light/book.svg create mode 100644 nw/assets/icons/typicons_grey_light/cancel.svg create mode 100644 nw/assets/icons/typicons_grey_light/delete.svg create mode 100644 nw/assets/icons/typicons_grey_light/document-text.svg create mode 100644 nw/assets/icons/typicons_grey_light/download.svg create mode 100644 nw/assets/icons/typicons_grey_light/flag.svg create mode 100644 nw/assets/icons/typicons_grey_light/folder.svg create mode 100644 nw/assets/icons/typicons_grey_light/globe.svg create mode 100644 nw/assets/icons/typicons_grey_light/globe_max.svg create mode 100644 nw/assets/icons/typicons_grey_light/icons.conf create mode 100644 nw/assets/icons/typicons_grey_light/input-checked.svg create mode 100644 nw/assets/icons/typicons_grey_light/key.svg create mode 100644 nw/assets/icons/typicons_grey_light/location.svg create mode 100644 nw/assets/icons/typicons_grey_light/minus.svg create mode 100644 nw/assets/icons/typicons_grey_light/pencil.svg create mode 100644 nw/assets/icons/typicons_grey_light/plus.svg create mode 100644 nw/assets/icons/typicons_grey_light/puzzle.svg create mode 100644 nw/assets/icons/typicons_grey_light/search-replace.svg create mode 100644 nw/assets/icons/typicons_grey_light/search.svg create mode 100644 nw/assets/icons/typicons_grey_light/star.svg create mode 100644 nw/assets/icons/typicons_grey_light/stopwatch.svg create mode 100644 nw/assets/icons/typicons_grey_light/stopwatch_max.svg create mode 100644 nw/assets/icons/typicons_grey_light/time.svg create mode 100644 nw/assets/icons/typicons_grey_light/times.svg create mode 100644 nw/assets/icons/typicons_grey_light/trash.svg create mode 100644 nw/assets/icons/typicons_grey_light/user.svg diff --git a/nw/assets/license.txt b/nw/assets/graphics/license.txt similarity index 72% rename from nw/assets/license.txt rename to nw/assets/graphics/license.txt index 1330c631..00a23f87 100644 --- a/nw/assets/license.txt +++ b/nw/assets/graphics/license.txt @@ -6,7 +6,3 @@ Applies to: * graphics/export.svg * graphics/merge.svg * graphics/split.svg - * icons/globe-dark.svg - * icons/globe.svg - * icons/time-dark.svg - * icons/time.svg diff --git a/nw/assets/icons/globe-dark.svg b/nw/assets/icons/globe-dark.svg deleted file mode 100644 index bde909f3..00000000 --- a/nw/assets/icons/globe-dark.svg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - diff --git a/nw/assets/icons/globe.svg b/nw/assets/icons/globe.svg deleted file mode 100644 index ef97e998..00000000 --- a/nw/assets/icons/globe.svg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - diff --git a/nw/assets/icons/typicons_grey_dark/README.md b/nw/assets/icons/typicons_grey_dark/README.md new file mode 100644 index 00000000..3686b78d --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/README.md @@ -0,0 +1,17 @@ +Typicons +---- + +Source: https://github.com/stephenhutchings/typicons.font + +License +------- + +#### Icons/Artwork + +Distributed under +[CC BY-SA](http://creativecommons.org/licenses/by-sa/3.0/) licence. + +#### Font + +Distributed under +[SIL Open Font Licence](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web) licence. diff --git a/nw/assets/icons/typicons_grey_dark/backspace.svg b/nw/assets/icons/typicons_grey_dark/backspace.svg new file mode 100644 index 00000000..7fd677bc --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/backspace.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/book.svg b/nw/assets/icons/typicons_grey_dark/book.svg new file mode 100644 index 00000000..3b576f27 --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/book.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/cancel.svg b/nw/assets/icons/typicons_grey_dark/cancel.svg new file mode 100644 index 00000000..6d718a07 --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/cancel.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/delete.svg b/nw/assets/icons/typicons_grey_dark/delete.svg new file mode 100644 index 00000000..560666dd --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/delete.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/document-text.svg b/nw/assets/icons/typicons_grey_dark/document-text.svg new file mode 100644 index 00000000..e67fb843 --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/document-text.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/download.svg b/nw/assets/icons/typicons_grey_dark/download.svg new file mode 100644 index 00000000..7dfffc01 --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/download.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/flag.svg b/nw/assets/icons/typicons_grey_dark/flag.svg new file mode 100644 index 00000000..475d7415 --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/flag.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/folder.svg b/nw/assets/icons/typicons_grey_dark/folder.svg new file mode 100644 index 00000000..1050ce57 --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/folder.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/globe.svg b/nw/assets/icons/typicons_grey_dark/globe.svg new file mode 100644 index 00000000..9394ebed --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/globe.svg @@ -0,0 +1,57 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/globe_max.svg b/nw/assets/icons/typicons_grey_dark/globe_max.svg new file mode 100644 index 00000000..8966c4c9 --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/globe_max.svg @@ -0,0 +1,57 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/icons.conf b/nw/assets/icons/typicons_grey_dark/icons.conf new file mode 100644 index 00000000..1cf3b306 --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/icons.conf @@ -0,0 +1,37 @@ +## +# Icons: Typicons Grey Dark +# Source: https://github.com/stephenhutchings/typicons.font +# Credit: Stephen Hutchings +## + +[Main] +name = Typicons Grey Dark +author = Stephen Hutchings +credit = Stephen Hutchings +url = https://github.com/stephenhutchings/typicons.font + +[Map] +cls_none = cancel.svg +cls_novel = book.svg +cls_plot = puzzle.svg +cls_character = user.svg +cls_world = location.svg +cls_timeline = time.svg +cls_object = key.svg +cls_entity = flag.svg +cls_custom = star.svg +cls_trash = trash.svg +proj_document = document-text.svg +proj_folder = folder.svg +status_lang = globe_max.svg +status_time = stopwatch_max.svg +delete = delete.svg +add = plus.svg +remove = minus.svg +close = times.svg +done = input-checked.svg +search = search.svg +search-replace = search-replace.svg +clear = backspace.svg +save = download.svg +edit = pencil.svg diff --git a/nw/assets/icons/typicons_grey_dark/input-checked.svg b/nw/assets/icons/typicons_grey_dark/input-checked.svg new file mode 100644 index 00000000..0bf72e27 --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/input-checked.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/key.svg b/nw/assets/icons/typicons_grey_dark/key.svg new file mode 100644 index 00000000..37d91a7a --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/key.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/location.svg b/nw/assets/icons/typicons_grey_dark/location.svg new file mode 100644 index 00000000..d429d0dd --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/location.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/minus.svg b/nw/assets/icons/typicons_grey_dark/minus.svg new file mode 100644 index 00000000..0cd0201c --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/minus.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/pencil.svg b/nw/assets/icons/typicons_grey_dark/pencil.svg new file mode 100644 index 00000000..bf1d0dab --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/pencil.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/plus.svg b/nw/assets/icons/typicons_grey_dark/plus.svg new file mode 100644 index 00000000..8b7f4a6d --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/plus.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/puzzle.svg b/nw/assets/icons/typicons_grey_dark/puzzle.svg new file mode 100644 index 00000000..719497cb --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/puzzle.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/search-replace.svg b/nw/assets/icons/typicons_grey_dark/search-replace.svg new file mode 100644 index 00000000..048de135 --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/search-replace.svg @@ -0,0 +1,60 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/search.svg b/nw/assets/icons/typicons_grey_dark/search.svg new file mode 100644 index 00000000..5ea743b8 --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/search.svg @@ -0,0 +1,58 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/star.svg b/nw/assets/icons/typicons_grey_dark/star.svg new file mode 100644 index 00000000..a750ffd5 --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/star.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/time-dark.svg b/nw/assets/icons/typicons_grey_dark/stopwatch.svg similarity index 76% rename from nw/assets/icons/time-dark.svg rename to nw/assets/icons/typicons_grey_dark/stopwatch.svg index bdb740c1..7fbbf0d7 100644 --- a/nw/assets/icons/time-dark.svg +++ b/nw/assets/icons/typicons_grey_dark/stopwatch.svg @@ -8,27 +8,28 @@ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.2" - width="21" - height="21" - viewBox="0 0 21 21" - id="svg1039" - sodipodi:docname="time-dark.svg" - inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> + width="24" + height="24" + viewBox="0 0 24 24" + id="svg7030" + sodipodi:docname="stopwatch.svg" + inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)"> + id="metadata7036"> image/svg+xml - + + id="defs7034" /> + inkscape:current-layer="svg7030" /> diff --git a/nw/assets/icons/time.svg b/nw/assets/icons/typicons_grey_dark/stopwatch_max.svg similarity index 72% rename from nw/assets/icons/time.svg rename to nw/assets/icons/typicons_grey_dark/stopwatch_max.svg index 920d9bd7..7d489bae 100644 --- a/nw/assets/icons/time.svg +++ b/nw/assets/icons/typicons_grey_dark/stopwatch_max.svg @@ -8,27 +8,28 @@ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.2" - width="21" - height="21" - viewBox="0 0 21 21" - id="svg1039" - sodipodi:docname="time.svg" - inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> + width="24" + height="24" + viewBox="0 0 24 24" + id="svg7030" + sodipodi:docname="stopwatch_max.svg" + inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)"> + id="metadata7036"> image/svg+xml - + + id="defs7034" /> + inkscape:current-layer="svg7030" /> + id="g7028" + transform="matrix(1.1428571,0,0,1.1428571,-1.7142852,-2.2857137)" + style="fill:#aeaeae;fill-opacity:1"> + style="fill:#aeaeae;fill-opacity:1" /> diff --git a/nw/assets/icons/typicons_grey_dark/time.svg b/nw/assets/icons/typicons_grey_dark/time.svg new file mode 100644 index 00000000..12f47768 --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/time.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/times.svg b/nw/assets/icons/typicons_grey_dark/times.svg new file mode 100644 index 00000000..64410dfb --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/times.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/trash.svg b/nw/assets/icons/typicons_grey_dark/trash.svg new file mode 100644 index 00000000..b7728f3e --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/trash.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_dark/user.svg b/nw/assets/icons/typicons_grey_dark/user.svg new file mode 100644 index 00000000..3b7cdf02 --- /dev/null +++ b/nw/assets/icons/typicons_grey_dark/user.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/README.md b/nw/assets/icons/typicons_grey_light/README.md new file mode 100644 index 00000000..3686b78d --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/README.md @@ -0,0 +1,17 @@ +Typicons +---- + +Source: https://github.com/stephenhutchings/typicons.font + +License +------- + +#### Icons/Artwork + +Distributed under +[CC BY-SA](http://creativecommons.org/licenses/by-sa/3.0/) licence. + +#### Font + +Distributed under +[SIL Open Font Licence](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web) licence. diff --git a/nw/assets/icons/typicons_grey_light/backspace.svg b/nw/assets/icons/typicons_grey_light/backspace.svg new file mode 100644 index 00000000..16008fc7 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/backspace.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/book.svg b/nw/assets/icons/typicons_grey_light/book.svg new file mode 100644 index 00000000..10e53ab5 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/book.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/cancel.svg b/nw/assets/icons/typicons_grey_light/cancel.svg new file mode 100644 index 00000000..43b5ced6 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/cancel.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/delete.svg b/nw/assets/icons/typicons_grey_light/delete.svg new file mode 100644 index 00000000..2983650a --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/delete.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/document-text.svg b/nw/assets/icons/typicons_grey_light/document-text.svg new file mode 100644 index 00000000..f4cbef49 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/document-text.svg @@ -0,0 +1,60 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/download.svg b/nw/assets/icons/typicons_grey_light/download.svg new file mode 100644 index 00000000..fa67f171 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/download.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/flag.svg b/nw/assets/icons/typicons_grey_light/flag.svg new file mode 100644 index 00000000..75d87698 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/flag.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/folder.svg b/nw/assets/icons/typicons_grey_light/folder.svg new file mode 100644 index 00000000..180e26de --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/folder.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/globe.svg b/nw/assets/icons/typicons_grey_light/globe.svg new file mode 100644 index 00000000..83c97666 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/globe.svg @@ -0,0 +1,57 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/globe_max.svg b/nw/assets/icons/typicons_grey_light/globe_max.svg new file mode 100644 index 00000000..255ac776 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/globe_max.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/icons.conf b/nw/assets/icons/typicons_grey_light/icons.conf new file mode 100644 index 00000000..6bd45209 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/icons.conf @@ -0,0 +1,37 @@ +## +# Icons: Typicons Grey Light +# Source: https://github.com/stephenhutchings/typicons.font +# Credit: Stephen Hutchings +## + +[Main] +name = Typicons Grey Light +author = Stephen Hutchings +credit = Stephen Hutchings +url = https://github.com/stephenhutchings/typicons.font + +[Map] +cls_none = cancel.svg +cls_novel = book.svg +cls_plot = puzzle.svg +cls_character = user.svg +cls_world = location.svg +cls_timeline = time.svg +cls_object = key.svg +cls_entity = flag.svg +cls_custom = star.svg +cls_trash = trash.svg +proj_document = document-text.svg +proj_folder = folder.svg +status_lang = globe_max.svg +status_time = stopwatch_max.svg +delete = delete.svg +add = plus.svg +remove = minus.svg +close = times.svg +done = input-checked.svg +search = search.svg +search-replace = search-replace.svg +clear = backspace.svg +save = download.svg +edit = pencil.svg diff --git a/nw/assets/icons/typicons_grey_light/input-checked.svg b/nw/assets/icons/typicons_grey_light/input-checked.svg new file mode 100644 index 00000000..ba650c23 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/input-checked.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/key.svg b/nw/assets/icons/typicons_grey_light/key.svg new file mode 100644 index 00000000..0a0f2a38 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/key.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/location.svg b/nw/assets/icons/typicons_grey_light/location.svg new file mode 100644 index 00000000..e5c361f7 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/location.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/minus.svg b/nw/assets/icons/typicons_grey_light/minus.svg new file mode 100644 index 00000000..77d38693 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/minus.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/pencil.svg b/nw/assets/icons/typicons_grey_light/pencil.svg new file mode 100644 index 00000000..1e51a280 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/pencil.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/plus.svg b/nw/assets/icons/typicons_grey_light/plus.svg new file mode 100644 index 00000000..56efaa2a --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/plus.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/puzzle.svg b/nw/assets/icons/typicons_grey_light/puzzle.svg new file mode 100644 index 00000000..29034bd3 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/puzzle.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/search-replace.svg b/nw/assets/icons/typicons_grey_light/search-replace.svg new file mode 100644 index 00000000..90597a8d --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/search-replace.svg @@ -0,0 +1,60 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/search.svg b/nw/assets/icons/typicons_grey_light/search.svg new file mode 100644 index 00000000..6ffb3f23 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/search.svg @@ -0,0 +1,58 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/star.svg b/nw/assets/icons/typicons_grey_light/star.svg new file mode 100644 index 00000000..1371ea80 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/star.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/stopwatch.svg b/nw/assets/icons/typicons_grey_light/stopwatch.svg new file mode 100644 index 00000000..df7327c0 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/stopwatch.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/stopwatch_max.svg b/nw/assets/icons/typicons_grey_light/stopwatch_max.svg new file mode 100644 index 00000000..129d58cf --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/stopwatch_max.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/time.svg b/nw/assets/icons/typicons_grey_light/time.svg new file mode 100644 index 00000000..9e47aa48 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/time.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/times.svg b/nw/assets/icons/typicons_grey_light/times.svg new file mode 100644 index 00000000..ff91c26a --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/times.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/trash.svg b/nw/assets/icons/typicons_grey_light/trash.svg new file mode 100644 index 00000000..98746b48 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/trash.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_grey_light/user.svg b/nw/assets/icons/typicons_grey_light/user.svg new file mode 100644 index 00000000..d950dd25 --- /dev/null +++ b/nw/assets/icons/typicons_grey_light/user.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/config.py b/nw/config.py index 4fb8278e..a9f4de3d 100644 --- a/nw/config.py +++ b/nw/config.py @@ -83,6 +83,7 @@ class Config: ## General self.guiTheme = "default" self.guiSyntax = "default_light" + self.guiIcons = "typicons_grey_light" self.guiDark = False ## Sizes diff --git a/nw/constants/constants.py b/nw/constants/constants.py index 33a6fc15..76bfc677 100644 --- a/nw/constants/constants.py +++ b/nw/constants/constants.py @@ -87,6 +87,18 @@ class nwLabels(): nwItemClass.CUSTOM : "X", nwItemClass.TRASH : "R", } + CLASS_ICON = { + nwItemClass.NO_CLASS : "cls_none", + nwItemClass.NOVEL : "cls_novel", + nwItemClass.PLOT : "cls_plot", + nwItemClass.CHARACTER : "cls_character", + nwItemClass.WORLD : "cls_world", + nwItemClass.TIMELINE : "cls_timeline", + nwItemClass.OBJECT : "cls_object", + nwItemClass.ENTITY : "cls_entity", + nwItemClass.CUSTOM : "cls_custom", + nwItemClass.TRASH : "cls_trash", + } LAYOUT_NAME = { nwItemLayout.NO_LAYOUT : "None", nwItemLayout.TITLE : "Title Page", diff --git a/nw/gui/dialogs/configeditor.py b/nw/gui/dialogs/configeditor.py index 581d7307..cb60a40e 100644 --- a/nw/gui/dialogs/configeditor.py +++ b/nw/gui/dialogs/configeditor.py @@ -238,7 +238,7 @@ class GuiConfigEditGeneralTab(QWidget): ## Backup Path self.backupPath = self.mainConf.backupPath - self.backupGetPath = QPushButton(self.theTheme.getIcon("folder"),"Select Folder") + self.backupGetPath = QPushButton(self.theTheme.getIcon("folder-open"),"Select Folder") self.backupGetPath.clicked.connect(self._backupFolder) self.backupPathRow = self.mainForm.addRow( "Backup storage location", diff --git a/nw/gui/dialogs/projecteditor.py b/nw/gui/dialogs/projecteditor.py index ffcd2516..afa5dbe5 100644 --- a/nw/gui/dialogs/projecteditor.py +++ b/nw/gui/dialogs/projecteditor.py @@ -360,7 +360,7 @@ class GuiProjectEditReplace(QWidget): self.editKey = QLineEdit() self.editValue = QLineEdit() - self.saveButton = QPushButton(self.theTheme.getIcon("save"),"") + self.saveButton = QPushButton(self.theTheme.getIcon("done"),"") self.addButton = QPushButton(self.theTheme.getIcon("add"),"") self.delButton = QPushButton(self.theTheme.getIcon("remove"),"") diff --git a/nw/gui/elements/doctree.py b/nw/gui/elements/doctree.py index e67bd1b6..a30fb856 100644 --- a/nw/gui/elements/doctree.py +++ b/nw/gui/elements/doctree.py @@ -511,6 +511,7 @@ class GuiDocTree(QTreeWidget): tHandle = nwItem.itemHandle pHandle = nwItem.parHandle + tClass = nwItem.itemClass newItem = QTreeWidgetItem([""]*4) newItem.setText(self.C_NAME, "") @@ -540,13 +541,13 @@ class GuiDocTree(QTreeWidget): newItem.setExpanded(nwItem.isExpanded) if nwItem.itemType == nwItemType.ROOT: - newItem.setIcon(self.C_NAME, self.theTheme.getIcon("root")) + newItem.setIcon(self.C_NAME, self.theTheme.getIcon(nwLabels.CLASS_ICON[tClass])) elif nwItem.itemType == nwItemType.FOLDER: - newItem.setIcon(self.C_NAME, self.theTheme.getIcon("folder")) + newItem.setIcon(self.C_NAME, self.theTheme.getIcon("proj_folder")) elif nwItem.itemType == nwItemType.FILE: - newItem.setIcon(self.C_NAME, self.theTheme.getIcon("document")) + newItem.setIcon(self.C_NAME, self.theTheme.getIcon("proj_document")) elif nwItem.itemType == nwItemType.TRASH: - newItem.setIcon(self.C_NAME, self.theTheme.getIcon("trash")) + newItem.setIcon(self.C_NAME, self.theTheme.getIcon(nwLabels.CLASS_ICON[tClass])) return newItem @@ -575,7 +576,7 @@ class GuiDocTree(QTreeWidget): self.addTopLevelItem(newItem) self.orphRoot = newItem newItem.setExpanded(True) - newItem.setIcon(self.C_NAME, self.theTheme.getIcon("orphan")) + newItem.setIcon(self.C_NAME, self.theTheme.getIcon("warning")) return def _cleanOrphanedRoot(self): diff --git a/nw/gui/elements/searchbar.py b/nw/gui/elements/searchbar.py index ad9f9e81..431bddad 100644 --- a/nw/gui/elements/searchbar.py +++ b/nw/gui/elements/searchbar.py @@ -60,7 +60,7 @@ class GuiSearchBar(QFrame): self.replaceLabel = QLabel("Replace") self.closeButton = QPushButton(self.theTheme.getIcon("close"),"") self.searchButton = QPushButton(self.theTheme.getIcon("search"),"") - self.replaceButton = QPushButton(self.theTheme.getIcon("replace"),"") + self.replaceButton = QPushButton(self.theTheme.getIcon("search-replace"),"") self.closeButton.clicked.connect(self._doClose) self.searchButton.clicked.connect(self._doSearch) diff --git a/nw/gui/icons.py b/nw/gui/icons.py index d74ae685..066d321e 100644 --- a/nw/gui/icons.py +++ b/nw/gui/icons.py @@ -26,6 +26,7 @@ """ import logging +import configparser import nw from os import path @@ -33,6 +34,7 @@ from os import path from PyQt5.QtCore import QSize from PyQt5.QtSvg import QSvgWidget from PyQt5.QtGui import QIcon, QPixmap +from PyQt5.QtWidgets import QStyle, qApp logger = logging.getLogger(__name__) @@ -44,19 +46,34 @@ class GuiIcons: # https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html # or, if there is no fallback, the variable should be None. ICON_MAP = { - "root" : "drive-harddisk", - "folder" : "folder", - "document" : "x-office-document", - "trash" : "user-trash", - "orphan" : "dialog-warning", - "save" : "document-save", - "add" : "list-add", - "remove" : "list-remove", - "close" : "edit-delete", - "search" : "edit-find", - "replace" : "edit-find-replace", - "time" : None, - "globe" : None, + "cls_none" : (QStyle.SP_DriveHDIcon, "drive-harddisk"), + "cls_novel" : (QStyle.SP_DriveHDIcon, "drive-harddisk"), + "cls_plot" : (QStyle.SP_DriveHDIcon, "drive-harddisk"), + "cls_character" : (QStyle.SP_DriveHDIcon, "drive-harddisk"), + "cls_world" : (QStyle.SP_DriveHDIcon, "drive-harddisk"), + "cls_timeline" : (QStyle.SP_DriveHDIcon, "drive-harddisk"), + "cls_object" : (QStyle.SP_DriveHDIcon, "drive-harddisk"), + "cls_entity" : (QStyle.SP_DriveHDIcon, "drive-harddisk"), + "cls_custom" : (QStyle.SP_DriveHDIcon, "drive-harddisk"), + "cls_trash" : (QStyle.SP_DriveHDIcon, "drive-harddisk"), + "proj_document" : (QStyle.SP_FileIcon, "x-office-document"), + "proj_folder" : (QStyle.SP_DirIcon, "folder"), + "status_lang" : (None, None), + "status_time" : (None, None), + ## Button Icons + "folder-open" : (QStyle.SP_DirOpenIcon, "folder-open"), + "delete" : (QStyle.SP_DialogDiscardButton, "edit-delete"), + "add" : (None, "list-add"), + "remove" : (None, "list-remove"), + "close" : (QStyle.SP_DialogCloseButton, "window-close"), + "done" : (QStyle.SP_DialogApplyButton, None), + "search" : (None, "edit-find"), + "search-replace" : (None, "edit-find-replace"), + "clear" : (QStyle.SP_LineEditClearButton, "clear_left"), + "save" : (QStyle.SP_DialogSaveButton, "document-save"), + "edit" : (None, None), + ## Other Icons + "warning" : (QStyle.SP_MessageBoxWarning, "dialog-warning"), } DECO_MAP = { @@ -73,28 +90,75 @@ class GuiIcons: self.theParent = theParent # Storage - self.qIcons = {} + self.qIcons = {} + self.themeMap = {} - # Look for files in - self.priPath = "" # The gui theme's icon folder - self.secPath = "" # The main assets icon folder - self.prefDark = False # Load dark icons, if available + # Icon Theme Path + self.iconPath = None + self.confFile = None + + # Icon Theme Meta + self.themeName = "" + self.themeAuthor = "" + self.themeCredit = "" + self.themeUrl = "" return - def initIcons(self, priPath): - """Load all icons listed in the icon map. Can be overridden by - the selected theme. - """ + ## + # Actions + ## - self.priPath = priPath - self.secPath = self.mainConf.iconPath - self.prefDark = self.mainConf.guiDark + def updateTheme(self): - for iconKey in self.ICON_MAP.keys(): - self.qIcons[iconKey] = self._loadIcon(iconKey) + logger.debug("Loading icon theme files") - return + self.themeMap = {} + checkPath = path.join(self.mainConf.iconPath, self.mainConf.guiIcons) + if path.isdir(checkPath): + logger.debug("Loading icon theme '%s'" % self.mainConf.guiIcons) + self.iconPath = checkPath + self.confFile = path.join(checkPath, "icons.conf") + else: + return False + + # Config File + confParser = configparser.ConfigParser() + try: + confParser.read_file(open(self.confFile, mode="r", encoding="utf8")) + except Exception as e: + logger.error("Could not load icon theme settings from: %s" % self.confFile) + return False + + ## Main + cnfSec = "Main" + if confParser.has_section(cnfSec): + self.themeName = self._parseLine( confParser, cnfSec, "name", "") + self.themeAuthor = self._parseLine( confParser, cnfSec, "author", "") + self.themeCredit = self._parseLine( confParser, cnfSec, "credit", "") + self.themeUrl = self._parseLine( confParser, cnfSec, "url", "") + + ## Palette + cnfSec = "Map" + if confParser.has_section(cnfSec): + for iconName, iconFile in confParser.items(cnfSec): + if iconName not in self.ICON_MAP: + logger.error("Unknown icon name '%s' in config file" % iconName) + else: + iconPath = path.join(self.iconPath, iconFile) + if path.isfile(iconPath): + self.themeMap[iconName] = iconPath + logger.verbose("Icon slot '%s' using file '%s'" % (iconName, iconFile)) + else: + logger.error("Icon file '%s' not in theme folder" % iconFile) + + logger.info("Loaded icon theme '%s'" % self.mainConf.guiIcons) + + return True + + ## + # Access Functions + ## def loadDecoration(self, decoKey, decoSize=None): """Load graphical decoration element based on the decoration @@ -122,19 +186,22 @@ class GuiIcons: def getIcon(self, iconKey, iconSize=None): """Return an icon from the icon buffer. If it doesn't exist, - return an empty icon. + return, load it, and if it still doesn't exist, return an empty + icon. """ if iconKey in self.qIcons: return self.qIcons[iconKey] - return QIcon() + else: + qIcon = self._loadIcon(iconKey) + self.qIcons[iconKey] = qIcon + return qIcon def getPixmap(self, iconKey, iconSize): """Return an icon from the icon buffer as a QPixmap. If it doesn't exist, return an empty QPixmap. """ - if iconKey in self.qIcons: - return self.qIcons[iconKey].pixmap(iconSize[0], iconSize[1], QIcon.Normal) - return QPixmap() + qIcon = self.getIcon(iconKey) + return qIcon.pixmap(iconSize[0], iconSize[1], QIcon.Normal) ## # Internal Functions @@ -148,49 +215,32 @@ class GuiIcons: """ if iconKey not in self.ICON_MAP: - logger.error("Icon with name '%s' does not exist" % iconKey) + logger.error("Requested unknown icon name '%s'" % iconKey) return QIcon() - if self.prefDark: - iconSuffix = "dark" - else: - iconSuffix = "light" + if iconKey in self.themeMap: + logger.verbose("Loading: %s" % self.themeMap[iconKey]) + return QIcon(self.themeMap[iconKey]) - iconNames = [] - iconNames.append("%s-%s.svg" % (iconKey, iconSuffix)) - iconNames.append("%s-%s.png" % (iconKey, iconSuffix)) - iconNames.append("%s.svg" % iconKey) - iconNames.append("%s.png" % iconKey) - - # Check theme folder - loadFrom = None - for iconName in iconNames: - checkPath = path.join(self.priPath, iconName) - if path.isfile(checkPath): - loadFrom = checkPath - logger.verbose("Loading icon '%s' from theme" % iconName) - break - if loadFrom is not None: - return QIcon(loadFrom) - - # Check assets folder - for iconName in iconNames: - checkPath = path.join(self.secPath, iconName) - if path.isfile(checkPath): - loadFrom = checkPath - logger.verbose("Loading icon '%s' from assets" % iconName) - break - if loadFrom is not None: - return QIcon(loadFrom) + # Next, we try to load the Qt style icons + if self.ICON_MAP[iconKey][0] is not None: + logger.verbose("Loading icon '%s' from Qt QStyle.standardIcon" % iconKey) + return qApp.style().standardIcon(self.ICON_MAP[iconKey][0]) # If we're still here, try to set from system theme - if self.ICON_MAP[iconKey] is not None: + if self.ICON_MAP[iconKey][1] is not None: logger.verbose("Loading icon '%s' from system theme" % iconKey) - return QIcon().fromTheme(self.ICON_MAP[iconKey]) + return QIcon().fromTheme(self.ICON_MAP[iconKey][1]) - # Give up and return an empty icomn + # Give up and return an empty icon logger.warning("Did not load an icon for '%s'" % iconKey) return QIcon() + def _parseLine(self, confParser, cnfSec, cnfName, cnfDefault): + if confParser.has_section(cnfSec): + if confParser.has_option(cnfSec, cnfName): + return confParser.get(cnfSec, cnfName) + return cnfDefault + # END Class GuiIcons diff --git a/nw/gui/statusbar.py b/nw/gui/statusbar.py index d815dd54..50f218f5 100644 --- a/nw/gui/statusbar.py +++ b/nw/gui/statusbar.py @@ -68,7 +68,7 @@ class GuiMainStatus(QStatusBar): self.timeBox.setFont(self.monoFont) self.timeIcon = QLabel() - self.timeIcon.setPixmap(self.theParent.theTheme.getPixmap("time",(14,14))) + self.timeIcon.setPixmap(self.theParent.theTheme.getPixmap("status_time",(14,14))) self.boxCounts = QLabel() self.boxCounts.setToolTip("Document Character | Word | Paragraph Count") @@ -85,7 +85,7 @@ class GuiMainStatus(QStatusBar): self.langBox = QLabel("None") self.langIcon = QLabel("") - self.langIcon.setPixmap(self.theParent.theTheme.getPixmap("globe",(14,14))) + self.langIcon.setPixmap(self.theParent.theTheme.getPixmap("status_lang",(14,14))) # Add Them self.addPermanentWidget(self.langIcon) diff --git a/nw/gui/theme.py b/nw/gui/theme.py index 0e4e5eaf..b2f11357 100644 --- a/nw/gui/theme.py +++ b/nw/gui/theme.py @@ -106,6 +106,7 @@ class GuiTheme: self.cssFile = None self.updateTheme() + self.theIcons.updateTheme() self.getIcon = self.theIcons.getIcon self.getPixmap = self.theIcons.getPixmap @@ -133,8 +134,6 @@ class GuiTheme: self.confFile = path.join(self.themePath,self.confName) self.cssFile = path.join(self.themePath,self.cssName) - self.theIcons.initIcons(path.join(self.themePath,self.iconPath)) - self.loadTheme() self.loadSyntax() diff --git a/nw/guimain.py b/nw/guimain.py index 2f1380bd..00dc3f7d 100644 --- a/nw/guimain.py +++ b/nw/guimain.py @@ -58,11 +58,6 @@ class GuiMain(QMainWindow): logger.info("Starting %s" % nw.__package__) logger.debug("Initialising GUI ...") self.mainConf = nw.CONFIG - self.theTheme = GuiTheme(self) - self.theProject = NWProject(self) - self.theIndex = NWIndex(self.theProject, self) - self.hasProject = False - self.isZenMode = False # Some runtime info useful for debugging logger.info("OS: %s" % self.mainConf.osType) @@ -78,6 +73,13 @@ class GuiMain(QMainWindow): self.mainConf.verPyString, self.mainConf.verPyHexVal) ) + # Core Classes and settings + self.theTheme = GuiTheme(self) + self.theProject = NWProject(self) + self.theIndex = NWIndex(self.theProject, self) + self.hasProject = False + self.isZenMode = False + # Prepare main window self.resize(*self.mainConf.winGeometry) self._setWindowTitle() From 8603bf8af8be3124fa3da95f25989f42e876f4ce Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Thu, 14 May 2020 00:16:21 +0200 Subject: [PATCH 4/7] Added dark icon coloured theme as well --- .../icons/typicons_colour_dark/README.md | 17 +++++ .../icons/typicons_colour_dark/backspace.svg | 56 +++++++++++++++ nw/assets/icons/typicons_colour_dark/book.svg | 71 +++++++++++++++++++ .../icons/typicons_colour_dark/cancel.svg | 56 +++++++++++++++ .../icons/typicons_colour_dark/delete.svg | 56 +++++++++++++++ .../typicons_colour_dark/document-text.svg | 66 +++++++++++++++++ .../icons/typicons_colour_dark/download.svg | 63 ++++++++++++++++ nw/assets/icons/typicons_colour_dark/flag.svg | 56 +++++++++++++++ .../icons/typicons_colour_dark/folder.svg | 66 +++++++++++++++++ .../icons/typicons_colour_dark/globe.svg | 57 +++++++++++++++ .../icons/typicons_colour_dark/globe_max.svg | 57 +++++++++++++++ .../icons/typicons_colour_dark/icons.conf | 38 ++++++++++ .../typicons_colour_dark/input-checked.svg | 56 +++++++++++++++ nw/assets/icons/typicons_colour_dark/key.svg | 56 +++++++++++++++ .../icons/typicons_colour_dark/location.svg | 56 +++++++++++++++ .../icons/typicons_colour_dark/minus.svg | 56 +++++++++++++++ .../icons/typicons_colour_dark/pencil.svg | 55 ++++++++++++++ nw/assets/icons/typicons_colour_dark/plus.svg | 56 +++++++++++++++ .../icons/typicons_colour_dark/puzzle.svg | 56 +++++++++++++++ .../typicons_colour_dark/search-replace.svg | 64 +++++++++++++++++ .../icons/typicons_colour_dark/search.svg | 58 +++++++++++++++ nw/assets/icons/typicons_colour_dark/star.svg | 56 +++++++++++++++ .../icons/typicons_colour_dark/stopwatch.svg | 62 ++++++++++++++++ .../typicons_colour_dark/stopwatch_max.svg | 62 ++++++++++++++++ nw/assets/icons/typicons_colour_dark/time.svg | 56 +++++++++++++++ .../icons/typicons_colour_dark/times.svg | 56 +++++++++++++++ .../icons/typicons_colour_dark/trash.svg | 56 +++++++++++++++ nw/assets/icons/typicons_colour_dark/user.svg | 56 +++++++++++++++ nw/config.py | 2 +- 29 files changed, 1577 insertions(+), 1 deletion(-) create mode 100644 nw/assets/icons/typicons_colour_dark/README.md create mode 100644 nw/assets/icons/typicons_colour_dark/backspace.svg create mode 100644 nw/assets/icons/typicons_colour_dark/book.svg create mode 100644 nw/assets/icons/typicons_colour_dark/cancel.svg create mode 100644 nw/assets/icons/typicons_colour_dark/delete.svg create mode 100644 nw/assets/icons/typicons_colour_dark/document-text.svg create mode 100644 nw/assets/icons/typicons_colour_dark/download.svg create mode 100644 nw/assets/icons/typicons_colour_dark/flag.svg create mode 100644 nw/assets/icons/typicons_colour_dark/folder.svg create mode 100644 nw/assets/icons/typicons_colour_dark/globe.svg create mode 100644 nw/assets/icons/typicons_colour_dark/globe_max.svg create mode 100644 nw/assets/icons/typicons_colour_dark/icons.conf create mode 100644 nw/assets/icons/typicons_colour_dark/input-checked.svg create mode 100644 nw/assets/icons/typicons_colour_dark/key.svg create mode 100644 nw/assets/icons/typicons_colour_dark/location.svg create mode 100644 nw/assets/icons/typicons_colour_dark/minus.svg create mode 100644 nw/assets/icons/typicons_colour_dark/pencil.svg create mode 100644 nw/assets/icons/typicons_colour_dark/plus.svg create mode 100644 nw/assets/icons/typicons_colour_dark/puzzle.svg create mode 100644 nw/assets/icons/typicons_colour_dark/search-replace.svg create mode 100644 nw/assets/icons/typicons_colour_dark/search.svg create mode 100644 nw/assets/icons/typicons_colour_dark/star.svg create mode 100644 nw/assets/icons/typicons_colour_dark/stopwatch.svg create mode 100644 nw/assets/icons/typicons_colour_dark/stopwatch_max.svg create mode 100644 nw/assets/icons/typicons_colour_dark/time.svg create mode 100644 nw/assets/icons/typicons_colour_dark/times.svg create mode 100644 nw/assets/icons/typicons_colour_dark/trash.svg create mode 100644 nw/assets/icons/typicons_colour_dark/user.svg diff --git a/nw/assets/icons/typicons_colour_dark/README.md b/nw/assets/icons/typicons_colour_dark/README.md new file mode 100644 index 00000000..3686b78d --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/README.md @@ -0,0 +1,17 @@ +Typicons +---- + +Source: https://github.com/stephenhutchings/typicons.font + +License +------- + +#### Icons/Artwork + +Distributed under +[CC BY-SA](http://creativecommons.org/licenses/by-sa/3.0/) licence. + +#### Font + +Distributed under +[SIL Open Font Licence](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web) licence. diff --git a/nw/assets/icons/typicons_colour_dark/backspace.svg b/nw/assets/icons/typicons_colour_dark/backspace.svg new file mode 100644 index 00000000..153e6519 --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/backspace.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/book.svg b/nw/assets/icons/typicons_colour_dark/book.svg new file mode 100644 index 00000000..6798b72e --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/book.svg @@ -0,0 +1,71 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/cancel.svg b/nw/assets/icons/typicons_colour_dark/cancel.svg new file mode 100644 index 00000000..e915d902 --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/cancel.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/delete.svg b/nw/assets/icons/typicons_colour_dark/delete.svg new file mode 100644 index 00000000..1a5f0eac --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/delete.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/document-text.svg b/nw/assets/icons/typicons_colour_dark/document-text.svg new file mode 100644 index 00000000..bb79ef9e --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/document-text.svg @@ -0,0 +1,66 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/download.svg b/nw/assets/icons/typicons_colour_dark/download.svg new file mode 100644 index 00000000..ba966a8d --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/download.svg @@ -0,0 +1,63 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/flag.svg b/nw/assets/icons/typicons_colour_dark/flag.svg new file mode 100644 index 00000000..93662481 --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/flag.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/folder.svg b/nw/assets/icons/typicons_colour_dark/folder.svg new file mode 100644 index 00000000..267d69fe --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/folder.svg @@ -0,0 +1,66 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/globe.svg b/nw/assets/icons/typicons_colour_dark/globe.svg new file mode 100644 index 00000000..9394ebed --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/globe.svg @@ -0,0 +1,57 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/globe_max.svg b/nw/assets/icons/typicons_colour_dark/globe_max.svg new file mode 100644 index 00000000..8966c4c9 --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/globe_max.svg @@ -0,0 +1,57 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/icons.conf b/nw/assets/icons/typicons_colour_dark/icons.conf new file mode 100644 index 00000000..aa7942c7 --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/icons.conf @@ -0,0 +1,38 @@ +## +# Icons: Typicons Colour Dark +# Source: https://github.com/stephenhutchings/typicons.font +# Credit: Stephen Hutchings +# Modified: Veronica Berglyd Olsen +## + +[Main] +name = Typicons Colour Dark +author = Stephen Hutchings +credit = Stephen Hutchings +url = https://github.com/stephenhutchings/typicons.font + +[Map] +cls_none = cancel.svg +cls_novel = book.svg +cls_plot = puzzle.svg +cls_character = user.svg +cls_world = location.svg +cls_timeline = time.svg +cls_object = key.svg +cls_entity = flag.svg +cls_custom = star.svg +cls_trash = trash.svg +proj_document = document-text.svg +proj_folder = folder.svg +status_lang = globe_max.svg +status_time = stopwatch_max.svg +delete = delete.svg +add = plus.svg +remove = minus.svg +close = times.svg +done = input-checked.svg +search = search.svg +search-replace = search-replace.svg +clear = backspace.svg +save = download.svg +edit = pencil.svg diff --git a/nw/assets/icons/typicons_colour_dark/input-checked.svg b/nw/assets/icons/typicons_colour_dark/input-checked.svg new file mode 100644 index 00000000..ae2fede6 --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/input-checked.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/key.svg b/nw/assets/icons/typicons_colour_dark/key.svg new file mode 100644 index 00000000..ea2d07de --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/key.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/location.svg b/nw/assets/icons/typicons_colour_dark/location.svg new file mode 100644 index 00000000..a1844983 --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/location.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/minus.svg b/nw/assets/icons/typicons_colour_dark/minus.svg new file mode 100644 index 00000000..c2f9ccee --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/minus.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/pencil.svg b/nw/assets/icons/typicons_colour_dark/pencil.svg new file mode 100644 index 00000000..bf1d0dab --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/pencil.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/plus.svg b/nw/assets/icons/typicons_colour_dark/plus.svg new file mode 100644 index 00000000..7287b396 --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/plus.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/puzzle.svg b/nw/assets/icons/typicons_colour_dark/puzzle.svg new file mode 100644 index 00000000..45f00f47 --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/puzzle.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/search-replace.svg b/nw/assets/icons/typicons_colour_dark/search-replace.svg new file mode 100644 index 00000000..b6c6e81e --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/search-replace.svg @@ -0,0 +1,64 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/search.svg b/nw/assets/icons/typicons_colour_dark/search.svg new file mode 100644 index 00000000..40a6203c --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/search.svg @@ -0,0 +1,58 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/star.svg b/nw/assets/icons/typicons_colour_dark/star.svg new file mode 100644 index 00000000..93995a6c --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/star.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/stopwatch.svg b/nw/assets/icons/typicons_colour_dark/stopwatch.svg new file mode 100644 index 00000000..7fbbf0d7 --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/stopwatch.svg @@ -0,0 +1,62 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/stopwatch_max.svg b/nw/assets/icons/typicons_colour_dark/stopwatch_max.svg new file mode 100644 index 00000000..7d489bae --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/stopwatch_max.svg @@ -0,0 +1,62 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/time.svg b/nw/assets/icons/typicons_colour_dark/time.svg new file mode 100644 index 00000000..e1746eda --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/time.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/times.svg b/nw/assets/icons/typicons_colour_dark/times.svg new file mode 100644 index 00000000..c360709a --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/times.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/trash.svg b/nw/assets/icons/typicons_colour_dark/trash.svg new file mode 100644 index 00000000..b7728f3e --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/trash.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/user.svg b/nw/assets/icons/typicons_colour_dark/user.svg new file mode 100644 index 00000000..fce26108 --- /dev/null +++ b/nw/assets/icons/typicons_colour_dark/user.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/nw/config.py b/nw/config.py index a9f4de3d..04685fb6 100644 --- a/nw/config.py +++ b/nw/config.py @@ -83,7 +83,7 @@ class Config: ## General self.guiTheme = "default" self.guiSyntax = "default_light" - self.guiIcons = "typicons_grey_light" + self.guiIcons = "typicons_colour_dark" self.guiDark = False ## Sizes From 0566df433bcd80c161280f13bbe52ff98d4a4720 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Thu, 14 May 2020 16:44:14 +0200 Subject: [PATCH 5/7] Updated colour icon theme --- .../icons/typicons_colour_dark/README.md | 20 ++------- nw/assets/icons/typicons_colour_dark/book.svg | 44 +++++++++---------- .../typicons_colour_dark/document-text.svg | 37 +++++++--------- .../icons/typicons_colour_dark/download.svg | 16 +++---- nw/assets/icons/typicons_colour_dark/flag.svg | 16 +++---- .../icons/typicons_colour_dark/folder.svg | 34 +++++++------- .../icons/typicons_colour_dark/icons.conf | 5 ++- .../typicons_colour_dark/input-checked.svg | 27 ++++++++---- .../icons/typicons_colour_dark/location.svg | 16 +++---- .../icons/typicons_colour_dark/pencil.svg | 23 ++++++---- nw/assets/icons/typicons_colour_dark/plus.svg | 16 +++---- .../typicons_colour_dark/search-replace.svg | 28 +++++++----- nw/assets/icons/typicons_colour_dark/time.svg | 24 ++++++---- .../icons/typicons_colour_dark/trash.svg | 22 ++++++---- nw/assets/icons/typicons_colour_dark/user.svg | 27 ++++++++---- nw/assets/icons/typicons_grey_dark/README.md | 20 ++------- nw/assets/icons/typicons_grey_dark/icons.conf | 5 ++- nw/assets/icons/typicons_grey_light/README.md | 20 ++------- .../icons/typicons_grey_light/icons.conf | 5 ++- nw/gui/dialogs/itemeditor.py | 10 ++++- nw/gui/icons.py | 24 ++++++---- 21 files changed, 229 insertions(+), 210 deletions(-) diff --git a/nw/assets/icons/typicons_colour_dark/README.md b/nw/assets/icons/typicons_colour_dark/README.md index 3686b78d..cfa5ea08 100644 --- a/nw/assets/icons/typicons_colour_dark/README.md +++ b/nw/assets/icons/typicons_colour_dark/README.md @@ -1,17 +1,5 @@ -Typicons ----- +## Typicons -Source: https://github.com/stephenhutchings/typicons.font - -License -------- - -#### Icons/Artwork - -Distributed under -[CC BY-SA](http://creativecommons.org/licenses/by-sa/3.0/) licence. - -#### Font - -Distributed under -[SIL Open Font Licence](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web) licence. +Copyright: Stephen Hutchings +Source: https://github.com/stephenhutchings/typicons.font +License: [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) diff --git a/nw/assets/icons/typicons_colour_dark/book.svg b/nw/assets/icons/typicons_colour_dark/book.svg index 6798b72e..efd40186 100644 --- a/nw/assets/icons/typicons_colour_dark/book.svg +++ b/nw/assets/icons/typicons_colour_dark/book.svg @@ -7,7 +7,7 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" sodipodi:docname="book.svg" id="svg891" viewBox="0 0 24 24" @@ -29,16 +29,16 @@ id="defs895" /> + + - - - + d="M 18.666667,2 H 6.4444444 C 6.15,2 5.8666667,2.1166667 5.6588889,2.3255556 l -3.3333333,3.3333333 -0.063333,0.068889 c -0.1544444,0.1833333 -0.25,0.4144444 -0.2611111,0.6666666 L 2,6.4533333 V 18.666667 C 2,20.504444 3.4955556,22 5.3333333,22 h 9.9999997 c 1.448889,0 2.684445,-0.928889 3.143334,-2.222222 h 0.745555 C 20.78,19.777778 22,18.314444 22,16.444444 V 5.3333333 C 22,3.4955556 20.504444,2 18.666667,2 Z M 5.3333333,19.777778 c -0.6122222,0 -1.1111111,-0.497778 -1.1111111,-1.111111 V 7.5555556 H 6.4444444 V 19.777778 Z M 16.444444,18.666667 c 0,0.613333 -0.498888,1.111111 -1.111111,1.111111 H 7.5555556 V 7.5555556 h 7.7777774 c 0.612223,0 1.111111,0.4977777 1.111111,1.1111111 z m 3.333334,-2.222223 c 0,0.688889 -0.36,1.111112 -0.555556,1.111112 H 18.666667 V 8.6666667 c 0,-1.8377778 -1.495556,-3.3333334 -3.333334,-3.3333334 H 5.7933333 L 6.9044444,4.2222222 H 18.666667 c 0.612222,0 1.111111,0.4977778 1.111111,1.1111111 z" + inkscape:label="Outline" /> diff --git a/nw/assets/icons/typicons_colour_dark/document-text.svg b/nw/assets/icons/typicons_colour_dark/document-text.svg index bb79ef9e..aadcc635 100644 --- a/nw/assets/icons/typicons_colour_dark/document-text.svg +++ b/nw/assets/icons/typicons_colour_dark/document-text.svg @@ -7,7 +7,7 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" sodipodi:docname="document-text.svg" id="svg2161" viewBox="0 0 24 24" @@ -29,16 +29,16 @@ id="defs2165" /> - - - + + id="path2157" + d="M 17.555555,22 H 6.4444443 C 4.6066666,22 3.111111,20.504444 3.111111,18.666667 V 5.3333333 C 3.111111,3.4955556 4.6066666,2 6.4444443,2 H 17.555555 c 1.837778,0 3.333334,1.4955556 3.333334,3.3333333 V 18.666667 C 20.888889,20.504444 19.393333,22 17.555555,22 Z M 6.4444443,4.2222222 c -0.6122222,0 -1.1111111,0.4988889 -1.1111111,1.1111111 V 18.666667 c 0,0.612222 0.4988889,1.111111 1.1111111,1.111111 H 17.555555 c 0.612223,0 1.111112,-0.498889 1.111112,-1.111111 V 5.3333333 c 0,-0.6122222 -0.498889,-1.1111111 -1.111112,-1.1111111 z M 16.444444,10.888889 H 7.5555554 c -0.3066666,0 -0.5555555,-0.248889 -0.5555555,-0.555556 0,-0.306666 0.2488889,-0.5555552 0.5555555,-0.5555552 H 16.444444 C 16.751111,9.7777778 17,10.026667 17,10.333333 17,10.64 16.751111,10.888889 16.444444,10.888889 Z m 0,-3.3333334 H 7.5555554 C 7.2488888,7.5555556 6.9999999,7.3066667 6.9999999,7 c 0,-0.3066667 0.2488889,-0.5555556 0.5555555,-0.5555556 H 16.444444 C 16.751111,6.4444444 17,6.6933333 17,7 17,7.3066667 16.751111,7.5555556 16.444444,7.5555556 Z m 0,6.6666664 H 7.5555554 c -0.3066666,0 -0.5555555,-0.248889 -0.5555555,-0.555555 0,-0.306667 0.2488889,-0.555556 0.5555555,-0.555556 H 16.444444 C 16.751111,13.111111 17,13.36 17,13.666667 c 0,0.306666 -0.248889,0.555555 -0.555556,0.555555 z m 0,3.333334 H 7.5555554 c -0.3066666,0 -0.5555555,-0.248889 -0.5555555,-0.555556 0,-0.306667 0.2488889,-0.555556 0.5555555,-0.555556 H 16.444444 C 16.751111,16.444444 17,16.693333 17,17 c 0,0.306667 -0.248889,0.555556 -0.555556,0.555556 z" + inkscape:label="Outline" /> diff --git a/nw/assets/icons/typicons_colour_dark/download.svg b/nw/assets/icons/typicons_colour_dark/download.svg index ba966a8d..c8ffa937 100644 --- a/nw/assets/icons/typicons_colour_dark/download.svg +++ b/nw/assets/icons/typicons_colour_dark/download.svg @@ -7,7 +7,7 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" sodipodi:docname="download.svg" id="svg13801" viewBox="0 0 24 24" @@ -29,16 +29,16 @@ id="defs13805" /> diff --git a/nw/assets/icons/typicons_colour_dark/flag.svg b/nw/assets/icons/typicons_colour_dark/flag.svg index 93662481..9facfcfa 100644 --- a/nw/assets/icons/typicons_colour_dark/flag.svg +++ b/nw/assets/icons/typicons_colour_dark/flag.svg @@ -13,7 +13,7 @@ viewBox="0 0 24 24" id="svg16286" sodipodi:docname="flag.svg" - inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)"> + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> @@ -37,20 +37,20 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="2560" - inkscape:window-height="1344" + inkscape:window-width="2374" + inkscape:window-height="1376" id="namedview16288" showgrid="false" inkscape:zoom="38.125" - inkscape:cx="12" + inkscape:cx="7.2131148" inkscape:cy="12" - inkscape:window-x="0" - inkscape:window-y="0" - inkscape:window-maximized="1" + inkscape:window-x="48" + inkscape:window-y="27" + inkscape:window-maximized="0" inkscape:current-layer="svg16286" /> + style="stroke-width:1.23158;fill:#f99157;fill-opacity:1" /> diff --git a/nw/assets/icons/typicons_colour_dark/folder.svg b/nw/assets/icons/typicons_colour_dark/folder.svg index 267d69fe..fd894938 100644 --- a/nw/assets/icons/typicons_colour_dark/folder.svg +++ b/nw/assets/icons/typicons_colour_dark/folder.svg @@ -7,7 +7,7 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" sodipodi:docname="folder.svg" id="svg2765" viewBox="0 0 24 24" @@ -29,16 +29,16 @@ id="defs2769" /> + - - + d="M 18.666667,5.2499999 H 12 C 12,4.008 11.004444,3 9.777778,3 H 5.3333333 C 3.4955556,3 2,4.51425 2,6.3749999 V 17.624999 C 2,19.48575 3.4955556,21 5.3333333,21 H 18.666667 C 20.504444,21 22,19.48575 22,17.624999 V 8.625 C 22,6.76425 20.504444,5.2499999 18.666667,5.2499999 Z m -13.3333337,0 H 9.777778 c 0,1.2420001 0.995555,2.25 2.222222,2.25 h 6.666667 c 0.613333,0 1.111111,0.504 1.111111,1.1250001 H 4.2222222 V 6.3749999 c 0,-0.6209999 0.4977778,-1.125 1.1111111,-1.125 z M 18.666667,18.75 H 5.3333333 C 4.72,18.75 4.2222222,18.246 4.2222222,17.624999 V 9.75 H 19.777778 v 7.874999 C 19.777778,18.246 19.28,18.75 18.666667,18.75 Z" + inkscape:label="Outline" /> diff --git a/nw/assets/icons/typicons_colour_dark/icons.conf b/nw/assets/icons/typicons_colour_dark/icons.conf index aa7942c7..dfb1278f 100644 --- a/nw/assets/icons/typicons_colour_dark/icons.conf +++ b/nw/assets/icons/typicons_colour_dark/icons.conf @@ -7,9 +7,12 @@ [Main] name = Typicons Colour Dark -author = Stephen Hutchings +description = Coulorised icons for dark GUI theme based on Typicons. +author = Stephen Hutchings (original), Veronica Berglyd Olsen (adaptation) credit = Stephen Hutchings url = https://github.com/stephenhutchings/typicons.font +license = CC BY-SA 4.0 +licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Map] cls_none = cancel.svg diff --git a/nw/assets/icons/typicons_colour_dark/input-checked.svg b/nw/assets/icons/typicons_colour_dark/input-checked.svg index ae2fede6..e4b22265 100644 --- a/nw/assets/icons/typicons_colour_dark/input-checked.svg +++ b/nw/assets/icons/typicons_colour_dark/input-checked.svg @@ -7,7 +7,7 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" sodipodi:docname="input-checked.svg" id="svg11367" viewBox="0 0 24 24" @@ -29,16 +29,16 @@ id="defs11371" /> + d="m 13.499143,15.642429 c -0.45,0 -0.885857,-0.178715 -1.209857,-0.502715 L 8.859,11.710714 c -0.668571,-0.669857 -0.668571,-1.755 0,-2.423571 0.669857,-0.669857 1.755,-0.669857 2.426143,0 L 13.105714,11.109 17.573571,4.0954286 c 0.459,-0.828 1.504286,-1.1275715 2.332286,-0.6672857 0.826714,0.4602857 1.125,1.5042857 0.666,2.331 l -5.572286,9.0000001 c -0.261,0.470571 -0.727714,0.790714 -1.26,0.865286 z" + sodipodi:nodetypes="cccscccccccc" + inkscape:label="Check" /> + diff --git a/nw/assets/icons/typicons_colour_dark/location.svg b/nw/assets/icons/typicons_colour_dark/location.svg index a1844983..1189343d 100644 --- a/nw/assets/icons/typicons_colour_dark/location.svg +++ b/nw/assets/icons/typicons_colour_dark/location.svg @@ -7,7 +7,7 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" sodipodi:docname="location.svg" id="svg4600" viewBox="0 0 24 24" @@ -29,16 +29,16 @@ id="defs4604" /> diff --git a/nw/assets/icons/typicons_colour_dark/pencil.svg b/nw/assets/icons/typicons_colour_dark/pencil.svg index bf1d0dab..873f98e4 100644 --- a/nw/assets/icons/typicons_colour_dark/pencil.svg +++ b/nw/assets/icons/typicons_colour_dark/pencil.svg @@ -13,7 +13,7 @@ viewBox="0 0 24 24" id="svg14474" sodipodi:docname="pencil.svg" - inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)"> + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> @@ -37,19 +37,26 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="2560" - inkscape:window-height="1344" + inkscape:window-width="2374" + inkscape:window-height="1376" id="namedview14476" showgrid="false" inkscape:zoom="38.125" - inkscape:cx="12" + inkscape:cx="2.4262296" inkscape:cy="12" - inkscape:window-x="0" - inkscape:window-y="0" - inkscape:window-maximized="1" + inkscape:window-x="48" + inkscape:window-y="27" + inkscape:window-maximized="0" inkscape:current-layer="svg14474" /> + style="fill:#99cc99;fill-opacity:1" + inkscape:label="Tip" /> + diff --git a/nw/assets/icons/typicons_colour_dark/plus.svg b/nw/assets/icons/typicons_colour_dark/plus.svg index 7287b396..8e77765e 100644 --- a/nw/assets/icons/typicons_colour_dark/plus.svg +++ b/nw/assets/icons/typicons_colour_dark/plus.svg @@ -7,7 +7,7 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" sodipodi:docname="plus.svg" id="svg5808" viewBox="0 0 24 24" @@ -29,16 +29,16 @@ id="defs5812" /> diff --git a/nw/assets/icons/typicons_colour_dark/search-replace.svg b/nw/assets/icons/typicons_colour_dark/search-replace.svg index b6c6e81e..012a9795 100644 --- a/nw/assets/icons/typicons_colour_dark/search-replace.svg +++ b/nw/assets/icons/typicons_colour_dark/search-replace.svg @@ -7,7 +7,7 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" sodipodi:docname="search-replace.svg" id="svg873" viewBox="0 0 24 24" @@ -30,16 +30,16 @@ id="defs877" /> + inkscape:connector-curvature="0" + inkscape:label="Search" /> + style="display:inline;fill:#99cc99;fill-opacity:1;stroke-width:1.19007" + d="m 15.96652,2.4766329 c -0.396657,0 -0.792437,0.1507259 -1.095095,0.4533829 L 3.57173,14.229712 c -0.3026571,0.302657 -0.5759103,0.751428 -0.7742385,1.227621 -0.1983282,0.47826 -0.3208556,0.99063 -0.3208556,1.418274 v 4.647756 h 4.6477558 c 0.427645,0 0.9376894,-0.122526 1.4159495,-0.320855 0.4782601,-0.198328 0.9272894,-0.471583 1.2299463,-0.774239 L 21.069984,9.1285734 c 0.302656,-0.302657 0.453382,-0.7017958 0.453382,-1.0974191 0,-0.3966562 -0.150726,-0.7924369 -0.453382,-1.0950939 L 17.063939,2.9300158 C 16.761281,2.6273588 16.362143,2.4766329 15.96652,2.4766329 Z m 0,2.2785396 3.275981,3.2759818 -1.334572,1.3368983 -3.275982,-3.2759819 z M 13.901884,6.8221334 15.173682,8.0939305 6.6082326,16.661704 5.3364357,15.387582 Z m 2.004185,2.0041848 1.271796,1.2717968 -8.5654475,8.565448 -1.2741221,-1.271796 z M 4.7063497,16.250176 c 0.010333,-0.02065 3.0644031,3.034179 3.0644031,3.034179 C 7.43814,19.422771 7.2039295,19.456408 7.1243917,19.456408 H 5.5759147 L 4.5435968,18.424084 v -1.548477 c 0,-0.07953 0.033633,-0.315548 0.1627529,-0.625436 z" + inkscape:label="Edit" /> + diff --git a/nw/assets/icons/typicons_colour_dark/time.svg b/nw/assets/icons/typicons_colour_dark/time.svg index e1746eda..ac0587cb 100644 --- a/nw/assets/icons/typicons_colour_dark/time.svg +++ b/nw/assets/icons/typicons_colour_dark/time.svg @@ -7,7 +7,7 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" sodipodi:docname="time.svg" id="svg8332" viewBox="0 0 24 24" @@ -29,16 +29,16 @@ id="defs8336" /> + + d="m 16.444444,12 c 0,-0.611111 -0.5,-1.111111 -1.111111,-1.111111 H 12 c -0.611111,0 -1.111111,0.5 -1.111111,1.111111 0,0.611111 0.5,1.111111 1.111111,1.111111 h 3.333333 c 0.611111,0 1.111111,-0.5 1.111111,-1.111111 z M 12,4.2222222 c 4.287778,0 7.777778,3.49 7.777778,7.7777778 0,4.287778 -3.49,7.777778 -7.777778,7.777778 -4.2877778,0 -7.7777778,-3.49 -7.7777778,-7.777778 0,-4.2877778 3.49,-7.7777778 7.7777778,-7.7777778 M 12,2 C 6.4766667,2 2,6.4766667 2,12 2,17.523333 6.4766667,22 12,22 17.523333,22 22,17.523333 22,12 22,6.4766667 17.523333,2 12,2 Z m 1.111111,6.666667 c 0,-0.611111 -0.5,-1.1111114 -1.111111,-1.1111114 -0.611111,0 -1.111111,0.5000004 -1.111111,1.1111114 V 12 c 0,0.611111 0.5,1.111111 1.111111,1.111111 0.611111,0 1.111111,-0.5 1.111111,-1.111111 z M 12,6.4444444 c 3.063333,0 5.555556,2.4922226 5.555556,5.5555556 0,3.063333 -2.492223,5.555556 -5.555556,5.555556 C 8.9366667,17.555556 6.4444444,15.063333 6.4444444,12 6.4444444,8.936667 8.9366667,6.4444444 12,6.4444444 M 12,5.3333333 C 8.32,5.3333333 5.3333333,8.317778 5.3333333,12 5.3333333,15.68 8.32,18.666667 12,18.666667 15.68,18.666667 18.666667,15.68 18.666667,12 18.666667,8.317778 15.68,5.3333333 12,5.3333333 Z" + inkscape:label="Outline" /> diff --git a/nw/assets/icons/typicons_colour_dark/trash.svg b/nw/assets/icons/typicons_colour_dark/trash.svg index b7728f3e..853a6743 100644 --- a/nw/assets/icons/typicons_colour_dark/trash.svg +++ b/nw/assets/icons/typicons_colour_dark/trash.svg @@ -13,7 +13,7 @@ viewBox="0 0 24 24" id="svg10159" sodipodi:docname="trash.svg" - inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)"> + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> @@ -37,20 +37,26 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="2560" - inkscape:window-height="1344" + inkscape:window-width="2374" + inkscape:window-height="1376" id="namedview10161" showgrid="false" inkscape:zoom="38.125" - inkscape:cx="12" + inkscape:cx="7.2131148" inkscape:cy="12" - inkscape:window-x="0" - inkscape:window-y="0" - inkscape:window-maximized="1" + inkscape:window-x="48" + inkscape:window-y="27" + inkscape:window-maximized="0" inkscape:current-layer="svg10159" /> + + style="display:inline;fill:#aeaeae;fill-opacity:1;stroke-width:1.17647004" + inkscape:label="Outline" /> diff --git a/nw/assets/icons/typicons_colour_dark/user.svg b/nw/assets/icons/typicons_colour_dark/user.svg index fce26108..b27888cc 100644 --- a/nw/assets/icons/typicons_colour_dark/user.svg +++ b/nw/assets/icons/typicons_colour_dark/user.svg @@ -7,7 +7,7 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" sodipodi:docname="user.svg" id="svg10763" viewBox="0 0 24 24" @@ -29,16 +29,16 @@ id="defs10767" /> + d="m 4.9411765,19.647059 c 0,1.17647 2.6470588,2.352941 7.0588245,2.352941 4.138822,0 7.058822,-1.176471 7.058822,-2.352941 0,-2.352941 -2.769412,-4.705883 -7.058823,-4.705883 -4.4117647,0 -7.0588235,2.352942 -7.0588235,4.705883 z" + sodipodi:nodetypes="sssss" + inkscape:label="Body" /> + diff --git a/nw/assets/icons/typicons_grey_dark/README.md b/nw/assets/icons/typicons_grey_dark/README.md index 3686b78d..cfa5ea08 100644 --- a/nw/assets/icons/typicons_grey_dark/README.md +++ b/nw/assets/icons/typicons_grey_dark/README.md @@ -1,17 +1,5 @@ -Typicons ----- +## Typicons -Source: https://github.com/stephenhutchings/typicons.font - -License -------- - -#### Icons/Artwork - -Distributed under -[CC BY-SA](http://creativecommons.org/licenses/by-sa/3.0/) licence. - -#### Font - -Distributed under -[SIL Open Font Licence](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web) licence. +Copyright: Stephen Hutchings +Source: https://github.com/stephenhutchings/typicons.font +License: [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) diff --git a/nw/assets/icons/typicons_grey_dark/icons.conf b/nw/assets/icons/typicons_grey_dark/icons.conf index 1cf3b306..70cef96c 100644 --- a/nw/assets/icons/typicons_grey_dark/icons.conf +++ b/nw/assets/icons/typicons_grey_dark/icons.conf @@ -6,9 +6,12 @@ [Main] name = Typicons Grey Dark -author = Stephen Hutchings +description = Greyscaled icons for dark GUI theme based on Typicons. +author = Stephen Hutchings (original), Veronica Berglyd Olsen (adaptation) credit = Stephen Hutchings url = https://github.com/stephenhutchings/typicons.font +license = CC BY-SA 4.0 +licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Map] cls_none = cancel.svg diff --git a/nw/assets/icons/typicons_grey_light/README.md b/nw/assets/icons/typicons_grey_light/README.md index 3686b78d..cfa5ea08 100644 --- a/nw/assets/icons/typicons_grey_light/README.md +++ b/nw/assets/icons/typicons_grey_light/README.md @@ -1,17 +1,5 @@ -Typicons ----- +## Typicons -Source: https://github.com/stephenhutchings/typicons.font - -License -------- - -#### Icons/Artwork - -Distributed under -[CC BY-SA](http://creativecommons.org/licenses/by-sa/3.0/) licence. - -#### Font - -Distributed under -[SIL Open Font Licence](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web) licence. +Copyright: Stephen Hutchings +Source: https://github.com/stephenhutchings/typicons.font +License: [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) diff --git a/nw/assets/icons/typicons_grey_light/icons.conf b/nw/assets/icons/typicons_grey_light/icons.conf index 6bd45209..fc4d556e 100644 --- a/nw/assets/icons/typicons_grey_light/icons.conf +++ b/nw/assets/icons/typicons_grey_light/icons.conf @@ -6,9 +6,12 @@ [Main] name = Typicons Grey Light -author = Stephen Hutchings +description = Greyscaled icons for light GUI theme based on Typicons. +author = Stephen Hutchings (original), Veronica Berglyd Olsen (adaptation) credit = Stephen Hutchings url = https://github.com/stephenhutchings/typicons.font +license = CC BY-SA 4.0 +licenseurl = https://creativecommons.org/licenses/by-sa/4.0/ [Map] cls_none = cancel.svg diff --git a/nw/gui/dialogs/itemeditor.py b/nw/gui/dialogs/itemeditor.py index 30c4721c..0b24e9d6 100644 --- a/nw/gui/dialogs/itemeditor.py +++ b/nw/gui/dialogs/itemeditor.py @@ -31,7 +31,7 @@ import nw from PyQt5.QtCore import Qt from PyQt5.QtWidgets import ( QDialog, QHBoxLayout, QVBoxLayout, QGroupBox, QFormLayout, QLineEdit, - QPushButton, QComboBox + QPushButton, QComboBox, QLabel ) from nw.constants import nwLabels, nwItemLayout, nwItemClass, nwItemType @@ -54,11 +54,17 @@ class GuiItemEditor(QDialog): self.innerBox = QVBoxLayout() self.setWindowTitle("Item Settings") - self.guiDeco = self.theParent.theTheme.loadDecoration("settings",(64,64)) + self.guiDeco = QLabel() + self.guiDeco.setPixmap( + self.theParent.theTheme.getPixmap( + nwLabels.CLASS_ICON[self.theItem.itemClass], (64,64) + ) + ) self.setLayout(self.outerBox) self.outerBox.addWidget(self.guiDeco, 0, Qt.AlignTop) self.outerBox.addLayout(self.innerBox) + self.outerBox.setSpacing(16) self.mainGroup = QGroupBox("Item Settings") self.mainForm = QFormLayout() diff --git a/nw/gui/icons.py b/nw/gui/icons.py index 066d321e..c45a9aaf 100644 --- a/nw/gui/icons.py +++ b/nw/gui/icons.py @@ -98,10 +98,13 @@ class GuiIcons: self.confFile = None # Icon Theme Meta - self.themeName = "" - self.themeAuthor = "" - self.themeCredit = "" - self.themeUrl = "" + self.themeName = "" + self.themeDescription = "" + self.themeAuthor = "" + self.themeCredit = "" + self.themeUrl = "" + self.themeLicense = "" + self.themeLicenseUrl = "" return @@ -133,10 +136,13 @@ class GuiIcons: ## Main cnfSec = "Main" if confParser.has_section(cnfSec): - self.themeName = self._parseLine( confParser, cnfSec, "name", "") - self.themeAuthor = self._parseLine( confParser, cnfSec, "author", "") - self.themeCredit = self._parseLine( confParser, cnfSec, "credit", "") - self.themeUrl = self._parseLine( confParser, cnfSec, "url", "") + self.themeName = self._parseLine( confParser, cnfSec, "name", "") + self.themeDescription = self._parseLine( confParser, cnfSec, "description", "") + self.themeAuthor = self._parseLine( confParser, cnfSec, "author", "") + self.themeCredit = self._parseLine( confParser, cnfSec, "credit", "") + self.themeUrl = self._parseLine( confParser, cnfSec, "url", "") + self.themeLicense = self._parseLine( confParser, cnfSec, "license", "") + self.themeLicenseUrl = self._parseLine( confParser, cnfSec, "licenseurl", "") ## Palette cnfSec = "Map" @@ -219,7 +225,7 @@ class GuiIcons: return QIcon() if iconKey in self.themeMap: - logger.verbose("Loading: %s" % self.themeMap[iconKey]) + logger.verbose("Loading: %s" % path.relpath(self.themeMap[iconKey])) return QIcon(self.themeMap[iconKey]) # Next, we try to load the Qt style icons From 0eb4319fc110263b9537aa625c59d372a189deff Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Thu, 14 May 2020 18:38:41 +0200 Subject: [PATCH 6/7] Finished the code for icon themes --- nw/assets/icons/fallback/status_lang-dark.svg | 57 +++++++++++++++ nw/assets/icons/fallback/status_lang.svg | 56 +++++++++++++++ nw/assets/icons/fallback/status_time-dark.svg | 62 ++++++++++++++++ nw/assets/icons/fallback/status_time.svg | 61 ++++++++++++++++ .../typicons_colour_dark/input-checked.svg | 70 +++++++++---------- nw/config.py | 6 +- nw/gui/dialogs/configeditor.py | 32 +++++++-- nw/gui/dialogs/itemeditor.py | 3 +- nw/gui/dialogs/projecteditor.py | 22 +++--- nw/gui/icons.py | 52 ++++++++++++-- nw/gui/theme.py | 18 +++-- tests/reference/novelwriter.conf | 1 + 12 files changed, 376 insertions(+), 64 deletions(-) create mode 100644 nw/assets/icons/fallback/status_lang-dark.svg create mode 100644 nw/assets/icons/fallback/status_lang.svg create mode 100644 nw/assets/icons/fallback/status_time-dark.svg create mode 100644 nw/assets/icons/fallback/status_time.svg diff --git a/nw/assets/icons/fallback/status_lang-dark.svg b/nw/assets/icons/fallback/status_lang-dark.svg new file mode 100644 index 00000000..8966c4c9 --- /dev/null +++ b/nw/assets/icons/fallback/status_lang-dark.svg @@ -0,0 +1,57 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/nw/assets/icons/fallback/status_lang.svg b/nw/assets/icons/fallback/status_lang.svg new file mode 100644 index 00000000..255ac776 --- /dev/null +++ b/nw/assets/icons/fallback/status_lang.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/nw/assets/icons/fallback/status_time-dark.svg b/nw/assets/icons/fallback/status_time-dark.svg new file mode 100644 index 00000000..7d489bae --- /dev/null +++ b/nw/assets/icons/fallback/status_time-dark.svg @@ -0,0 +1,62 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/nw/assets/icons/fallback/status_time.svg b/nw/assets/icons/fallback/status_time.svg new file mode 100644 index 00000000..129d58cf --- /dev/null +++ b/nw/assets/icons/fallback/status_time.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/nw/assets/icons/typicons_colour_dark/input-checked.svg b/nw/assets/icons/typicons_colour_dark/input-checked.svg index e4b22265..a4b66a4d 100644 --- a/nw/assets/icons/typicons_colour_dark/input-checked.svg +++ b/nw/assets/icons/typicons_colour_dark/input-checked.svg @@ -7,13 +7,13 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" - sodipodi:docname="input-checked.svg" - id="svg11367" - viewBox="0 0 24 24" - height="24" + version="1.2" width="24" - version="1.2"> + height="24" + viewBox="0 0 24 24" + id="svg11367" + sodipodi:docname="input-checked.svg" + inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)"> @@ -28,38 +28,38 @@ + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="2560" + inkscape:window-height="1344" + id="namedview11369" + showgrid="false" + inkscape:zoom="38.125" + inkscape:cx="7.2131148" + inkscape:cy="12" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg11367" /> - + + style="display:inline;fill:#aeaeae;fill-opacity:1;stroke-width:1.28570998" + inkscape:connector-curvature="0" + id="path16196" + d="M 17.142857,21 H 6.8571429 C 4.7305714,21 3,19.269429 3,17.142857 V 6.8571429 C 3,4.7305714 4.7305714,3 6.8571429,3 h 6.4285711 c 0.711,0 1.285715,0.576 1.285715,1.2857143 0,0.7097143 -0.574715,1.2857143 -1.285715,1.2857143 H 6.8571429 c -0.7097143,0 -1.2857143,0.5772857 -1.2857143,1.2857143 V 17.142857 c 0,0.708429 0.576,1.285714 1.2857143,1.285714 H 17.142857 c 0.709714,0 1.285714,-0.577285 1.285714,-1.285714 V 13.285714 C 18.428571,12.576 19.003286,12 19.714286,12 20.425286,12 21,12.576 21,13.285714 v 3.857143 C 21,19.269429 19.269429,21 17.142857,21 Z" /> diff --git a/nw/config.py b/nw/config.py index 04685fb6..985f4b8d 100644 --- a/nw/config.py +++ b/nw/config.py @@ -83,7 +83,7 @@ class Config: ## General self.guiTheme = "default" self.guiSyntax = "default_light" - self.guiIcons = "typicons_colour_dark" + self.guiIcons = "default" self.guiDark = False ## Sizes @@ -304,6 +304,9 @@ class Config: self.guiSyntax = self._parseLine( cnfParse, cnfSec, "syntax", self.CNF_STR, self.guiSyntax ) + self.guiIcons = self._parseLine( + cnfParse, cnfSec, "icons", self.CNF_STR, self.guiIcons + ) self.guiDark = self._parseLine( cnfParse, cnfSec, "guidark", self.CNF_BOOL, self.guiDark ) @@ -452,6 +455,7 @@ class Config: cnfParse.set(cnfSec,"timestamp", formatTimeStamp(time())) cnfParse.set(cnfSec,"theme", str(self.guiTheme)) cnfParse.set(cnfSec,"syntax", str(self.guiSyntax)) + cnfParse.set(cnfSec,"icons", str(self.guiIcons)) cnfParse.set(cnfSec,"guidark", str(self.guiDark)) ## Sizes diff --git a/nw/gui/dialogs/configeditor.py b/nw/gui/dialogs/configeditor.py index cb60a40e..e03d7bad 100644 --- a/nw/gui/dialogs/configeditor.py +++ b/nw/gui/dialogs/configeditor.py @@ -58,7 +58,11 @@ class GuiConfigEditor(QDialog): self.innerBox = QVBoxLayout() self.setWindowTitle("Preferences") - self.guiDeco = self.theParent.theTheme.loadDecoration("settings",(64,64)) + self.guiDeco = self.theParent.theTheme.loadDecoration("settings", (64,64)) + self.outerBox.addWidget(self.guiDeco, 0, Qt.AlignTop) + self.outerBox.addLayout(self.innerBox) + self.outerBox.setSpacing(16) + self.setLayout(self.outerBox) self.tabGeneral = GuiConfigEditGeneralTab(self.theParent) self.tabLayout = GuiConfigEditLayoutTab(self.theParent) @@ -72,10 +76,6 @@ class GuiConfigEditor(QDialog): self.tabWidget.addTab(self.tabEditing, "Editing") self.tabWidget.addTab(self.tabAutoRep, "Auto-Replace") - self.setLayout(self.outerBox) - self.outerBox.addWidget(self.guiDeco, 0, Qt.AlignTop) - self.outerBox.addLayout(self.innerBox) - self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.buttonBox.accepted.connect(self._doSave) self.buttonBox.rejected.connect(self._doClose) @@ -169,6 +169,22 @@ class GuiConfigEditGeneralTab(QWidget): "Changing this requires restarting %s." % nw.__package__ ) + ## Select Icon Theme + self.selectIcons = QComboBox() + self.selectIcons.setMinimumWidth(200) + self.theIcons = self.theTheme.theIcons.listThemes() + for iconDir, iconName in self.theIcons: + self.selectIcons.addItem(iconName, iconDir) + iconIdx = self.selectIcons.findData(self.mainConf.guiIcons) + if iconIdx != -1: + self.selectIcons.setCurrentIndex(iconIdx) + + self.mainForm.addRow( + "Main icon theme", + self.selectIcons, + "Changing this requires restarting %s." % nw.__package__ + ) + ## Syntax Highlighting self.selectSyntax = QComboBox() self.selectSyntax.setMinimumWidth(200) @@ -181,7 +197,8 @@ class GuiConfigEditGeneralTab(QWidget): self.mainForm.addRow( "Syntax highlight theme", - self.selectSyntax + self.selectSyntax, + "" ) ## Dark Icons @@ -275,6 +292,7 @@ class GuiConfigEditGeneralTab(QWidget): guiTheme = self.selectTheme.currentData() guiSyntax = self.selectSyntax.currentData() + guiIcons = self.selectIcons.currentData() guiDark = self.preferDarkIcons.isChecked() showFullPath = self.showFullPath.isChecked() autoSaveDoc = self.autoSaveDoc.value() @@ -285,9 +303,11 @@ class GuiConfigEditGeneralTab(QWidget): # Check if restart is needed needsRestart |= self.mainConf.guiTheme != guiTheme + needsRestart |= self.mainConf.guiIcons != guiIcons self.mainConf.guiTheme = guiTheme self.mainConf.guiSyntax = guiSyntax + self.mainConf.guiIcons = guiIcons self.mainConf.guiDark = guiDark self.mainConf.showFullPath = showFullPath self.mainConf.autoSaveDoc = autoSaveDoc diff --git a/nw/gui/dialogs/itemeditor.py b/nw/gui/dialogs/itemeditor.py index 0b24e9d6..38af48d6 100644 --- a/nw/gui/dialogs/itemeditor.py +++ b/nw/gui/dialogs/itemeditor.py @@ -60,11 +60,10 @@ class GuiItemEditor(QDialog): nwLabels.CLASS_ICON[self.theItem.itemClass], (64,64) ) ) - - self.setLayout(self.outerBox) self.outerBox.addWidget(self.guiDeco, 0, Qt.AlignTop) self.outerBox.addLayout(self.innerBox) self.outerBox.setSpacing(16) + self.setLayout(self.outerBox) self.mainGroup = QGroupBox("Item Settings") self.mainForm = QFormLayout() diff --git a/nw/gui/dialogs/projecteditor.py b/nw/gui/dialogs/projecteditor.py index afa5dbe5..fd256c3a 100644 --- a/nw/gui/dialogs/projecteditor.py +++ b/nw/gui/dialogs/projecteditor.py @@ -52,12 +52,18 @@ class GuiProjectEditor(QDialog): self.theParent = theParent self.theProject = theProject - self.outerBox = QHBoxLayout() - self.innerBox = QVBoxLayout() - self.setWindowTitle("Project Settings") - self.setLayout(self.outerBox) + self.outerBox = QHBoxLayout() + self.innerBox = QVBoxLayout() - self.guiDeco = self.theParent.theTheme.loadDecoration("settings",(64,64)) + self.setWindowTitle("Project Settings") + self.guiDeco = QLabel() + self.guiDeco.setPixmap( + self.theParent.theTheme.getPixmap("cls_novel", (64,64)) + ) + self.outerBox.addWidget(self.guiDeco, 0, Qt.AlignTop) + self.outerBox.addLayout(self.innerBox) + self.outerBox.setSpacing(16) + self.setLayout(self.outerBox) self.theProject.countStatus() self.tabMain = GuiProjectEditMain(self.theParent, self.theProject) @@ -71,9 +77,6 @@ class GuiProjectEditor(QDialog): self.tabWidget.addTab(self.tabImport, "Importance") self.tabWidget.addTab(self.tabReplace,"Auto-Replace") - self.outerBox.addWidget(self.guiDeco, 0, Qt.AlignTop) - self.outerBox.addLayout(self.innerBox) - self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.buttonBox.accepted.connect(self._doSave) self.buttonBox.rejected.connect(self._doClose) @@ -363,6 +366,9 @@ class GuiProjectEditReplace(QWidget): self.saveButton = QPushButton(self.theTheme.getIcon("done"),"") self.addButton = QPushButton(self.theTheme.getIcon("add"),"") self.delButton = QPushButton(self.theTheme.getIcon("remove"),"") + self.saveButton.setToolTip("Save entry") + self.addButton.setToolTip("Add new entry") + self.delButton.setToolTip("Delete selected entry") self.editKey.setEnabled(False) self.editKey.setMaxLength(40) diff --git a/nw/gui/icons.py b/nw/gui/icons.py index c45a9aaf..35bc8122 100644 --- a/nw/gui/icons.py +++ b/nw/gui/icons.py @@ -29,7 +29,7 @@ import logging import configparser import nw -from os import path +from os import path, listdir from PyQt5.QtCore import QSize from PyQt5.QtSvg import QSvgWidget @@ -90,8 +90,11 @@ class GuiIcons: self.theParent = theParent # Storage - self.qIcons = {} - self.themeMap = {} + self.qIcons = {} + self.themeMap = {} + self.themeList = [] + self.fbackName = "fallback" + self.confName = "icons.conf" # Icon Theme Path self.iconPath = None @@ -121,7 +124,7 @@ class GuiIcons: if path.isdir(checkPath): logger.debug("Loading icon theme '%s'" % self.mainConf.guiIcons) self.iconPath = checkPath - self.confFile = path.join(checkPath, "icons.conf") + self.confFile = path.join(checkPath, self.confName) else: return False @@ -170,7 +173,6 @@ class GuiIcons: """Load graphical decoration element based on the decoration map. This function always returns a QSwgWidget. """ - if decoKey not in self.DECO_MAP: logger.error("Decoration with name '%s' does not exist" % decoKey) return QSvgWidget() @@ -209,6 +211,37 @@ class GuiIcons: qIcon = self.getIcon(iconKey) return qIcon.pixmap(iconSize[0], iconSize[1], QIcon.Normal) + def listThemes(self): + """Scan the icons themes folder and list all themes. + """ + if self.themeList: + return self.themeList + + confParser = configparser.ConfigParser() + for themeDir in listdir(self.mainConf.iconPath): + themePath = path.join(self.mainConf.iconPath, themeDir) + if not path.isdir(themePath) or themeDir == self.fbackName: + continue + themeConf = path.join(themePath, self.confName) + logger.verbose("Checking icon theme config for '%s'" % themeDir) + try: + confParser.read_file(open(themeConf, mode="r", encoding="utf8")) + except Exception as e: + self.theParent.makeAlert(["Could not load theme config file.",str(e)],nwAlert.ERROR) + continue + themeName = "" + if confParser.has_section("Main"): + if confParser.has_option("Main", "name"): + themeName = confParser.get("Main", "name") + logger.verbose("Theme name is '%s'" % themeName) + if themeName != "": + self.themeList.append((themeDir, themeName)) + + self.themeList = sorted(self.themeList, key=lambda x: x[1]) + self.themeList.insert(0, ("default", "System Icons")) + + return self.themeList + ## # Internal Functions ## @@ -238,6 +271,15 @@ class GuiIcons: logger.verbose("Loading icon '%s' from system theme" % iconKey) return QIcon().fromTheme(self.ICON_MAP[iconKey][1]) + # Finally. we check if we have a fallback icon + if self.mainConf.guiDark: + fbackIcon = path.join(self.mainConf.iconPath, self.fbackName, "%s-dark.svg" % iconKey) + else: + fbackIcon = path.join(self.mainConf.iconPath, self.fbackName, "%s.svg" % iconKey) + if path.isfile(fbackIcon): + logger.verbose("Loading icon '%s' from fallback theme" % iconKey) + return QIcon(fbackIcon) + # Give up and return an empty icon logger.warning("Did not load an icon for '%s'" % iconKey) diff --git a/nw/gui/theme.py b/nw/gui/theme.py index b2f11357..31e862e0 100644 --- a/nw/gui/theme.py +++ b/nw/gui/theme.py @@ -260,8 +260,9 @@ class GuiTheme: return True def listThemes(self): - - if len(self.themeList) > 0: + """Scan the gui themes folder and list all themes. + """ + if self.themeList: return self.themeList confParser = configparser.ConfigParser() @@ -275,8 +276,9 @@ class GuiTheme: continue themeName = "" if confParser.has_section("Main"): - themeName = confParser.get("Main","name") - logger.verbose("Theme name is '%s'" % themeName) + if confParser.has_option("Main", "name"): + themeName = confParser.get("Main", "name") + logger.verbose("Theme name is '%s'" % themeName) if themeName != "": self.themeList.append((themeDir, themeName)) @@ -285,8 +287,9 @@ class GuiTheme: return self.themeList def listSyntax(self): - - if len(self.syntaxList) > 0: + """Scan the syntax themes folder and list all themes. + """ + if self.syntaxList: return self.syntaxList confParser = configparser.ConfigParser() @@ -303,7 +306,8 @@ class GuiTheme: return [] syntaxName = "" if confParser.has_section("Main"): - syntaxName = confParser.get("Main","name") + if confParser.has_option("Main", "name"): + syntaxName = confParser.get("Main", "name") if len(syntaxFile) > 5 and syntaxName != "": self.syntaxList.append((syntaxFile[:-5], syntaxName)) logger.verbose("Syntax name is '%s'" % syntaxName) diff --git a/tests/reference/novelwriter.conf b/tests/reference/novelwriter.conf index 7102783d..13c3637a 100644 --- a/tests/reference/novelwriter.conf +++ b/tests/reference/novelwriter.conf @@ -2,6 +2,7 @@ timestamp = 2020-05-01 21:28:25 theme = default syntax = default_light +icons = default guidark = False [Sizes] From 544a9d56bd0470b9ee98dfd8848fbae6e1d5bbdd Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Thu, 14 May 2020 18:46:30 +0200 Subject: [PATCH 7/7] Updated the about box to credit the icon creator. Temporary solution until the box is redesigned. --- nw/gui/mainmenu.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/nw/gui/mainmenu.py b/nw/gui/mainmenu.py index a37ddf0c..c497823a 100644 --- a/nw/gui/mainmenu.py +++ b/nw/gui/mainmenu.py @@ -148,6 +148,7 @@ class GuiMainMenu(QMenuBar): credits = "
".join(["%s%s" % (listPrefix, x) for x in nw.__credits__]), ) theTheme = self.theParent.theTheme + theIcons = self.theParent.theTheme.theIcons if theTheme.themeCredit != "" or theTheme.syntaxCredit != "": aboutMsg += "

GUI Theme and Syntax Highlighting

" aboutMsg += "

" @@ -155,6 +156,10 @@ class GuiMainMenu(QMenuBar): aboutMsg += "%s\"%s\" by %s
" % ( listPrefix, theTheme.themeName, theTheme.themeCredit ) + if theIcons.themeCredit != "": + aboutMsg += "%s\"%s\" by %s
" % ( + listPrefix, theIcons.themeName, theIcons.themeCredit + ) if theTheme.syntaxCredit != "": aboutMsg += "%s\"%s\" by %s
" % ( listPrefix, theTheme.syntaxName, theTheme.syntaxCredit