Skip to content

Commit 0b42923

Browse files
committed
Issue #72: Node [Panel] Redesign
- Initial Tests...
1 parent 1a917c6 commit 0b42923

File tree

2 files changed

+257
-10
lines changed

2 files changed

+257
-10
lines changed

Lib/typerig/proxy/fl/gui/widgets.py

+126-10
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@
1818
import os
1919
import fontlab as fl6
2020

21-
from PythonQt import QtCore
22-
from typerig.proxy.fl.gui import QtGui
21+
from PythonQt import QtCore, QtGui
22+
#from typerig.proxy.fl.gui import QtGui
2323

2424
from typerig.proxy.fl.application.app import pWorkspace
2525
from typerig.proxy.fl.objects.font import pFont
2626
from typerig.proxy.fl.objects.glyph import eGlyph
2727

2828
# - Init ----------------------------------
29-
__version__ = '0.3.4'
29+
__version__ = '0.3.6'
3030

3131
# - Keep compatibility for basestring checks
3232
try:
@@ -142,7 +142,7 @@ def FLIconButton(button_text, icon_path, icon_size=32, checkable=False):
142142

143143
# -- Miniwidgets --------------------------
144144
class CustomSpinButton(QtGui.QWidget):
145-
def __init__(button_text, init_values=(0., 100., 0., 1.), tooltip=(None, None), obj_name=(None, None)):
145+
def __init__(self, button_text, init_values=(0., 100., 0., 1.), tooltip=(None, None), obj_name=(None, None)):
146146
super(CustomSpinButton, self).__init__()
147147

