Skip to content

Commit 3333cb6

Browse files
committed
Support resizing gui font
1 parent d109ec8 commit 3333cb6

File tree

8 files changed

+214
-27
lines changed

8 files changed

+214
-27
lines changed

preditor/gui/console.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,11 @@ def codeHighlighter(self):
165165
"""
166166
return self._uiCodeHighlighter
167167

168+
def contextMenuEvent(self, event):
169+
menu = self.createStandardContextMenu()
170+
menu.setFont(self.window().font())
171+
menu.exec(self.mapToGlobal(event.pos()))
172+
168173
def doubleSingleShotSetScrollValue(self, origPercent):
169174
"""This double QTimer.singleShot monkey business seems to be the only way
170175
to get scroll.maximum() to update properly so that we calc newValue

preditor/gui/drag_tab_bar.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
QFileDialog,
1212
QInputDialog,
1313
QMenu,
14+
QSizePolicy,
1415
QStyle,
1516
QStyleOptionTab,
1617
QTabBar,
@@ -353,6 +354,7 @@ def tab_menu(self, pos, popup=True):
353354
if self._context_menu_tab == -1:
354355
return
355356
menu = QMenu(self)
357+
menu.setFont(self.window().font())
356358

357359
grouped_tab = self.parentWidget()
358360
workbox = grouped_tab.widget(self._context_menu_tab)
@@ -520,6 +522,10 @@ def install_tab_widget(cls, tab_widget, mime_type='DragTabBar', menu=True):
520522
tab_widget.setMovable(True)
521523
tab_widget.setDocumentMode(True)
522524

525+
sizePolicy = tab_widget.sizePolicy()
526+
sizePolicy.setVerticalPolicy(QSizePolicy.Policy.Preferred)
527+
tab_widget.setSizePolicy(sizePolicy)
528+
523529
if menu:
524530
bar.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
525531
bar.customContextMenuRequested.connect(bar.tab_menu)

preditor/gui/group_tab_widget/__init__.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@
33
from pathlib import Path
44

55
from Qt.QtCore import Qt
6-
from Qt.QtGui import QIcon
7-
from Qt.QtWidgets import QHBoxLayout, QMessageBox, QToolButton, QWidget
6+
from Qt.QtWidgets import QHBoxLayout, QMessageBox, QSizePolicy, QToolButton, QWidget
87

9-
from ... import resourcePath
108
from ...prefs import VersionTypes, get_backup_version_info
119
from ..drag_tab_bar import DragTabBar
1210
from ..workbox_text_edit import WorkboxTextEdit
@@ -16,10 +14,10 @@
1614

1715
DEFAULT_STYLE_SHEET = """
1816
/* Make the two buttons in the GroupTabWidget take up the
19-
same horizontal space as the GroupedTabWidget's buttons. */
17+
same horizontal space as the GroupedTabWidget's buttons.
2018
GroupTabWidget>QTabBar::tab{
2119
max-height: 1.5em;
22-
}
20+
}*/
2321
/* We have an icon, no need to show the menu indicator */
2422
#group_tab_widget_menu_btn::menu-indicator{
2523
width: 0px;
@@ -51,26 +49,37 @@ def __init__(self, editor_kwargs=None, core_name=None, *args, **kwargs):
5149
corner = QWidget(self)
5250
lyt = QHBoxLayout(corner)
5351
lyt.setSpacing(0)
54-
lyt.setContentsMargins(0, 0, 0, 0)
52+
lyt.setContentsMargins(0, 5, 0, 0)
5553

5654
corner.uiNewTabBTN = QToolButton(corner)
5755
corner.uiNewTabBTN.setObjectName('group_tab_widget_new_btn')
5856
corner.uiNewTabBTN.setText('+')
59-
corner.uiNewTabBTN.setIcon(QIcon(resourcePath('img/file-plus.png')))
6057
corner.uiNewTabBTN.released.connect(lambda: self.add_new_tab(None))
58+
6159
lyt.addWidget(corner.uiNewTabBTN)
6260

6361
corner.uiMenuBTN = QToolButton(corner)
64-
corner.uiMenuBTN.setIcon(QIcon(resourcePath('img/chevron-down.png')))
62+
corner.uiMenuBTN.setText('\u2630')
6563
corner.uiMenuBTN.setObjectName('group_tab_widget_menu_btn')
6664
corner.uiMenuBTN.setPopupMode(QToolButton.ToolButtonPopupMode.InstantPopup)
6765
corner.uiCornerMENU = GroupTabMenu(self, parent=corner.uiMenuBTN)
6866
corner.uiMenuBTN.setMenu(corner.uiCornerMENU)
67+
68+
self.adjustSizePolicy(corner)
69+
self.adjustSizePolicy(corner.uiNewTabBTN)
70+
self.adjustSizePolicy(corner.uiMenuBTN)
71+
self.adjustSizePolicy(corner.uiCornerMENU)
72+
6973
lyt.addWidget(corner.uiMenuBTN)
7074

7175
self.uiCornerBTN = corner
7276
self.setCornerWidget(self.uiCornerBTN, Qt.Corner.TopRightCorner)
7377

78+
def adjustSizePolicy(self, button):
79+
sp = button.sizePolicy()
80+
sp.setVerticalPolicy(QSizePolicy.Policy.Preferred)
81+
button.setSizePolicy(sp)
82+
7483
def add_new_tab(self, group, title=None, prefs=None):
7584
"""Adds a new tab to the requested group, creating the group if the group
7685
doesn't exist.
@@ -110,6 +119,7 @@ def add_new_tab(self, group, title=None, prefs=None):
110119
editor = parent.add_new_editor(title, prefs)
111120
self.setCurrentIndex(self.indexOf(parent))
112121
self.window().focusToWorkbox()
122+
self.tabBar().setFont(self.window().font())
113123
return parent, editor
114124

