Module pedfont

Expand source code
#!/usr/bin/env python

# Ped font selection

from __future__ import absolute_import
from __future__ import print_function

import  signal, os, time, sys, subprocess

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
from gi.repository import Gdk
from gi.repository import Pango

from pedlib import pedconfig
from pedlib.pedutil import *

# I had to do this, as the standard font dialog does not have a mono filter.
# Also, we do not need mono italic etc so the dialog is simpler.
# Plus, the mono fonts are marked incorrectly, this way we can filter them.
# Oh yeah, live feedback ...

def selfont(self, self2):

    head = "pyedpro: Set Editor Main Font"

    dialog = Gtk.Dialog(head,
                   None,
                   Gtk.DialogFlags.MODAL | \
                   Gtk.DialogFlags.DESTROY_WITH_PARENT,
                   (Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT,
                    Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
    dialog.set_default_response(Gtk.ResponseType.ACCEPT)
    dialog.set_transient_for(self2.mained.mywin)

    try:
        dialog.set_icon_from_file(get_img_path("spyedpro_sub.png"))
    except:
        print("Cannot set icon in", __file__)

    self.dialog = dialog

    dialog.myfd = self2.pangolayout.get_font_description()
    myfam = dialog.myfd.get_family()
    mysiz = dialog.myfd.get_size() / Pango.SCALE

    dialog.lastfam = myfam
    dialog.lastsiz = mysiz

    xx, yy = self2.mained.mywin.get_size()
    #dialog.set_default_size(3*xx/4, yy/2)

    # Spacers
    label1 = Gtk.Label("  ");
    label2a = Gtk.Label("  ");  label2 = Gtk.Label("  ")
    label3 = Gtk.Label("  ");
    label3a = Gtk.Label("  ");
    label4 = Gtk.Label("  ")

    dialog.testlab = Gtk.Label("The test line.\nMulti line text.")
    dialog.testlab.modify_font(dialog.myfd)
    dialog.testlab.set_size_request(200, yy/3)

    dialog.tree = create_tree(self)
    dialog.tree.set_headers_visible(False)
    #dialog.tree.set_size_request(200, -1)

    dialog.tree.connect("cursor-changed",  tree_sel_row, dialog, self2)
    dialog.tree.connect("key-press-event", area_key, dialog)
    dialog.tree.connect("key-release-event", area_key, dialog)

    stree = Gtk.ScrolledWindow()
    stree.add(dialog.tree)
    stree.set_size_request(150, -1)

    hbox = Gtk.HBox()
    hbox.pack_start(label2a, False, False,0)
    hbox.pack_start(stree, True, True,0)
    hbox.pack_start(label2, False ,0, 0)

    vbox = Gtk.VBox()

    #dialog.tree2 = create_tree(self)
    #dialog.tree2.set_headers_visible(False)
    #dialog.tree2.set_size_request(200, 80)
    #dialog.tree2.connect("cursor-changed",  tree_sel_row2, dialog)

    vbox.pack_start(label1, False, 0 ,0 )
    frame = Gtk.Frame()
    frame.add(dialog.testlab)
    vbox.pack_start(frame, True, 0, 0)
    vbox.pack_start(label3, False, 0, 0 )

    hbox.pack_start(vbox, True,  0, 0)
    hbox.pack_start(label4, False, 0, 0 )

    dialog.tree3 = create_tree(self)
    dialog.tree3.set_headers_visible(False)
    dialog.tree3.set_size_request(180, yy/3)

    dialog.tree3.connect("cursor-changed",  tree_sel_row3, dialog, self2)
    dialog.tree3.connect("key-press-event", area_key, dialog)
    dialog.tree3.connect("key-release-event", area_key, dialog)

    stree3 = Gtk.ScrolledWindow()
    stree3.add(dialog.tree3)
    stree3.set_size_request(80, -1)

    sizes = []; add_sizes(sizes)
    update_treestore2(None, dialog.tree3, sizes, mysiz)

    hbox.pack_start(stree3, True, True, 0)
    hbox.pack_start(label3a, False, 0, 0 )

    vlab1 = Gtk.Label() ;    vlab2 = Gtk.Label()
    vbox2 = Gtk.VBox()

    vbox2.add(vlab1)
    vbox2.add(hbox)
    vbox2.add(vlab2)

    dialog.vbox.add(vbox2)
    dialog.show_all()

    pg = Gtk.Widget.create_pango_context(self.mywin)
    fd = pg.get_font_description()

    fonts = pg.list_families();
    dialog.monos = []
    for aa in fonts:
        if aa.is_monospace():
            # Some fonts are marked mono, they are not
            if aa.get_name() == "Cursor":
                continue
            if aa.get_name() == "CM Typewriter Greek":
                continue
            dialog.monos.append(aa)

    dialog.fonts2 = []
    curr = 0; cnt = 0
    for cc in dialog.monos:
        nnn = cc.get_name()
        # This will match more than one, we accept the last match
        if nnn.upper().find(myfam.upper()) >= 0:
            curr = cnt
        dialog.fonts2.append(nnn)
        cnt += 1
    update_treestore(None, dialog.tree, dialog.fonts2, curr)

    result = dialog.run()
    dialog.destroy()
    if result == Gtk.ResponseType.ACCEPT:
        #print result, dialog.lastfam, dialog.lastsiz
        for mm in range(self2.notebook.get_n_pages()):
            vcurr = self2.notebook.get_nth_page(mm)
            vcurr.area.setfont(dialog.lastfam, dialog.lastsiz)

        pedconfig.conf.sql.put("fsize", dialog.lastsiz)
        pedconfig.conf.sql.put("fname", dialog.lastfam)
    else:
        # Restore
        self2.setfont(myfam, mysiz)
        self2.invalidate()


def tree_sel_row(xtree, dialog, self2):

    sel = xtree.get_selection()
    xmodel, xiter = sel.get_selected()
    xstr = xmodel.get_value(xiter, 0)
    dialog.lastfam = xstr
    dialog.myfd.set_family(xstr);
    dialog.myfd.set_size(dialog.lastsiz * Pango.SCALE)
    dialog.testlab.modify_font(dialog.myfd)

    self2.setfont(dialog.lastfam, dialog.lastsiz)
    self2.invalidate()

def tree_sel_row3(xtree, dialog, self2):

    sel = xtree.get_selection()
    xmodel, xiter = sel.get_selected()
    xstr = xmodel.get_value(xiter, 0)
    #print "tree_sel_row3", xstr
    dialog.lastsiz = int(xstr)
    dialog.myfd.set_family(dialog.lastfam);
    dialog.myfd.set_size(dialog.lastsiz * Pango.SCALE)
    dialog.testlab.modify_font(dialog.myfd)

    self2.setfont(dialog.lastfam, dialog.lastsiz)
    self2.invalidate()


# -------------------------------------------------------------------------
def create_tree(self):

    # create the TreeView using treestore
    treestore = Gtk.TreeStore(str)
    tv = Gtk.TreeView(treestore)
    tv.set_enable_search(True)

    # create a CellRendererText to render the data
    cell = Gtk.CellRendererText()

    # create the TreeViewColumn to display the data
    tvcolumn = Gtk.TreeViewColumn()

    # add the cell to the tvcolumn and allow it to expand
    tvcolumn.pack_start(cell, True)

    # set the cell "text" attribute to column 0 - retrieve text
    # from that column in treestore
    tvcolumn.add_attribute(cell, 'text', 0)

    # add tvcolumn to treeview
    tv.append_column(tvcolumn)

    return tv

def update_treestore(self, tree, text, was):

    #print "was", was

    treestore = tree.get_model()

    # Delete previous contents
    try:
        while True:
            root = treestore.get_iter_first()
            treestore.remove(root)
    except:
        pass
        #print  sys.exc_info()
    if not text:
        treestore.append(None, ["No Fonts",])
        return

    cnt = 0; piter2 = None; next = False
    try:
        for line in text:
            piter = treestore.append(None, [cut_lead_space(line)])
            if cnt == was:
                piter2 = piter
            cnt += 1
    except:
        pass
        #print  sys.exc_info()

    if piter2:
        tree.set_cursor(treestore.get_path(piter2))
    else:
        root = treestore.get_iter_first()
        tree.set_cursor(treestore.get_path(root))

def update_treestore2(self, tree, text, was):

    #print "was", was

    treestore = tree.get_model()

    # Delete previous contents
    try:
        while True:
            root = treestore.get_iter_first()
            treestore.remove(root)
    except:
        pass
        #print  sys.exc_info()
    if not text:
        treestore.append(None, ["No Fonts",])
        return

    cnt = 0; piter2 = None; next = False
    try:
        for line in text:
            piter = treestore.append(None, [cut_lead_space(line)])
            if int(line) == was:
                piter2 = piter
            cnt += 1
    except:
        pass
        #print  sys.exc_info()

    if piter2:
        tree.set_cursor(treestore.get_path(piter2))
    else:
        root = treestore.get_iter_first()
        tree.set_cursor(treestore.get_path(root))


def add_sizes(sizes):

    for num in range(6, 18, 1):     sizes.append(str(num))
    for num in range(18, 32, 2):    sizes.append(str(num))
    for num in range(32, 64, 4):    sizes.append(str(num))
    for num in range(64, 96+1, 8):  sizes.append(str(num))

# ------------------------------------------------------------------------

def area_key(area, event, dialog):

    if  event.type == Gdk.EventType.KEY_PRESS:
        if event.keyval == Gdk.KEY_Escape:
            #print "Esc"
            dialog.response(Gtk.ResponseType.REJECT)

    if  event.type == Gdk.EventType.KEY_PRESS:
        if event.keyval == Gdk.KEY_Return:
            #print "Ret"
            dialog.response(Gtk.ResponseType.ACCEPT)

        if event.keyval == Gdk.KEY_Alt_L or \
                event.keyval == Gdk.KEY_Alt_R:
            area.alt = True;

        if event.keyval == Gdk.KEY_x or \
                event.keyval == Gdk.KEY_X:
            if area.alt:
                dialog.response(Gtk.ResponseType.REJECT)

    elif  event.type == Gdk.EventType.KEY_RELEASE:
        if event.keyval == Gdk.KEY_Alt_L or \
              event.keyval == Gdk.KEY_Alt_R:
            area.alt = False;

Functions

def add_sizes(sizes)
Expand source code
def add_sizes(sizes):

    for num in range(6, 18, 1):     sizes.append(str(num))
    for num in range(18, 32, 2):    sizes.append(str(num))
    for num in range(32, 64, 4):    sizes.append(str(num))
    for num in range(64, 96+1, 8):  sizes.append(str(num))
def area_key(area, event, dialog)
Expand source code
def area_key(area, event, dialog):

    if  event.type == Gdk.EventType.KEY_PRESS:
        if event.keyval == Gdk.KEY_Escape:
            #print "Esc"
            dialog.response(Gtk.ResponseType.REJECT)

    if  event.type == Gdk.EventType.KEY_PRESS:
        if event.keyval == Gdk.KEY_Return:
            #print "Ret"
            dialog.response(Gtk.ResponseType.ACCEPT)

        if event.keyval == Gdk.KEY_Alt_L or \
                event.keyval == Gdk.KEY_Alt_R:
            area.alt = True;

        if event.keyval == Gdk.KEY_x or \
                event.keyval == Gdk.KEY_X:
            if area.alt:
                dialog.response(Gtk.ResponseType.REJECT)

    elif  event.type == Gdk.EventType.KEY_RELEASE:
        if event.keyval == Gdk.KEY_Alt_L or \
              event.keyval == Gdk.KEY_Alt_R:
            area.alt = False;
def create_tree(self)
Expand source code
def create_tree(self):

    # create the TreeView using treestore
    treestore = Gtk.TreeStore(str)
    tv = Gtk.TreeView(treestore)
    tv.set_enable_search(True)

    # create a CellRendererText to render the data
    cell = Gtk.CellRendererText()

    # create the TreeViewColumn to display the data
    tvcolumn = Gtk.TreeViewColumn()

    # add the cell to the tvcolumn and allow it to expand
    tvcolumn.pack_start(cell, True)

    # set the cell "text" attribute to column 0 - retrieve text
    # from that column in treestore
    tvcolumn.add_attribute(cell, 'text', 0)

    # add tvcolumn to treeview
    tv.append_column(tvcolumn)

    return tv
def selfont(self, self2)
Expand source code
def selfont(self, self2):

    head = "pyedpro: Set Editor Main Font"

    dialog = Gtk.Dialog(head,
                   None,
                   Gtk.DialogFlags.MODAL | \
                   Gtk.DialogFlags.DESTROY_WITH_PARENT,
                   (Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT,
                    Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
    dialog.set_default_response(Gtk.ResponseType.ACCEPT)
    dialog.set_transient_for(self2.mained.mywin)

    try:
        dialog.set_icon_from_file(get_img_path("spyedpro_sub.png"))
    except:
        print("Cannot set icon in", __file__)

    self.dialog = dialog

    dialog.myfd = self2.pangolayout.get_font_description()
    myfam = dialog.myfd.get_family()
    mysiz = dialog.myfd.get_size() / Pango.SCALE

    dialog.lastfam = myfam
    dialog.lastsiz = mysiz

    xx, yy = self2.mained.mywin.get_size()
    #dialog.set_default_size(3*xx/4, yy/2)

    # Spacers
    label1 = Gtk.Label("  ");
    label2a = Gtk.Label("  ");  label2 = Gtk.Label("  ")
    label3 = Gtk.Label("  ");
    label3a = Gtk.Label("  ");
    label4 = Gtk.Label("  ")

    dialog.testlab = Gtk.Label("The test line.\nMulti line text.")
    dialog.testlab.modify_font(dialog.myfd)
    dialog.testlab.set_size_request(200, yy/3)

    dialog.tree = create_tree(self)
    dialog.tree.set_headers_visible(False)
    #dialog.tree.set_size_request(200, -1)

    dialog.tree.connect("cursor-changed",  tree_sel_row, dialog, self2)
    dialog.tree.connect("key-press-event", area_key, dialog)
    dialog.tree.connect("key-release-event", area_key, dialog)

    stree = Gtk.ScrolledWindow()
    stree.add(dialog.tree)
    stree.set_size_request(150, -1)

    hbox = Gtk.HBox()
    hbox.pack_start(label2a, False, False,0)
    hbox.pack_start(stree, True, True,0)
    hbox.pack_start(label2, False ,0, 0)

    vbox = Gtk.VBox()

    #dialog.tree2 = create_tree(self)
    #dialog.tree2.set_headers_visible(False)
    #dialog.tree2.set_size_request(200, 80)
    #dialog.tree2.connect("cursor-changed",  tree_sel_row2, dialog)

    vbox.pack_start(label1, False, 0 ,0 )
    frame = Gtk.Frame()
    frame.add(dialog.testlab)
    vbox.pack_start(frame, True, 0, 0)
    vbox.pack_start(label3, False, 0, 0 )

    hbox.pack_start(vbox, True,  0, 0)
    hbox.pack_start(label4, False, 0, 0 )

    dialog.tree3 = create_tree(self)
    dialog.tree3.set_headers_visible(False)
    dialog.tree3.set_size_request(180, yy/3)

    dialog.tree3.connect("cursor-changed",  tree_sel_row3, dialog, self2)
    dialog.tree3.connect("key-press-event", area_key, dialog)
    dialog.tree3.connect("key-release-event", area_key, dialog)

    stree3 = Gtk.ScrolledWindow()
    stree3.add(dialog.tree3)
    stree3.set_size_request(80, -1)

    sizes = []; add_sizes(sizes)
    update_treestore2(None, dialog.tree3, sizes, mysiz)

    hbox.pack_start(stree3, True, True, 0)
    hbox.pack_start(label3a, False, 0, 0 )

    vlab1 = Gtk.Label() ;    vlab2 = Gtk.Label()
    vbox2 = Gtk.VBox()

    vbox2.add(vlab1)
    vbox2.add(hbox)
    vbox2.add(vlab2)

    dialog.vbox.add(vbox2)
    dialog.show_all()

    pg = Gtk.Widget.create_pango_context(self.mywin)
    fd = pg.get_font_description()

    fonts = pg.list_families();
    dialog.monos = []
    for aa in fonts:
        if aa.is_monospace():
            # Some fonts are marked mono, they are not
            if aa.get_name() == "Cursor":
                continue
            if aa.get_name() == "CM Typewriter Greek":
                continue
            dialog.monos.append(aa)

    dialog.fonts2 = []
    curr = 0; cnt = 0
    for cc in dialog.monos:
        nnn = cc.get_name()
        # This will match more than one, we accept the last match
        if nnn.upper().find(myfam.upper()) >= 0:
            curr = cnt
        dialog.fonts2.append(nnn)
        cnt += 1
    update_treestore(None, dialog.tree, dialog.fonts2, curr)

    result = dialog.run()
    dialog.destroy()
    if result == Gtk.ResponseType.ACCEPT:
        #print result, dialog.lastfam, dialog.lastsiz
        for mm in range(self2.notebook.get_n_pages()):
            vcurr = self2.notebook.get_nth_page(mm)
            vcurr.area.setfont(dialog.lastfam, dialog.lastsiz)

        pedconfig.conf.sql.put("fsize", dialog.lastsiz)
        pedconfig.conf.sql.put("fname", dialog.lastfam)
    else:
        # Restore
        self2.setfont(myfam, mysiz)
        self2.invalidate()
def tree_sel_row(xtree, dialog, self2)
Expand source code
def tree_sel_row(xtree, dialog, self2):

    sel = xtree.get_selection()
    xmodel, xiter = sel.get_selected()
    xstr = xmodel.get_value(xiter, 0)
    dialog.lastfam = xstr
    dialog.myfd.set_family(xstr);
    dialog.myfd.set_size(dialog.lastsiz * Pango.SCALE)
    dialog.testlab.modify_font(dialog.myfd)

    self2.setfont(dialog.lastfam, dialog.lastsiz)
    self2.invalidate()
def tree_sel_row3(xtree, dialog, self2)
Expand source code
def tree_sel_row3(xtree, dialog, self2):

    sel = xtree.get_selection()
    xmodel, xiter = sel.get_selected()
    xstr = xmodel.get_value(xiter, 0)
    #print "tree_sel_row3", xstr
    dialog.lastsiz = int(xstr)
    dialog.myfd.set_family(dialog.lastfam);
    dialog.myfd.set_size(dialog.lastsiz * Pango.SCALE)
    dialog.testlab.modify_font(dialog.myfd)

    self2.setfont(dialog.lastfam, dialog.lastsiz)
    self2.invalidate()
def update_treestore(self, tree, text, was)
Expand source code
def update_treestore(self, tree, text, was):

    #print "was", was

    treestore = tree.get_model()

    # Delete previous contents
    try:
        while True:
            root = treestore.get_iter_first()
            treestore.remove(root)
    except:
        pass
        #print  sys.exc_info()
    if not text:
        treestore.append(None, ["No Fonts",])
        return

    cnt = 0; piter2 = None; next = False
    try:
        for line in text:
            piter = treestore.append(None, [cut_lead_space(line)])
            if cnt == was:
                piter2 = piter
            cnt += 1
    except:
        pass
        #print  sys.exc_info()

    if piter2:
        tree.set_cursor(treestore.get_path(piter2))
    else:
        root = treestore.get_iter_first()
        tree.set_cursor(treestore.get_path(root))
def update_treestore2(self, tree, text, was)
Expand source code
def update_treestore2(self, tree, text, was):

    #print "was", was

    treestore = tree.get_model()

    # Delete previous contents
    try:
        while True:
            root = treestore.get_iter_first()
            treestore.remove(root)
    except:
        pass
        #print  sys.exc_info()
    if not text:
        treestore.append(None, ["No Fonts",])
        return

    cnt = 0; piter2 = None; next = False
    try:
        for line in text:
            piter = treestore.append(None, [cut_lead_space(line)])
            if int(line) == was:
                piter2 = piter
            cnt += 1
    except:
        pass
        #print  sys.exc_info()

    if piter2:
        tree.set_cursor(treestore.get_path(piter2))
    else:
        root = treestore.get_iter_first()
        tree.set_cursor(treestore.get_path(root))