148148
# - Init
@@ -151,30 +151,31 @@ def __init__(button_text, init_values=(0., 100., 0., 1.), tooltip=(None, None),
151151
# - Widgets
152152
self.button = QtGui.QPushButton(button_text)
153153

154-
self.input = QtGui.QtGui.QDoubleSpinBox()
154+
self.input = QtGui.QDoubleSpinBox()
155155
self.input.setMinimum(spb_min)
156156
self.input.setMaximum(spb_max)
157157
self.input.setValue(spb_value)
158158
self.input.setSingleStep(spb_step)
159159

160160
if len(tooltip) == 2:
161161
if tooltip[0] is not None:
162-
self.input.setToolTip(tooltip)
162+
self.input.setToolTip(tooltip[0])
163163

164164
if tooltip[1] is not None:
165-
self.button.setToolTip(tooltip)
165+
self.button.setToolTip(tooltip[1])
166166

167-
if len(tooltip) == 2:
167+
if len(obj_name) == 2:
168168
if obj_name[0] is not None:
169-
self.input.setObjectName(obj_name)
169+
self.input.setObjectName(obj_name[0])
170170

171171
if obj_name[1] is not None:
172-
self.button.setObjectName(obj_name)
172+
self.button.setObjectName(obj_name[1])
173173

174174
# - Layout
175175
self.box = QtGui.QHBoxLayout()
176176
self.box.addWidget(self.input)
177177
self.box.addWidget(self.button)
178+
self.setLayout(self.box)
178179

179180
# -- Sub Dialogs --------------------------
180181
class TRLayerSelectDLG(QtGui.QDialog):
@@ -903,3 +904,118 @@ def __init__(self, *args, **kwargs):
903904
background-color: #808080;
904905
}
905906
''')
907+
908+
# - Layouts ----------------------------------------
909+
'''
910+
class TRFlowLayout(QtGui.QLayout):
911+
# As adapted from https://stackoverflow.com/questions/60398756/pyqt-oriented-flow-layout
912+
913+
def __init__(self, orientation=QtCore.Qt.Horizontal, parent=None, margin=0, spacing=-1):
914+
super(TRFlowLayout, self).__init__(parent)
915+
self.orientation = orientation
916+
917+
if parent is not None:
918+
self.setContentsMargins(margin, margin, margin, margin)
919+
920+
self.setSpacing(spacing)
921+
922+
self.itemList = []
923+
924+
def __del__(self):
925+
item = self.takeAt(0)
926+
while item:
927+
item = self.takeAt(0)
928+
929+
def addItem(self, item):
930+
self.itemList.append(item)
931+
932+
def count(self):
933+
return len(self.itemList)
934+
935+
def itemAt(self, index):
936+
if index >= 0 and index < len(self.itemList):
937+
return self.itemList[index]
938+
939+
return None
940+
941+
def takeAt(self, index):
942+
if index >= 0 and index < len(self.itemList):
943+
return self.itemList.pop(index)
944+
945+
return None
946+
947+
def expandingDirections(self):
948+
return QtCore.Qt.Orientations(QtCore.Qt.Orientation(0))
949+
950+
def hasHeightForWidth(self):
951+
return self.orientation == QtCore.Qt.Horizontal
952+
953+
def heightForWidth(self, width):
954+
return self.doLayout(QRect(0, 0, width, 0), True)
955+
956+
def hasWidthForHeight(self):
957+
return self.orientation == QtCore.Qt.Vertical
958+
959+
def widthForHeight(self, height):
960+
return self.doLayout(QRect(0, 0, 0, height), True)
961+
962+
def setGeometry(self, rect):
963+
super().setGeometry(rect)
964+
self.doLayout(rect, False)
965+
966+
def sizeHint(self):
967+
return self.minimumSize()
968+
969+
def minimumSize(self):
970+
size = QtCore.QSize()
971+
972+
for item in self.itemList:
973+
size = size.expandedTo(item.minimumSize())
974+
975+
margin, _, _, _ = self.getContentsMargins()
976+
977+
size += QtCore.QSize(2 * margin, 2 * margin)
978+
return size
979+
980+
def doLayout(self, rect, testOnly):
981+
x = rect.x()
982+
y = rect.y()
983+
lineHeight = columnWidth = heightForWidth = 0
984+
985+
for item in self.itemList:
986+
wid = item.widget()
987+
spaceX = self.spacing() + wid.style().layoutSpacing(QtGui.QSizePolicy.PushButton, QtGui.QSizePolicy.PushButton, QtCore.Qt.Horizontal)
988+
spaceY = self.spacing() + wid.style().layoutSpacing(QtGui.QSizePolicy.PushButton, QtGui.QSizePolicy.PushButton, QtCore.Qt.Vertical)
989+
if self.orientation == QtCore.Qt.Horizontal:
990+
nextX = x + item.sizeHint().width() + spaceX
991+
if nextX - spaceX > rect.right() and lineHeight > 0:
992+
x = rect.x()
993+
y = y + lineHeight + spaceY
994+
nextX = x + item.sizeHint().width() + spaceX
995+
lineHeight = 0
996+
997+
if not testOnly:
998+
item.setGeometry(QtCore.QRect(QtCore.QPoint(x, y), item.sizeHint()))
999+
1000+
x = nextX
1001+
lineHeight = max(lineHeight, item.sizeHint().height())
1002+
else:
1003+
nextY = y + item.sizeHint().height() + spaceY
1004+
if nextY - spaceY > rect.bottom() and columnWidth > 0:
1005+
x = x + columnWidth + spaceX
1006+
y = rect.y()
1007+
nextY = y + item.sizeHint().height() + spaceY
1008+
columnWidth = 0
1009+
1010+
heightForWidth += item.sizeHint().height() + spaceY
1011+
if not testOnly:
1012+
item.setGeometry(QtCore.QRect(QtCore.QPoint(x, y), item.sizeHint()))
1013+
1014+
y = nextY
1015+
columnWidth = max(columnWidth, item.sizeHint().width())
1016+
1017+
if self.orientation == QtCore.Qt.Horizontal:
1018+
return y + lineHeight - rect.y()
1019+
else:
1020+
return heightForWidth - rect.y()
1021+
'''

Scripts/TypeRig GUI/Panel/NNode.py

+131
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
#FLM: TR: New Nodes
2+
# -----------------------------------------------------------
3+
# (C) Vassil Kateliev, 2017-2021 (http://www.kateliev.com)
4+
# (C) Karandash Type Foundry (http://www.karandash.eu)
5+
#------------------------------------------------------------
6+
7+
# No warranties. By using this you agree
8+
# that you use it at your own risk!
9+
10+
# - Dependencies -----------------
11+
from __future__ import absolute_import, print_function
12+
from collections import OrderedDict
13+
14+
import fontlab as fl6
15+
from PythonQt import QtCore, QtGui
16+
17+
from typerig.proxy.fl.actions.node import TRNodeActionCollector
18+
from typerig.proxy.fl.application.app import pWorkspace
19+
#from typerig.proxy.fl.gui import QtGui
20+
from typerig.proxy.fl.gui.widgets import getTRIconFontPath, CustomPushButton, CustomSpinButton
21+
from typerig.proxy.fl.gui.styles import css_tr_button
22+
23+
# - Init -------------------------------
24+
global pLayers
25+
global pMode
26+
pLayers = None
27+
pMode = 0
28+
app_name, app_version = 'TypeRig | Nodes', '3.00'
29+
30+
TRToolFont = getTRIconFontPath()
31+
font_loaded = QtGui.QFontDatabase.addApplicationFont(TRToolFont)
32+
33+
# - Sub widgets ------------------------
34+
# -- Layouts ---------------------------
35+
class TRNodeBasics(QtGui.QWidget):
36+
def __init__(self):
37+
super(TRNodeBasics, self).__init__()
38+
39+
# - Init
40+
41+
# - Layout
42+
self.lay_main = QtGui.QVBoxLayout()
43+
44+
# - Widgets
45+
self.lay_main.addWidget(QtGui.QLabel('Node: Basic Operations'))
46+
47+
tooltip_button = 'Insert Node'
48+
self.btn_node_add = CustomSpinButton('node_add', (0., 100., 0., 1.), ('Set value', tooltip_button), ('spn_panel', 'btn_mast'))
49+
self.lay_main.addWidget(self.btn_node_add)
50+
self.btn_node_add.button.clicked.connect(lambda: TRNodeActionCollector.node_insert_dlg(pMode, pLayers, get_modifier()))
51+
52+
tooltip_button = 'Insert Node at the beginning of a bezier.\n<ALT + Mouse Left> Use single node mode.'
53+
self.btn_node_add_0 = CustomSpinButton('node_add_bgn', (0., 100., 0., 1.), ('Set value', tooltip_button), ('spn_panel', 'btn_mast'))
54+
self.lay_main.addWidget(self.btn_node_add_0)
55+
self.btn_node_add_0.button.clicked.connect(lambda: TRNodeActionCollector.node_insert(pMode, pLayers, 0., get_modifier()))
56+
57+
tooltip_button = 'Insert Node at the middle of a bezier.\n<ALT + Mouse Left> Use single node mode.'
58+
self.btn_node_add_5 = CustomSpinButton('node_add_mid', (0., 100., 0., 1.), ('Set value', tooltip_button), ('spn_panel', 'btn_mast'))
59+
self.lay_main.addWidget(self.btn_node_add_5)
60+
self.btn_node_add_5.button.clicked.connect(lambda: TRNodeActionCollector.node_insert(pMode, pLayers, .5, get_modifier()))
61+
62+
tooltip_button = 'Insert Node at the end of a bezier.\n<ALT + Mouse Left> Use single node mode.'
63+
self.btn_node_add_1 = CustomSpinButton('node_add_end', (0., 100., 0., 1.), ('Set value', tooltip_button), ('spn_panel', 'btn_mast'))
64+
self.lay_main.addWidget(self.btn_node_add_1)
65+
self.btn_node_add_1.button.clicked.connect(lambda: TRNodeActionCollector.node_insert(pMode, pLayers, 1., get_modifier()))
66+
67+
tooltip_button = 'Remove Node'
68+
self.btn_node_remove = CustomSpinButton('node_remove', (0., 100., 0., 1.), ('Set value', tooltip_button), ('spn_panel', 'btn_mast'))
69+
self.lay_main.addWidget(self.btn_node_remove)
70+
self.btn_node_remove.button.clicked.connect(lambda: TRNodeActionCollector.node_remove(pMode, pLayers))
71+
72+
tooltip_button = 'Round selected nodes to integer coordinates.\n<Mouse Left> Ceil.\n<ALT + Mouse Left> Floor.\n<... + Shift> Round all nodes.'
73+
self.btn_node_round = CustomSpinButton('node_round', (0., 100., 0., 1.), ('Set value', tooltip_button), ('spn_panel', 'btn_mast'))
74+
self.lay_main.addWidget(self.btn_node_round)
75+
self.btn_node_round.button.clicked.connect(lambda: TRNodeActionCollector.node_round(pMode, pLayers, get_modifier(QtCore.Qt.AltModifier), get_modifier(QtCore.Qt.ShiftModifier)))
76+
77+
tooltip_button = 'Corner Mitre'
78+
self.btn_corner_mitre = CustomSpinButton('corner_mitre', (0., 100., 0., 1.), ('Set value', tooltip_button), ('spn_panel', 'btn_mast'))
79+
self.lay_main.addWidget(self.btn_corner_mitre)
80+
self.btn_corner_mitre.button.clicked.connect(lambda: TRNodeActionCollector.corner_mitre_dlg(pMode, pLayers))
81+
82+
tooltip_button = 'Corner Round'
83+
self.btn_corner_round = CustomSpinButton('corner_round', (0., 100., 0., 1.), ('Set value', tooltip_button), ('spn_panel', 'btn_mast'))
84+
self.lay_main.addWidget(self.btn_corner_round)
85+
self.btn_corner_round.button.clicked.connect(lambda: TRNodeActionCollector.corner_round_dlg(pMode, pLayers))
86+
87+
tooltip_button = 'Corner Loop'
88+
self.btn_corner_loop = CustomSpinButton('corner_loop', (0., 100., 0., 1.), ('Set value', tooltip_button), ('spn_panel', 'btn_mast'))
89+
self.lay_main.addWidget(self.btn_corner_loop)
90+
self.btn_corner_loop.button.clicked.connect(lambda: TRNodeActionCollector.corner_loop_dlg(pMode, pLayers))
91+
92+
tooltip_button = 'Create Ink Trap\n<ALT + Mouse Left> Create non-smooth basic trap.'
93+
self.btn_corner_trap = CustomSpinButton('corner_trap', (0., 100., 0., 1.), ('Set value', tooltip_button), ('spn_panel', 'btn_mast'))
94+
self.lay_main.addWidget(self.btn_corner_trap)
95+
self.btn_corner_trap.button.clicked.connect(lambda: TRNodeActionCollector.corner_trap_dlg(pMode, pLayers, get_modifier()))
96+
97+
tooltip_button = 'Rebuild Corner'
98+
self.btn_corner_rebuild = CustomSpinButton('corner_rebuild', (0., 100., 0., 1.), ('Set value', tooltip_button), ('spn_panel', 'btn_mast'))
99+
self.lay_main.addWidget(self.btn_corner_rebuild)
100+
self.btn_corner_rebuild.button.clicked.connect(lambda: TRNodeActionCollector.corner_rebuild(pMode, pLayers))
101+
102+
self.setLayout(self.lay_main)
103+
104+
105+
# - Tabs -------------------------------
106+
class tool_tab(QtGui.QWidget):
107+
def __init__(self):
108+
super(tool_tab, self).__init__()
109+
110+
# - Init
111+
self.setStyleSheet(css_tr_button)
112+
layoutV = QtGui.QVBoxLayout()
113+
114+
# - Add widgets to main dialog -------------------------
115+
layoutV.addWidget(TRNodeBasics())
116+
117+
# - Build ---------------------------
118+
layoutV.addStretch()
119+
self.setLayout(layoutV)
120+
121+
# !!! Hotfix FL7 7355
122+
self.setMinimumSize(300,self.sizeHint.height())
123+
124+
# - Test ----------------------
125+
if __name__ == '__main__':
126+
test = tool_tab()
127+
test.setWindowTitle('%s %s' %(app_name, app_version))
128+
test.setGeometry(100, 100, 200, 400)
129+
test.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) # Always on top!!
130+
131+
test.show()

0 commit comments

Comments
 (0)