diff --git a/plover/Plover.config b/plover/Plover.config new file mode 100644 index 000000000..e0284f425 --- /dev/null +++ b/plover/Plover.config @@ -0,0 +1,2 @@ +// Add predefined macros for your project here. For example: +// #define THE_ANSWER 42 diff --git a/plover/Plover.creator b/plover/Plover.creator new file mode 100644 index 000000000..e94cbbd30 --- /dev/null +++ b/plover/Plover.creator @@ -0,0 +1 @@ +[General] diff --git a/plover/Plover.files b/plover/Plover.files new file mode 100644 index 000000000..7d2c57e13 --- /dev/null +++ b/plover/Plover.files @@ -0,0 +1,294 @@ +__pycache__/__init__.cpython-35.pyc +__pycache__/app.cpython-35.pyc +__pycache__/config.cpython-35.pyc +__pycache__/exception.cpython-35.pyc +__pycache__/formatting.cpython-35.pyc +__pycache__/key_combo.cpython-35.pyc +__pycache__/log.cpython-35.pyc +__pycache__/main.cpython-35.pyc +__pycache__/misc.cpython-35.pyc +__pycache__/orthography.cpython-35.pyc +__pycache__/steno.cpython-35.pyc +__pycache__/steno_dictionary.cpython-35.pyc +__pycache__/suggestions.cpython-35.pyc +__pycache__/translation.cpython-35.pyc +assets/american_english_words.txt +assets/commands.json +assets/connected.png +assets/disconnected.png +assets/down.png +assets/main.json +assets/plover-icon.svg +assets/plover.ico +assets/plover.png +assets/refresh.png +assets/remove.png +assets/spinner.gif +assets/up.png +assets/user.json +dictionary/__pycache__/__init__.cpython-35.pyc +dictionary/__pycache__/base.cpython-35.pyc +dictionary/__pycache__/json_dict.cpython-35.pyc +dictionary/__pycache__/loading_manager.cpython-35.pyc +dictionary/__pycache__/rtfcre_dict.cpython-35.pyc +dictionary/__init__.py +dictionary/__init__.pyc +dictionary/base.py +dictionary/base.pyc +dictionary/json_dict.py +dictionary/json_dict.pyc +dictionary/loading_manager.py +dictionary/loading_manager.pyc +dictionary/rtfcre_dict.py +dictionary/rtfcre_dict.pyc +gui/__init__.pyc +gui/add_translation.pyc +gui/config.pyc +gui/dictionary_editor.pyc +gui/keyboard_config.pyc +gui/log.pyc +gui/log_osx.pyc +gui/lookup.pyc +gui/main.pyc +gui/paper_tape.pyc +gui/serial_config.pyc +gui/suggestions.pyc +gui/util.pyc +gui_qt/__pycache__/__init__.cpython-35.pyc +gui_qt/__pycache__/about_dialog.cpython-35.pyc +gui_qt/__pycache__/about_dialog_ui.cpython-35.pyc +gui_qt/__pycache__/add_translation.cpython-35.pyc +gui_qt/__pycache__/add_translation_ui.cpython-35.pyc +gui_qt/__pycache__/config_file_widget_ui.cpython-35.pyc +gui_qt/__pycache__/config_keyboard_widget_ui.cpython-35.pyc +gui_qt/__pycache__/config_serial_widget_ui.cpython-35.pyc +gui_qt/__pycache__/config_window.cpython-35.pyc +gui_qt/__pycache__/config_window_ui.cpython-35.pyc +gui_qt/__pycache__/dictionary_editor.cpython-35.pyc +gui_qt/__pycache__/dictionary_editor_ui.cpython-35.pyc +gui_qt/__pycache__/dictionary_manager.cpython-35.pyc +gui_qt/__pycache__/dictionary_manager_ui.cpython-35.pyc +gui_qt/__pycache__/engine.cpython-35.pyc +gui_qt/__pycache__/i18n.cpython-35.pyc +gui_qt/__pycache__/log_qt.cpython-35.pyc +gui_qt/__pycache__/lookup_dialog.cpython-35.pyc +gui_qt/__pycache__/lookup_dialog_ui.cpython-35.pyc +gui_qt/__pycache__/main.cpython-35.pyc +gui_qt/__pycache__/main_window.cpython-35.pyc +gui_qt/__pycache__/main_window_ui.cpython-35.pyc +gui_qt/__pycache__/paper_tape.cpython-35.pyc +gui_qt/__pycache__/paper_tape_ui.cpython-35.pyc +gui_qt/__pycache__/resources_rc.cpython-35.pyc +gui_qt/__pycache__/suggestions_dialog.cpython-35.pyc +gui_qt/__pycache__/suggestions_dialog_ui.cpython-35.pyc +gui_qt/__pycache__/suggestions_widget.cpython-35.pyc +gui_qt/__pycache__/suggestions_widget_ui.cpython-35.pyc +gui_qt/__pycache__/trayicon.cpython-35.pyc +gui_qt/__pycache__/utils.cpython-35.pyc +gui_qt/messages/fr/LC_MESSAGES/plover.mo +gui_qt/messages/fr/LC_MESSAGES/plover.po +gui_qt/messages/plover.pot +gui_qt/resources/add-translation.svg +gui_qt/resources/add.png +gui_qt/resources/add.svg +gui_qt/resources/books.svg +gui_qt/resources/clear.png +gui_qt/resources/delete.png +gui_qt/resources/delete.svg +gui_qt/resources/dictionary.png +gui_qt/resources/edit.png +gui_qt/resources/erase.svg +gui_qt/resources/font.png +gui_qt/resources/font.svg +gui_qt/resources/lightbulb.png +gui_qt/resources/lightbulb.svg +gui_qt/resources/magnify.svg +gui_qt/resources/new.png +gui_qt/resources/on-top.png +gui_qt/resources/pencil.svg +gui_qt/resources/pin-off.svg +gui_qt/resources/pin.svg +gui_qt/resources/plover.png +gui_qt/resources/preferences.png +gui_qt/resources/refresh.png +gui_qt/resources/refresh.svg +gui_qt/resources/resources.qrc +gui_qt/resources/save.png +gui_qt/resources/save.svg +gui_qt/resources/search.png +gui_qt/resources/settings.svg +gui_qt/resources/state-disabled.png +gui_qt/resources/state-disconnected.png +gui_qt/resources/state-enabled.png +gui_qt/resources/states.xcf +gui_qt/resources/suggestions.png +gui_qt/resources/tape.png +gui_qt/resources/tape.svg +gui_qt/resources/undo.png +gui_qt/resources/undo.svg +gui_qt/__init__.py +gui_qt/about_dialog.py +gui_qt/about_dialog.ui +gui_qt/about_dialog_ui.py +gui_qt/add_translation.py +gui_qt/add_translation.ui +gui_qt/add_translation_ui.py +gui_qt/config_file_widget.ui +gui_qt/config_file_widget_ui.py +gui_qt/config_keyboard_widget.ui +gui_qt/config_keyboard_widget_ui.py +gui_qt/config_serial_widget.ui +gui_qt/config_serial_widget_ui.py +gui_qt/config_window.py +gui_qt/config_window.ui +gui_qt/config_window_ui.py +gui_qt/dictionary_editor.py +gui_qt/dictionary_editor.ui +gui_qt/dictionary_editor_ui.py +gui_qt/dictionary_manager.py +gui_qt/dictionary_manager.ui +gui_qt/dictionary_manager_ui.py +gui_qt/engine.py +gui_qt/i18n.py +gui_qt/log_qt.py +gui_qt/lookup_dialog.py +gui_qt/lookup_dialog.ui +gui_qt/lookup_dialog_ui.py +gui_qt/main.py +gui_qt/main_window.py +gui_qt/main_window.ui +gui_qt/main_window_ui.py +gui_qt/paper_tape.py +gui_qt/paper_tape.ui +gui_qt/paper_tape_ui.py +gui_qt/resources_rc.py +gui_qt/suggestions_dialog.py +gui_qt/suggestions_dialog.ui +gui_qt/suggestions_dialog_ui.py +gui_qt/suggestions_widget.py +gui_qt/suggestions_widget.ui +gui_qt/suggestions_widget_ui.py +gui_qt/trayicon.py +gui_qt/utils.py +gui_wx/__init__.py +gui_wx/__init__.pyc +gui_wx/add_translation.py +gui_wx/add_translation.pyc +gui_wx/config.py +gui_wx/config.pyc +gui_wx/dictionary_editor.py +gui_wx/dictionary_editor.pyc +gui_wx/dictionary_editor_store.py +gui_wx/dictionary_editor_store.pyc +gui_wx/keyboard_config.py +gui_wx/keyboard_config.pyc +gui_wx/log.py +gui_wx/log.pyc +gui_wx/log_wx.py +gui_wx/lookup.py +gui_wx/lookup.pyc +gui_wx/main.py +gui_wx/main.pyc +gui_wx/paper_tape.py +gui_wx/paper_tape.pyc +gui_wx/serial_config.py +gui_wx/serial_config.pyc +gui_wx/suggestions.py +gui_wx/suggestions.pyc +gui_wx/util.py +gui_wx/util.pyc +machine/__pycache__/__init__.cpython-35.pyc +machine/__pycache__/base.cpython-35.pyc +machine/__pycache__/geminipr.cpython-35.pyc +machine/__pycache__/keyboard.cpython-35.pyc +machine/__pycache__/keymap.cpython-35.pyc +machine/__pycache__/passport.cpython-35.pyc +machine/__pycache__/registry.cpython-35.pyc +machine/__pycache__/stentura.cpython-35.pyc +machine/__pycache__/treal.cpython-35.pyc +machine/__pycache__/txbolt.cpython-35.pyc +machine/__init__.py +machine/__init__.pyc +machine/base.py +machine/base.pyc +machine/geminipr.py +machine/geminipr.pyc +machine/keyboard.py +machine/keyboard.pyc +machine/keymap.py +machine/keymap.pyc +machine/passport.py +machine/passport.pyc +machine/registry.py +machine/registry.pyc +machine/stentura.py +machine/stentura.pyc +machine/treal.py +machine/treal.pyc +machine/txbolt.py +machine/txbolt.pyc +oslayer/__pycache__/__init__.cpython-35.pyc +oslayer/__pycache__/config.cpython-35.pyc +oslayer/__pycache__/keyboardcontrol.cpython-35.pyc +oslayer/__pycache__/log_osx.cpython-35.pyc +oslayer/__pycache__/osxkeyboardcontrol.cpython-35.pyc +oslayer/__pycache__/osxkeyboardlayout.cpython-35.pyc +oslayer/__pycache__/processlock.cpython-35.pyc +oslayer/__pycache__/utils.cpython-35.pyc +oslayer/__init__.py +oslayer/__init__.pyc +oslayer/comscan.pyc +oslayer/config.py +oslayer/config.pyc +oslayer/keyboardcontrol.py +oslayer/keyboardcontrol.pyc +oslayer/list_ports_posix.pyc +oslayer/log_dbus.py +oslayer/log_osx.py +oslayer/log_osx.pyc +oslayer/mac_keycode.pyc +oslayer/osxkeyboardcontrol.py +oslayer/osxkeyboardcontrol.pyc +oslayer/osxkeyboardlayout.py +oslayer/osxkeyboardlayout.pyc +oslayer/processlock.py +oslayer/processlock.pyc +oslayer/utils.py +oslayer/winkeyboardcontrol.py +oslayer/winkeyboardlayout.py +oslayer/xkeyboardcontrol.py +system/__pycache__/__init__.cpython-35.pyc +system/__pycache__/english_stenotype.cpython-35.pyc +system/__init__.py +system/__init__.pyc +system/english_stenotype.py +system/english_stenotype.pyc +__init__.py +__init__.pyc +app.py +app.pyc +config.py +config.pyc +dictionary_editor_store.pyc +exception.py +exception.pyc +formatting.py +formatting.pyc +key_combo.py +key_combo.pyc +log.py +log.pyc +main.py +main.pyc +misc.py +misc.pyc +orthography.py +orthography.pyc +steno.py +steno.pyc +steno_dictionary.py +steno_dictionary.pyc +suggestions.py +suggestions.pyc +translation.py +translation.pyc \ No newline at end of file diff --git a/plover/Plover.includes b/plover/Plover.includes new file mode 100644 index 000000000..e69de29bb diff --git a/plover/gui_qt/dictionary_editor.py b/plover/gui_qt/dictionary_editor.py index 6c8019213..8cdd42f3b 100644 --- a/plover/gui_qt/dictionary_editor.py +++ b/plover/gui_qt/dictionary_editor.py @@ -20,8 +20,7 @@ from plover.steno import normalize_steno from plover.gui_qt.dictionary_editor_ui import Ui_DictionaryEditor -from plover.gui_qt.utils import ToolBar, WindowState - +from plover.gui_qt.utils import ToolBar, WindowState, SetSvgIcons DictionaryItem = namedtuple('DictionaryItem', 'strokes translation dictionary') @@ -263,6 +262,7 @@ class DictionaryEditor(QDialog, Ui_DictionaryEditor, WindowState): def __init__(self, engine, dictionary_paths, parent=None): super(DictionaryEditor, self).__init__(parent) self.setupUi(self) + SetSvgIcons(self) self._engine = engine with engine: dictionary_list = [ diff --git a/plover/gui_qt/dictionary_manager.py b/plover/gui_qt/dictionary_manager.py index 5d5bd6bda..70502bf0e 100644 --- a/plover/gui_qt/dictionary_manager.py +++ b/plover/gui_qt/dictionary_manager.py @@ -12,7 +12,7 @@ from plover.gui_qt.dictionary_manager_ui import Ui_DictionaryManager from plover.gui_qt.dictionary_editor import DictionaryEditor -from plover.gui_qt.utils import ToolBar, WindowState +from plover.gui_qt.utils import ToolBar, WindowState, SetSvgIcons class DictionaryManager(QDialog, Ui_DictionaryManager, WindowState): @@ -22,6 +22,7 @@ class DictionaryManager(QDialog, Ui_DictionaryManager, WindowState): def __init__(self, engine): super(DictionaryManager, self).__init__() self.setupUi(self) + SetSvgIcons(self) self._engine = engine self._states = [] self._dictionaries = [] @@ -37,7 +38,6 @@ def __init__(self, engine): self.action_EditDictionaries, self.action_RemoveDictionaries, self.action_AddDictionaries, - self.action_AddTranslation, )) self._update_dictionaries(engine.config['dictionary_file_names'], record=False, save=False) @@ -174,6 +174,3 @@ def on_add_dictionaries(self): if filename not in dictionaries: dictionaries.append(filename) self._update_dictionaries(dictionaries) - - def on_add_translation(self): - self._engine.command_add_translation.emit() diff --git a/plover/gui_qt/dictionary_manager.ui b/plover/gui_qt/dictionary_manager.ui index 68f7c736c..338f58d31 100644 --- a/plover/gui_qt/dictionary_manager.ui +++ b/plover/gui_qt/dictionary_manager.ui @@ -117,21 +117,6 @@ Ctrl+O - - - - :/new.png:/new.png - - - &New translation - - - Add a new translation - - - Ctrl+N - - @@ -218,22 +203,6 @@ - - action_AddTranslation - triggered() - DictionaryManager - on_add_translation() - - - -1 - -1 - - - 199 - 149 - - - table itemDoubleClicked(QTableWidgetItem*) diff --git a/plover/gui_qt/lookup_dialog.py b/plover/gui_qt/lookup_dialog.py index 9716ae419..d30753592 100644 --- a/plover/gui_qt/lookup_dialog.py +++ b/plover/gui_qt/lookup_dialog.py @@ -8,7 +8,7 @@ from plover.gui_qt.lookup_dialog_ui import Ui_LookupDialog from plover.gui_qt.suggestions_widget import SuggestionsWidget -from plover.gui_qt.utils import WindowState +from plover.gui_qt.utils import WindowState, SetSvgIcons class LookupDialog(QDialog, Ui_LookupDialog, WindowState): @@ -18,6 +18,7 @@ class LookupDialog(QDialog, Ui_LookupDialog, WindowState): def __init__(self, engine): super(LookupDialog, self).__init__() self.setupUi(self) + SetSvgIcons(self) suggestions = SuggestionsWidget() self.layout().replaceWidget(self.suggestions, suggestions) self.suggestions = suggestions diff --git a/plover/gui_qt/lookup_dialog.ui b/plover/gui_qt/lookup_dialog.ui index 4415043eb..d87984a69 100644 --- a/plover/gui_qt/lookup_dialog.ui +++ b/plover/gui_qt/lookup_dialog.ui @@ -22,73 +22,50 @@ true - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel - - - + + + 6 + + + 6 + + + 6 + + + 6 + - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + pattern + pattern + pattern + + + - - buttonBox - accepted() - LookupDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - LookupDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - pattern textEdited(QString) diff --git a/plover/gui_qt/main.py b/plover/gui_qt/main.py index c993afb49..5cd67481f 100644 --- a/plover/gui_qt/main.py +++ b/plover/gui_qt/main.py @@ -12,6 +12,7 @@ QLibraryInfo, QTimer, QTranslator, + Qt, ) from PyQt5.QtWidgets import QApplication, QMessageBox @@ -42,6 +43,7 @@ def __init__(self, config, use_qt_notifications): QCoreApplication.setOrganizationDomain('openstenoproject.org') self._app = QApplication(sys.argv[:1]) + self._app.setAttribute(Qt.AA_UseHighDpiPixmaps) # Enable localization of standard Qt controls. self._translator = QTranslator() diff --git a/plover/gui_qt/main_window.py b/plover/gui_qt/main_window.py index d3de7c7d8..d0a6b4bdb 100644 --- a/plover/gui_qt/main_window.py +++ b/plover/gui_qt/main_window.py @@ -23,7 +23,7 @@ from plover.gui_qt.about_dialog import AboutDialog from plover.gui_qt.paper_tape import PaperTape from plover.gui_qt.trayicon import TrayIcon -from plover.gui_qt.utils import WindowState, find_menu_actions +from plover.gui_qt.utils import WindowState, find_menu_actions, SetSvgIcons class MainWindow(QMainWindow, Ui_MainWindow, WindowState): @@ -33,6 +33,7 @@ class MainWindow(QMainWindow, Ui_MainWindow, WindowState): def __init__(self, engine, use_qt_notifications): super(MainWindow, self).__init__() self.setupUi(self) + SetSvgIcons(self) self._engine = engine self._active_dialogs = {} self._dialog_class = { diff --git a/plover/gui_qt/main_window.ui b/plover/gui_qt/main_window.ui index 24a143557..17019c212 100644 --- a/plover/gui_qt/main_window.ui +++ b/plover/gui_qt/main_window.ui @@ -9,8 +9,8 @@ 0 0 - 258 - 124 + 323 + 159 @@ -26,6 +26,15 @@ :/plover.png:/plover.png + + + 48 + 48 + + + + true + @@ -67,8 +76,8 @@ 0 0 - 258 - 19 + 323 + 22 @@ -108,6 +117,18 @@ Plover: Toolbar + + false + + + + 24 + 24 + + + + false + TopToolBarArea @@ -136,7 +157,7 @@ - :/preferences.png:/preferences.png + :/settings.svg:/settings.svg &Configure @@ -151,7 +172,7 @@ - :/new.png:/new.png + :/add-translation.svg:/add-translation.svg &New translation @@ -166,7 +187,7 @@ - :/search.png:/search.png + :/magnify.svg:/magnify.svg &Lookup @@ -181,7 +202,7 @@ - :/dictionary.png:/dictionary.png + :/books.svg:/books.svg Manage &dictionaries @@ -196,7 +217,7 @@ - :/tape.png:/tape.png + :/tape.svg:/tape.svg Paper &tape @@ -211,7 +232,7 @@ - :/suggestions.png:/suggestions.png + :/lightbulb.png:/lightbulb.png &Suggestions @@ -234,7 +255,7 @@ - :/refresh.png:/refresh.png + :/refresh.svg:/refresh.svg R&econnect machine diff --git a/plover/gui_qt/paper_tape.py b/plover/gui_qt/paper_tape.py index f060a0ffa..e9d910e34 100644 --- a/plover/gui_qt/paper_tape.py +++ b/plover/gui_qt/paper_tape.py @@ -13,7 +13,7 @@ from plover import system from plover.gui_qt.paper_tape_ui import Ui_PaperTape -from plover.gui_qt.utils import ToolBar, WindowState +from plover.gui_qt.utils import ToolBar, WindowState, SetSvgIcons class PaperTape(QDialog, Ui_PaperTape, WindowState): @@ -26,6 +26,7 @@ class PaperTape(QDialog, Ui_PaperTape, WindowState): def __init__(self, engine): super(PaperTape, self).__init__() self.setupUi(self) + SetSvgIcons(self) self._engine = engine self._strokes = [] self._all_keys = None diff --git a/plover/gui_qt/paper_tape.ui b/plover/gui_qt/paper_tape.ui index dae89d761..8b34235d3 100644 --- a/plover/gui_qt/paper_tape.ui +++ b/plover/gui_qt/paper_tape.ui @@ -22,6 +22,18 @@ true + + 6 + + + 6 + + + 6 + + + 6 + @@ -106,7 +118,8 @@ - :/on-top.png:/on-top.png + :/pin.svg + :/pin-off.svg:/pin.svg &Toggle "always on top" diff --git a/plover/gui_qt/resources/add-translation.svg b/plover/gui_qt/resources/add-translation.svg new file mode 100644 index 000000000..d7cb59249 --- /dev/null +++ b/plover/gui_qt/resources/add-translation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plover/gui_qt/resources/add.svg b/plover/gui_qt/resources/add.svg new file mode 100644 index 000000000..2c2183906 --- /dev/null +++ b/plover/gui_qt/resources/add.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plover/gui_qt/resources/books.svg b/plover/gui_qt/resources/books.svg new file mode 100644 index 000000000..6af092bef --- /dev/null +++ b/plover/gui_qt/resources/books.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plover/gui_qt/resources/delete.svg b/plover/gui_qt/resources/delete.svg new file mode 100644 index 000000000..f9daefe90 --- /dev/null +++ b/plover/gui_qt/resources/delete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plover/gui_qt/resources/erase.svg b/plover/gui_qt/resources/erase.svg new file mode 100644 index 000000000..779906e97 --- /dev/null +++ b/plover/gui_qt/resources/erase.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plover/gui_qt/resources/font.svg b/plover/gui_qt/resources/font.svg new file mode 100644 index 000000000..52ca41d2f --- /dev/null +++ b/plover/gui_qt/resources/font.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plover/gui_qt/resources/lightbulb.png b/plover/gui_qt/resources/lightbulb.png new file mode 100644 index 000000000..ff9ece2c0 Binary files /dev/null and b/plover/gui_qt/resources/lightbulb.png differ diff --git a/plover/gui_qt/resources/lightbulb.svg b/plover/gui_qt/resources/lightbulb.svg new file mode 100644 index 000000000..25a9978fb --- /dev/null +++ b/plover/gui_qt/resources/lightbulb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plover/gui_qt/resources/magnify.svg b/plover/gui_qt/resources/magnify.svg new file mode 100644 index 000000000..eb425711f --- /dev/null +++ b/plover/gui_qt/resources/magnify.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plover/gui_qt/resources/pencil.svg b/plover/gui_qt/resources/pencil.svg new file mode 100644 index 000000000..0d661d6eb --- /dev/null +++ b/plover/gui_qt/resources/pencil.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plover/gui_qt/resources/pin-off.svg b/plover/gui_qt/resources/pin-off.svg new file mode 100644 index 000000000..07221c1cc --- /dev/null +++ b/plover/gui_qt/resources/pin-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plover/gui_qt/resources/pin.svg b/plover/gui_qt/resources/pin.svg new file mode 100644 index 000000000..228403698 --- /dev/null +++ b/plover/gui_qt/resources/pin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plover/gui_qt/resources/refresh.svg b/plover/gui_qt/resources/refresh.svg new file mode 100644 index 000000000..ebe3f16e7 --- /dev/null +++ b/plover/gui_qt/resources/refresh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plover/gui_qt/resources/resources.qrc b/plover/gui_qt/resources/resources.qrc index ab6663d09..c2263184b 100644 --- a/plover/gui_qt/resources/resources.qrc +++ b/plover/gui_qt/resources/resources.qrc @@ -1,23 +1,41 @@ - - suggestions.png - font.png - tape.png - on-top.png - save.png - clear.png - new.png - delete.png - undo.png - edit.png - dictionary.png - add.png - search.png - preferences.png - state-disabled.png - state-disconnected.png - state-enabled.png - refresh.png - plover.png - + + suggestions.png + font.png + tape.png + on-top.png + save.png + clear.png + new.png + delete.png + undo.png + edit.png + dictionary.png + add.png + search.png + preferences.png + state-disabled.png + state-disconnected.png + state-enabled.png + refresh.png + plover.png + pin.svg + pin-off.svg + delete.svg + resources.qrc + undo.svg + tape.svg + font.svg + erase.svg + settings.svg + books.svg + add-translation.svg + magnify.svg + add.svg + refresh.svg + save.svg + lightbulb.svg + lightbulb.png + pencil.svg + diff --git a/plover/gui_qt/resources/save.svg b/plover/gui_qt/resources/save.svg new file mode 100644 index 000000000..bbd8d5910 --- /dev/null +++ b/plover/gui_qt/resources/save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plover/gui_qt/resources/settings.svg b/plover/gui_qt/resources/settings.svg new file mode 100644 index 000000000..731a5a76a --- /dev/null +++ b/plover/gui_qt/resources/settings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plover/gui_qt/resources/tape.svg b/plover/gui_qt/resources/tape.svg new file mode 100644 index 000000000..2d6d4793c --- /dev/null +++ b/plover/gui_qt/resources/tape.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plover/gui_qt/resources/undo.svg b/plover/gui_qt/resources/undo.svg new file mode 100644 index 000000000..5b3ec9cc1 --- /dev/null +++ b/plover/gui_qt/resources/undo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plover/gui_qt/suggestions_dialog.py b/plover/gui_qt/suggestions_dialog.py index 2b0385eb9..8f0ab474d 100644 --- a/plover/gui_qt/suggestions_dialog.py +++ b/plover/gui_qt/suggestions_dialog.py @@ -12,13 +12,14 @@ QFontDialog, QDialog, QMenu, + QStyleFactory, ) from plover.suggestions import Suggestion from plover.gui_qt.suggestions_dialog_ui import Ui_SuggestionsDialog from plover.gui_qt.suggestions_widget import SuggestionsWidget -from plover.gui_qt.utils import ToolBar, WindowState +from plover.gui_qt.utils import ToolBar, WindowState, SetSvgIcons class SuggestionsDialog(QDialog, Ui_SuggestionsDialog, WindowState): @@ -38,6 +39,7 @@ class SuggestionsDialog(QDialog, Ui_SuggestionsDialog, WindowState): def __init__(self, engine): super(SuggestionsDialog, self).__init__() self.setupUi(self) + SetSvgIcons(self) suggestions = SuggestionsWidget() self.layout().replaceWidget(self.suggestions, suggestions) self.suggestions = suggestions @@ -45,11 +47,13 @@ def __init__(self, engine): self._words = u'' self._last_suggestions = None # Toolbar. - self.layout().addWidget(ToolBar( - self.action_ToggleOnTop, - self.action_SelectFont, - self.action_Clear, - )) + self.layout().addWidget( + ToolBar( + self.action_ToggleOnTop, + self.action_SelectFont, + self.action_Clear, + ) + ) self.action_Clear.setEnabled(False) # Font popup menu. self._font_menu = QMenu() diff --git a/plover/gui_qt/suggestions_dialog.ui b/plover/gui_qt/suggestions_dialog.ui index 230942dcd..aa21f6ef9 100644 --- a/plover/gui_qt/suggestions_dialog.ui +++ b/plover/gui_qt/suggestions_dialog.ui @@ -22,6 +22,18 @@ true + + 6 + + + 6 + + + 6 + + + 6 + diff --git a/plover/gui_qt/suggestions_widget.ui b/plover/gui_qt/suggestions_widget.ui index 5cb4b03a9..0710a7a64 100644 --- a/plover/gui_qt/suggestions_widget.ui +++ b/plover/gui_qt/suggestions_widget.ui @@ -14,6 +14,18 @@ Form + + 0 + + + 0 + + + 0 + + + 0 + diff --git a/plover/gui_qt/trayicon.py b/plover/gui_qt/trayicon.py index 805d272be..05ab8848a 100644 --- a/plover/gui_qt/trayicon.py +++ b/plover/gui_qt/trayicon.py @@ -6,6 +6,8 @@ from plover import __name__ as __software_name__ from plover import log +import sys + class TrayIcon(QObject): @@ -20,7 +22,9 @@ def __init__(self): 'disabled', 'enabled', ): - self._state_icons[state] = QIcon(':/state-%s.png' % state) + icon = QIcon(':/state-%s.png' % state) + icon.setIsMask(True) + self._state_icons[state] = icon self._machine = None self._machine_state = 'disconnected' self._is_running = False @@ -61,7 +65,8 @@ def enable(self): if not self._supported: return self._trayicon = QSystemTrayIcon() - self._trayicon.activated.connect(self._on_activated) + if not sys.platform.startswith('darwin'): + self._trayicon.activated.connect(self._on_activated) self._enabled = True self._update_state() self._trayicon.show() diff --git a/plover/gui_qt/utils.py b/plover/gui_qt/utils.py index b36273ba6..14fd2ff9e 100644 --- a/plover/gui_qt/utils.py +++ b/plover/gui_qt/utils.py @@ -1,11 +1,77 @@ -from PyQt5.QtCore import QSettings +from PyQt5.QtCore import QSettings, QSize, Qt, QRectF from PyQt5.QtWidgets import ( QMainWindow, QMenu, QToolBar, QToolButton, + QStyleFactory, ) +from PyQt5.QtGui import QIcon, QPixmap, QPainter +from PyQt5.QtSvg import QSvgRenderer + +import sys + +action_icons = { + 'action_Clear': ':/erase.svg', + 'action_Save': ':/save.svg', + 'action_ToggleOnTop': ':/pin.svg', + 'action_ToggleOnTop_off': ':/pin-off.svg', + 'action_SelectFont': ':/font.svg', + 'action_Configure': ':/settings.svg', + 'action_Reconnect': ':/refresh.svg', + 'action_AddTranslation': ':/add-translation.svg', + 'action_Lookup': ':/magnify.svg', + 'action_ManageDictionaries': ':/books.svg', + 'action_PaperTape': ':/tape.svg', + 'action_Suggestions': ':/lightbulb.svg', + 'action_Delete': ':/delete.svg', + 'action_New': ':/add.svg', + 'action_Undo': ':/undo.svg', + 'action_EditDictionaries': ':/pencil.svg', + 'action_RemoveDictionaries': ':/delete.svg', + 'action_AddDictionaries': ':/add.svg', +} + +def SetSvgIcons(widget): + for action in [a for a in dir(widget) if a.startswith('action_')]: + icon_path = action_icons.get(action) + button = getattr(widget, action) + if action is 'action_ToggleOnTop': + icon = QIcon() + icon.addPixmap( + GetSvgPixmap(action_icons.get('action_ToggleOnTop_off')), + QIcon.Normal, + QIcon.Off + ) + icon.addPixmap( + GetSvgPixmap(icon_path), + QIcon.Normal, + QIcon.On + ) + button.setIcon(icon) + button.setObjectName(action) + elif icon_path is not None: + icon = QIcon() + icon.addPixmap(GetSvgPixmap(icon_path)) + button.setIcon(icon) + button.setObjectName(action) + + + +def GetSvgPixmap(icon_path, color=None): + renderer = QSvgRenderer(icon_path) + icon_pixmap = QPixmap(48, 48) + icon_pixmap.fill(Qt.transparent) + renderer.render(QPainter(icon_pixmap), QRectF(icon_pixmap.rect())) + + # Colorize the icon if desired + if color is not None: + painter = QPainter(icon_pixmap) + painter.setCompositionMode(QPainter.CompositionMode_SourceIn) + painter.fillRect(icon_pixmap.rect(), Qt.red) + painter.end() + return icon_pixmap def ToolButton(action): @@ -18,6 +84,9 @@ def ToolBar(*action_list): toolbar = QToolBar() for action in action_list: toolbar.addWidget(ToolButton(action)) + if sys.platform.startswith('darwin'): + toolbar.setStyle(QStyleFactory.create('windows')) + toolbar.setIconSize(QSize(24, 24)) return toolbar