from appTool import * from appParsers.ParseFont import * fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext class TextInputTool(AppToolEditor): """ Simple input for buffer distance. """ def __init__(self, app, draw_app): AppToolEditor.__init__(self, app) self.app = app self.draw_app = draw_app self.text_path = [] self.decimals = self.app.decimals self.f_parse = ParseFont(self.app) self.f_parse.get_fonts_by_types() self.font_name = None self.font_bold = False self.font_italic = False self.ui = TextEditorUI(layout=self.layout, text_class=self) self.connect_signals_at_init() self.set_tool_ui() def run(self): self.app.defaults.report_usage("Geo Editor TextInputTool()") super().run() # if the splitter us hidden, display it if self.app.ui.splitter.sizes()[0] == 0: self.app.ui.splitter.setSizes([1, 1]) # if the Tool Tab is hidden display it, else hide it but only if the objectName is the same found_idx = None for idx in range(self.app.ui.notebook.count()): if self.app.ui.notebook.widget(idx).objectName() == "plugin_tab": found_idx = idx break # show the Tab if not found_idx: try: self.app.ui.notebook.addTab(self.app.ui.plugin_tab, _("Plugin")) except RuntimeError: self.app.ui.plugin_tab = QtWidgets.QWidget() self.app.ui.plugin_tab.setObjectName("plugin_tab") self.app.ui.plugin_tab_layout = QtWidgets.QVBoxLayout(self.app.ui.plugin_tab) self.app.ui.plugin_tab_layout.setContentsMargins(2, 2, 2, 2) self.app.ui.plugin_scroll_area = VerticalScrollArea() self.app.ui.plugin_tab_layout.addWidget(self.app.ui.plugin_scroll_area) self.app.ui.notebook.addTab(self.app.ui.plugin_tab, _("Plugin")) # focus on Tool Tab self.app.ui.notebook.setCurrentWidget(self.app.ui.plugin_tab) # self.app.ui.notebook.callback_on_close = self.on_tab_close self.app.ui.notebook.setTabText(2, _("Text Tool")) def connect_signals_at_init(self): # Signals self.ui.apply_button.clicked.connect(self.on_apply_button) self.ui.font_type_cb.currentFontChanged.connect(self.font_family) self.ui.font_size_cb.activated.connect(self.font_size) self.ui.font_bold_tb.clicked.connect(self.on_bold_button) self.ui.font_italic_tb.clicked.connect(self.on_italic_button) def set_tool_ui(self): # Font type if sys.platform == "win32": f_current = QtGui.QFont("Arial") elif sys.platform == "linux": f_current = QtGui.QFont("FreeMono") else: f_current = QtGui.QFont("Helvetica Neue") self.font_name = f_current.family() self.ui.font_type_cb.setCurrentFont(f_current) # Flag variables to show if font is bold, italic, both or none (regular) self.font_bold = False self.font_italic = False self.ui.text_input_entry.setCurrentFont(f_current) self.ui.text_input_entry.setFontPointSize(10) # # Create dictionaries with the filenames of the fonts # # Key: Fontname # # Value: Font File Name.ttf # # # regular fonts # self.ff_names_regular ={} # # bold fonts # self.ff_names_bold = {} # # italic fonts # self.ff_names_italic = {} # # bold and italic fonts # self.ff_names_bi = {} # # if sys.platform == 'win32': # from winreg import ConnectRegistry, OpenKey, EnumValue, HKEY_LOCAL_MACHINE # registry = ConnectRegistry(None, HKEY_LOCAL_MACHINE) # font_key = OpenKey(registry, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts") # try: # i = 0 # while 1: # name_font, value, type = EnumValue(font_key, i) # k = name_font.replace(" (TrueType)", '') # if 'Bold' in k and 'Italic' in k: # k = k.replace(" Bold Italic", '') # self.ff_names_bi.update({k: value}) # elif 'Bold' in k: # k = k.replace(" Bold", '') # self.ff_names_bold.update({k: value}) # elif 'Italic' in k: # k = k.replace(" Italic", '') # self.ff_names_italic.update({k: value}) # else: # self.ff_names_regular.update({k: value}) # i += 1 # except WindowsError: # pass def on_tab_close(self): self.draw_app.select_tool("select") self.app.ui.notebook.callback_on_close = lambda: None def on_apply_button(self): font_to_geo_type = "" if self.font_bold is True: font_to_geo_type = 'bold' elif self.font_italic is True: font_to_geo_type = 'italic' elif self.font_bold is True and self.font_italic is True: font_to_geo_type = 'bi' elif self.font_bold is False and self.font_italic is False: font_to_geo_type = 'regular' string_to_geo = self.ui.text_input_entry.get_value() font_to_geo_size = self.ui.font_size_cb.get_value() self.text_path = self.f_parse.font_to_geometry(char_string=string_to_geo, font_name=self.font_name, font_size=font_to_geo_size, font_type=font_to_geo_type, units=self.app.app_units.upper()) def font_family(self, font): self.ui.text_input_entry.selectAll() font.setPointSize(int(self.ui.font_size_cb.get_value())) self.ui.text_input_entry.setCurrentFont(font) self.font_name = self.ui.font_type_cb.currentFont().family() def font_size(self): self.ui.text_input_entry.selectAll() self.ui.text_input_entry.setFontPointSize(float(self.ui.font_size_cb.get_value())) def on_bold_button(self): if self.ui.font_bold_tb.isChecked(): self.ui.text_input_entry.selectAll() self.ui.text_input_entry.setFontWeight(QtGui.QFont.Weight.Bold) self.font_bold = True else: self.ui.text_input_entry.selectAll() self.ui.text_input_entry.setFontWeight(QtGui.QFont.Weight.Normal) self.font_bold = False def on_italic_button(self): if self.ui.font_italic_tb.isChecked(): self.ui.text_input_entry.selectAll() self.ui.text_input_entry.setFontItalic(True) self.font_italic = True else: self.ui.text_input_entry.selectAll() self.ui.text_input_entry.setFontItalic(False) self.font_italic = False def hide_tool(self): self.ui.text_tool_frame.hide() self.app.ui.notebook.setCurrentWidget(self.app.ui.properties_tab) # self.app.ui.splitter.setSizes([0, 1]) # self.app.ui.notebook.setTabText(2, _("Tool")) self.app.ui.notebook.removeTab(2) class TextEditorUI: pluginName = _("Text") def __init__(self, layout, text_class): self.text_class = text_class self.decimals = self.text_class.app.decimals self.layout = layout self.app = self.text_class.app # this way I can hide/show the frame self.text_tool_frame = QtWidgets.QFrame() self.text_tool_frame.setContentsMargins(0, 0, 0, 0) self.layout.addWidget(self.text_tool_frame) self.text_tools_box = QtWidgets.QVBoxLayout() self.text_tools_box.setContentsMargins(0, 0, 0, 0) self.text_tool_frame.setLayout(self.text_tools_box) # Title title_label = FCLabel("%s" % self.pluginName, size=16, bold=True) self.text_tools_box.addWidget(title_label) self.param_label = FCLabel('%s' % _("Parameters"), color='blue', bold=True) self.text_tools_box.addWidget(self.param_label) # ############################################################################################################# # Tool Params Frame # ############################################################################################################# tool_par_frame = FCFrame() self.text_tools_box.addWidget(tool_par_frame) # Grid Layout param_grid = GLay(v_spacing=5, h_spacing=3) tool_par_frame.setLayout(param_grid) self.font_type_cb = QtWidgets.QFontComboBox() param_grid.addWidget(FCLabel('%s:' % _("Font")), 0, 0) param_grid.addWidget(self.font_type_cb, 0, 1) # Font size hlay = QtWidgets.QHBoxLayout() self.font_size_cb = FCComboBox(policy=False) self.font_size_cb.setEditable(True) self.font_size_cb.setMinimumContentsLength(3) self.font_size_cb.setMaximumWidth(70) font_sizes = ['6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '18', '20', '22', '24', '26', '28', '32', '36', '40', '44', '48', '54', '60', '66', '72', '80', '88', '96'] self.font_size_cb.addItems(font_sizes) self.font_size_cb.setCurrentIndex(4) hlay.addWidget(self.font_size_cb) hlay.addStretch() self.font_bold_tb = QtWidgets.QToolButton() self.font_bold_tb.setCheckable(True) self.font_bold_tb.setIcon(QtGui.QIcon(self.app.resource_location + '/bold32.png')) hlay.addWidget(self.font_bold_tb) self.font_italic_tb = QtWidgets.QToolButton() self.font_italic_tb.setCheckable(True) self.font_italic_tb.setIcon(QtGui.QIcon(self.app.resource_location + '/italic32.png')) hlay.addWidget(self.font_italic_tb) param_grid.addWidget(FCLabel('%s:' % _("Size")), 2, 0) param_grid.addLayout(hlay, 2, 1) # Text input self.text_tools_box.addWidget(FCLabel('%s:' % _("Text"), bold=True, color='green')) # ############################################################################################################# # Text Frame # ############################################################################################################# text_frame = FCFrame() self.text_tools_box.addWidget(text_frame) # Grid Layout text_grid = GLay(v_spacing=5, h_spacing=3) text_frame.setLayout(text_grid) self.text_input_entry = FCTextAreaRich() self.text_input_entry.setTabStopDistance(12) self.text_input_entry.setMinimumHeight(200) # self.text_input_entry.setMaximumHeight(150) text_grid.addWidget(self.text_input_entry, 0, 0, 1, 2) # Buttons self.apply_button = FCButton(_("Apply")) self.text_tools_box.addWidget(self.apply_button) # self.layout.addStretch()