115125
def all_widgets(self):

preditor/gui/group_tab_widget/grouped_tab_widget.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
from __future__ import absolute_import
22

33
from Qt.QtCore import Qt
4-
from Qt.QtGui import QIcon
54
from Qt.QtWidgets import QMessageBox, QToolButton
65

7-
from ... import resourcePath
86
from ...prefs import VersionTypes
97
from ..drag_tab_bar import DragTabBar
108
from ..workbox_text_edit import WorkboxTextEdit
@@ -24,7 +22,6 @@ def __init__(self, editor_kwargs, editor_cls=None, core_name=None, *args, **kwar
2422

2523
self.uiCornerBTN = QToolButton(self)
2624
self.uiCornerBTN.setText('+')
27-
self.uiCornerBTN.setIcon(QIcon(resourcePath('img/file-plus.png')))
2825
self.uiCornerBTN.released.connect(lambda: self.add_new_editor())
2926
self.setCornerWidget(self.uiCornerBTN, Qt.Corner.TopRightCorner)
3027

preditor/gui/group_tab_widget/one_tab_widget.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def get_next_available_tab_name(self, name):
6060
def addTab(self, *args, **kwargs): # noqa: N802
6161
ret = super(OneTabWidget, self).addTab(*args, **kwargs)
6262
self.update_closable_tabs()
63+
self.tabBar().setFont(self.window().font())
6364
return ret
6465

6566
def close_tab(self, index):

preditor/gui/loggerwindow.py

Lines changed: 128 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@
2323
QApplication,
2424
QFontDialog,
2525
QInputDialog,
26+
QMenu,
2627
QMessageBox,
2728
QTextBrowser,
2829
QTextEdit,
30+
QToolButton,
2931
QToolTip,
3032
QVBoxLayout,
3133
)
@@ -156,13 +158,29 @@ def __init__(self, parent, name=None, run_workbox=False, standalone=False):
156158
self.uiAutoCompleteCaseSensitiveACT.toggled.connect(self.setCaseSensitive)
157159

158160
self.uiSelectMonospaceFontACT.triggered.connect(
159-
partial(self.selectFont, monospace=True)
161+
partial(self.selectFont, origFont=None, monospace=True)
160162
)
161163
self.uiSelectProportionalFontACT.triggered.connect(
162-
partial(self.selectFont, proportional=True)
164+
partial(self.selectFont, origFont=None, proportional=True)
163165
)
164166
self.uiSelectAllFontACT.triggered.connect(
165-
partial(self.selectFont, monospace=True, proportional=True)
167+
partial(self.selectFont, origFont=None, monospace=True, proportional=True)
168+
)
169+
self.uiSelectGuiFontsMENU.triggered.connect(
170+
partial(self.selectGuiFont, monospace=True, proportional=True)
171+
)
172+
173+
self.uiDecreaseCodeFontSizeACT.triggered.connect(
174+
partial(self.adjustFontSize, "Code", -1)
175+
)
176+
self.uiIncreaseCodeFontSizeACT.triggered.connect(
177+
partial(self.adjustFontSize, "Code", 1)
178+
)
179+
self.uiDecreaseGuiFontSizeACT.triggered.connect(
180+
partial(self.adjustFontSize, "Gui", -1)
181+
)
182+
self.uiIncreaseGuiFontSizeACT.triggered.connect(
183+
partial(self.adjustFontSize, "Gui", 1)
166184
)
167185

168186
# Setup ability to cycle completer mode, and create action for each mode
@@ -675,7 +693,17 @@ def getPrevCommand(self):
675693

676694
def wheelEvent(self, event):
677695
"""adjust font size on ctrl+scrollWheel"""
678-
if event.modifiers() == Qt.KeyboardModifier.ControlModifier:
696+
mods = event.modifiers()
697+
ctrl = Qt.KeyboardModifier.ControlModifier
698+
shift = Qt.KeyboardModifier.ShiftModifier
699+
alt = Qt.KeyboardModifier.AltModifier
700+
701+
# Assign mods by functionality. Using shift | alt for gui, because just shift or
702+
# just alt has existing functionality which also processes.
703+
code_font_mod = ctrl
704+
gui_font_mod = shift | alt
705+
706+
if mods == code_font_mod or mods == gui_font_mod:
679707
# WheelEvents can be emitted in a cluster, but we only want one at a time
680708
# (ie to change font size by 1, rather than 2 or 3). Let's bail if previous
681709
# font-resize wheel event was within a certain threshhold.
@@ -690,20 +718,43 @@ def wheelEvent(self, event):
690718
if hasattr(event, 'delta'): # Qt4
691719
delta = event.delta()
692720
else: # QT5
693-
delta = event.angleDelta().y()
721+
# Also holding alt reverses the data in angleDelta (!?), so transpose to
722+
# get correct value
723+
angleDelta = event.angleDelta()
724+
if mods == gui_font_mod:
725+
angleDelta = angleDelta.transposed()
726+
delta = angleDelta.y()
694727

695728
# convert delta to +1 or -1, depending
696729
delta = delta // abs(delta)
697730
minSize = 5
698731
maxSize = 50
699-
font = self.console().font()
732+
if mods == code_font_mod:
733+
font = self.console().font()
734+
elif mods == gui_font_mod:
735+
font = self.font()
700736
newSize = font.pointSize() + delta
701737
newSize = max(min(newSize, maxSize), minSize)
702738

703-
self.setFontSize(newSize)
739+
# If only ctrl was pressed, adjust code font size, otherwise adjust gui font
740+
# size
741+
if mods == code_font_mod:
742+
self.setFontSize(newSize)
743+
elif mods == gui_font_mod:
744+
self.setGuiFont(newSize=newSize)
704745
else:
705746
Window.wheelEvent(self, event)
706747

748+
def adjustFontSize(self, kind, delta):
749+
if kind == "Code":
750+
size = self.console().font().pointSize()
751+
size += delta
752+
self.setFontSize(size)
753+
else:
754+
size = self.font().pointSize()
755+
size += delta
756+
self.setGuiFont(newSize=size)
757+
707758
def handleMenuHovered(self, action):
708759
"""Qt4 doesn't have a ToolTipsVisible method, so we fake it"""
709760
# Don't show if it's just the text of the action
@@ -721,15 +772,18 @@ def handleMenuHovered(self, action):
721772
menu = action.parent()
722773
QToolTip.showText(QCursor.pos(), text, menu)
723774

724-
def selectFont(self, monospace=False, proportional=False):
775+
def selectFont(
776+
self, origFont=None, monospace=False, proportional=False, doGui=False
777+
):
725778
"""Present a QFontChooser dialog, offering, monospace, proportional, or all
726779
fonts, based on user choice. If a font is chosen, set it on the console and
727780
workboxes.
728781
729782
Args:
730783
action (QAction): menu action associated with chosen font
731784
"""
732-
origFont = self.console().font()
785+
if origFont is None:
786+
origFont = self.console().font()
733787
curFontFamily = origFont.family()
734788

735789
if monospace and proportional:
@@ -750,9 +804,45 @@ def selectFont(self, monospace=False, proportional=False):
750804
newFont, okClicked = QFontDialog.getFont(origFont, self, title, options=options)
751805

752806
if okClicked:
753-
self.console().setConsoleFont(newFont)
754-
self.setWorkboxFontBasedOnConsole()
755-
self.setEditorChooserFontBasedOnConsole()
807+
if doGui:
808+
self.setGuiFont(newFont=newFont)
809+
else:
810+
self.console().setConsoleFont(newFont)
811+
self.setWorkboxFontBasedOnConsole()
812+
self.setEditorChooserFontBasedOnConsole()
813+
814+
def selectGuiFont(self, monospace=True, proportional=True):
815+
font = self.font()
816+
self.selectFont(
817+
origFont=font, monospace=monospace, proportional=proportional, doGui=True
818+
)
819+
820+
def setGuiFont(self, newSize=None, newFont=None):
821+
current = self.uiWorkboxTAB.currentWidget()
822+
if not current:
823+
return
824+
825+
tabbar_class = current.tabBar().__class__
826+
menubar_class = self.menuBar().__class__
827+
label_class = self.uiStatusLBL.__class__
828+
children = self.findChildren(tabbar_class, QtCore.QRegExp(".*"))
829+
children.extend(self.findChildren(menubar_class, QtCore.QRegExp(".*")))
830+
children.extend(self.findChildren(label_class, QtCore.QRegExp(".*")))
831+
children.extend(self.findChildren(QToolButton, QtCore.QRegExp(".*")))
832+
children.extend(self.findChildren(QMenu, QtCore.QRegExp(".*")))
833+
children.extend(self.findChildren(QToolTip, QtCore.QRegExp(".*")))
834+
835+
for child in children:
836+
if newFont is None:
837+
newFont = child.font()
838+
if newSize is None:
839+
newSize = newFont.pointSize()
840+
newFont.setPointSize(newSize)
841+
child.setFont(newFont)
842+
# child.resize()
843+
self.setFont(newFont)
844+
QToolTip.setFont(newFont)
845+
# self.resize()
756846

757847
def setFontSize(self, newSize):
758848
"""Update the font size in the console and current workbox.
@@ -1050,7 +1140,22 @@ def keyPressEvent(self, event):
10501140
| Qt.KeyboardModifier.ControlModifier
10511141
| Qt.KeyboardModifier.ShiftModifier
10521142
):
1053-
pass
1143+
1144+
kind = None
1145+
if event.modifiers() & Qt.Key.Key_Control:
1146+
kind = "Code"
1147+
elif event.modifiers() & Qt.Key.Key_Alt:
1148+
kind = "Gui"
1149+
1150+
delta = None
1151+
if event.key() & Qt.Key.Key_Plus:
1152+
delta = 1
1153+
elif event.key() & Qt.Key.Key_Minus:
1154+
delta = -1
1155+
1156+
if kind and delta:
1157+
self.adjustFontSize(kind, delta)
1158+
10541159
else:
10551160
super(LoggerWindow, self).keyPressEvent(event)
10561161

@@ -1087,6 +1192,7 @@ def recordPrefs(self, manual=False):
10871192
'wordWrap': self.uiWordWrapACT.isChecked(),
10881193
'clearBeforeRunning': self.uiClearBeforeRunningACT.isChecked(),
10891194
'toolbarStates': str(self.saveState().toHex(), 'utf-8'),
1195+
'guiFont': self.font().toString(),
10901196
'consoleFont': self.console().font().toString(),
10911197
'uiAutoSaveSettingssACT': self.uiAutoSaveSettingssACT.isChecked(),
10921198
'uiAutoPromptACT': self.uiAutoPromptACT.isChecked(),
@@ -1369,12 +1475,18 @@ def restorePrefs(self, skip_geom=False):
13691475
# Ensure the correct workbox stack page is shown
13701476
self.update_workbox_stack()
13711477

1372-
_font = pref.get('consoleFont', None)
1373-
if _font:
1478+
fontStr = pref.get('consoleFont', None)
1479+
if fontStr:
13741480
font = QFont()
1375-
if QtCompat.QFont.fromString(font, _font):
1481+
if QtCompat.QFont.fromString(font, fontStr):
13761482
self.console().setConsoleFont(font)
13771483

1484+
guiFontStr = pref.get('guiFont', None)
1485+
if guiFontStr:
1486+
guiFont = QFont()
1487+
if guiFont.fromString(guiFontStr):
1488+
self.setGuiFont(newFont=guiFont)
1489+
13781490
self.dont_ask_again = pref.get('dont_ask_again', [])
13791491

13801492
# Allow any plugins to restore their own preferences

0 commit comments

Comments
 (0)