Module pedbuffs

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

# Action Handler for buffers

from __future__ import absolute_import
from __future__ import print_function

import re, string, sys

#import gi
#from six.moves import range
#gi.require_version("Gtk", "3.0")
#from gi.repository import Gdk
#from gi.repository import Gtk
#from gi.repository import GObject

from pedlib import pedconfig
from pedlib.pedutil import *

def fill_list(dialog):

    blist = []; was = -1
    nn2 = dialog.self2.notebook.get_current_page()
    vcurr2 = dialog.self2.notebook.get_nth_page(nn2)
    cc = dialog.self2.notebook.get_n_pages()
    for mm in range(cc):
        vcurr = dialog.self2.notebook.get_nth_page(mm)
        if was == -1 and vcurr == vcurr2:
            was = mm
        strx = ""

        if vcurr.area.changed:
            strx += "*   "
        else:
            strx += "-   "

        strx += vcurr.area.fname
        blist.append(strx)

    update_treestore(dialog, dialog, blist, was)

def rmbuffer(dialog, which):
    cc = dialog.self2.notebook.get_n_pages()
    #print("which", which)
    for mm in range(cc):
        try:
            vcurr = dialog.self2.notebook.get_nth_page(mm)
            #print("Iter name", vcurr.area.fname, which)
            if which == vcurr.area.fname:
                #print("Would remove", vcurr.area)
                dialog.self2.mained.close_document(vcurr.area)
        except:
            pass

# -------------------------------------------------------------------------
# Confusion into object oriented implementation -- we just decorate dialog

def buffers(self, self2):

    head = "pyedpro: buffers"

    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)
    dialog.set_position(Gtk.WindowPosition.CENTER)
    dialog.self2 = self2

    try:
        dialog.set_icon_from_file(get_img_path("pyedpro_sub.png"))
    except:
        print("Cannot load buffs dialog icon", sys.exc_info())

    xx, yy = self2.mained.mywin.get_size()

    dialog.set_default_size(7*xx/8, 7*yy/8)

    dialog.treestore = None
    dialog.tree = create_tree(self, dialog)
    dialog.tree.set_headers_visible(False)

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

    stree = Gtk.ScrolledWindow()
    stree.add(dialog.tree)
    frame = Gtk.Frame()
    #frame.set_shadow_type(Gtk.SHADOW_ETCHED_IN)

    frame.add(stree)

    #dialog.vbox.set_spacing(8)

    dialog.vbox.pack_start(frame, 1, 1, 0)
    fill_list(dialog)
    dialog.show_all()
    response = dialog.run()
    dialog.destroy()

    if response != Gtk.ResponseType.ACCEPT:
        return

    cc = self2.notebook.get_n_pages()
    if cc == 0:
        return
    for mm in range(cc):
        vcurr = self2.notebook.get_nth_page(mm)
        if vcurr.area.fname == dialog.res:
            self2.notebook.set_current_page(mm)
            nn2 = self2.notebook.get_current_page()
            vcurr2 = self2.notebook.get_nth_page(nn2)
            self2.mained.mywin.set_focus(vcurr2.vbox.area)
            self2.mained.mywin.show_all()
            break

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

def del_item(dialog):

    sel = dialog.tree.get_selection()
    xmodel, xiter = sel.get_selected_rows()
    # In muti selection, only process first
    for aa in xiter:
        ii = xmodel.get_iter(aa)
        xstr = xmodel.get_value(ii, 0)
        ystr =  xstr[4:]
        #print ("Selected for removal:", ystr)
        rmbuffer(dialog, ystr)
        xmodel.remove(ii)
        break

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)

        if event.keyval == Gdk.KEY_d or \
                event.keyval == Gdk.KEY_D:
            if area.alt:
                #print("Alt D")
                del_item(dialog)

    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 tree_sel(xtree, xiter, xpath, dialog):

    #print ("tree_sel", xtree, xiter, xpath)
    sel = xtree.get_selection()
    xmodel, xpath = sel.get_selected_rows()
    if xpath:
        #print("sel: ", "'" + xpath + "'" )
        for aa in xpath:
            xiter2 = xmodel.get_iter(aa)
            xstr = xmodel.get_value(xiter2, 0)
            print("mul selstr: ", "'" + xstr + "'" )
            #if click_dir_action(xstr):
            #    dialog.xmulti = []
            #    populate(dialog)
            #    return
        dialog.response(Gtk.ResponseType.ACCEPT)

def tree_sel_row(xtree, dialog, self2):

    sel = xtree.get_selection()
    xmodel, xiter = sel.get_selected_rows()
    # In muti selection, only process first
    for aa in xiter:
        xstr = xmodel.get_value(xmodel.get_iter(aa), 0)
        #print ("Selected:", xstr)
        dialog.res = xstr[4:]
        break

# Tree handlers
def start_tree(self, win2):

    if not win2.treestore:
        win2.treestore = Gtk.TreeStore(str)

    # Delete previous contents
    try:
        while True:
            root = win2.treestore.get_iter_first()
            win2.treestore.remove(root)
    except:
        #print  (sys.exc_info())
        pass

    piter = win2.treestore.append(None, ["Searching .."])
    win2.treestore.append(piter, ["None .."])


def tree_sel(xtree, xiter, xpath, dialog):

    #print ("tree_sel", xtree, xiter, xpath)
    sel = xtree.get_selection()
    xmodel, xpath = sel.get_selected_rows()
    if xpath:
        for aa in xpath:
            xiter2 = xmodel.get_iter(aa)
            xstr = xmodel.get_value(xiter2, 0)
            #print("mul selstr: ", "'" + xstr + "'" )
            #if click_dir_action(xstr):
            #    dialog.xmulti = []
            #    populate(dialog)
            #    return
        dialog.response(Gtk.ResponseType.ACCEPT)

# -------------------------------------------------------------------------
def create_tree(self, win2, match = False, text = None):

    start_tree(self, win2)

    # create the TreeView using treestore
    tv = Gtk.TreeView(win2.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("Matches for '" + match + "'")
    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, win2, text, was):

    #print ("was", was)

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

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

    try:
        if piter2:
            win2.tree.set_cursor(win2.treestore.get_path(piter2))
        else:
            root = win2.treestore.get_iter_first()
            win2.tree.set_cursor(win2.treestore.get_path(root))
    except:
        print(sys.exc_info())

# EOF

Functions

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)

        if event.keyval == Gdk.KEY_d or \
                event.keyval == Gdk.KEY_D:
            if area.alt:
                #print("Alt D")
                del_item(dialog)

    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 buffers(self, self2)
Expand source code
def buffers(self, self2):

    head = "pyedpro: buffers"

    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)
    dialog.set_position(Gtk.WindowPosition.CENTER)
    dialog.self2 = self2

    try:
        dialog.set_icon_from_file(get_img_path("pyedpro_sub.png"))
    except:
        print("Cannot load buffs dialog icon", sys.exc_info())

    xx, yy = self2.mained.mywin.get_size()

    dialog.set_default_size(7*xx/8, 7*yy/8)

    dialog.treestore = None
    dialog.tree = create_tree(self, dialog)
    dialog.tree.set_headers_visible(False)

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

    stree = Gtk.ScrolledWindow()
    stree.add(dialog.tree)
    frame = Gtk.Frame()
    #frame.set_shadow_type(Gtk.SHADOW_ETCHED_IN)

    frame.add(stree)

    #dialog.vbox.set_spacing(8)

    dialog.vbox.pack_start(frame, 1, 1, 0)
    fill_list(dialog)
    dialog.show_all()
    response = dialog.run()
    dialog.destroy()

    if response != Gtk.ResponseType.ACCEPT:
        return

    cc = self2.notebook.get_n_pages()
    if cc == 0:
        return
    for mm in range(cc):
        vcurr = self2.notebook.get_nth_page(mm)
        if vcurr.area.fname == dialog.res:
            self2.notebook.set_current_page(mm)
            nn2 = self2.notebook.get_current_page()
            vcurr2 = self2.notebook.get_nth_page(nn2)
            self2.mained.mywin.set_focus(vcurr2.vbox.area)
            self2.mained.mywin.show_all()
            break
def create_tree(self, win2, match=False, text=None)
Expand source code
def create_tree(self, win2, match = False, text = None):

    start_tree(self, win2)

    # create the TreeView using treestore
    tv = Gtk.TreeView(win2.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("Matches for '" + match + "'")
    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 del_item(dialog)
Expand source code
def del_item(dialog):

    sel = dialog.tree.get_selection()
    xmodel, xiter = sel.get_selected_rows()
    # In muti selection, only process first
    for aa in xiter:
        ii = xmodel.get_iter(aa)
        xstr = xmodel.get_value(ii, 0)
        ystr =  xstr[4:]
        #print ("Selected for removal:", ystr)
        rmbuffer(dialog, ystr)
        xmodel.remove(ii)
        break
def fill_list(dialog)
Expand source code
def fill_list(dialog):

    blist = []; was = -1
    nn2 = dialog.self2.notebook.get_current_page()
    vcurr2 = dialog.self2.notebook.get_nth_page(nn2)
    cc = dialog.self2.notebook.get_n_pages()
    for mm in range(cc):
        vcurr = dialog.self2.notebook.get_nth_page(mm)
        if was == -1 and vcurr == vcurr2:
            was = mm
        strx = ""

        if vcurr.area.changed:
            strx += "*   "
        else:
            strx += "-   "

        strx += vcurr.area.fname
        blist.append(strx)

    update_treestore(dialog, dialog, blist, was)
def rmbuffer(dialog, which)
Expand source code
def rmbuffer(dialog, which):
    cc = dialog.self2.notebook.get_n_pages()
    #print("which", which)
    for mm in range(cc):
        try:
            vcurr = dialog.self2.notebook.get_nth_page(mm)
            #print("Iter name", vcurr.area.fname, which)
            if which == vcurr.area.fname:
                #print("Would remove", vcurr.area)
                dialog.self2.mained.close_document(vcurr.area)
        except:
            pass
def start_tree(self, win2)
Expand source code
def start_tree(self, win2):

    if not win2.treestore:
        win2.treestore = Gtk.TreeStore(str)

    # Delete previous contents
    try:
        while True:
            root = win2.treestore.get_iter_first()
            win2.treestore.remove(root)
    except:
        #print  (sys.exc_info())
        pass

    piter = win2.treestore.append(None, ["Searching .."])
    win2.treestore.append(piter, ["None .."])
def tree_sel(xtree, xiter, xpath, dialog)
Expand source code
def tree_sel(xtree, xiter, xpath, dialog):

    #print ("tree_sel", xtree, xiter, xpath)
    sel = xtree.get_selection()
    xmodel, xpath = sel.get_selected_rows()
    if xpath:
        for aa in xpath:
            xiter2 = xmodel.get_iter(aa)
            xstr = xmodel.get_value(xiter2, 0)
            #print("mul selstr: ", "'" + xstr + "'" )
            #if click_dir_action(xstr):
            #    dialog.xmulti = []
            #    populate(dialog)
            #    return
        dialog.response(Gtk.ResponseType.ACCEPT)
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_rows()
    # In muti selection, only process first
    for aa in xiter:
        xstr = xmodel.get_value(xmodel.get_iter(aa), 0)
        #print ("Selected:", xstr)
        dialog.res = xstr[4:]
        break
def update_treestore(self, win2, text, was)
Expand source code
def  update_treestore(self, win2, text, was):

    #print ("was", was)

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

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

    try:
        if piter2:
            win2.tree.set_cursor(win2.treestore.get_path(piter2))
        else:
            root = win2.treestore.get_iter_first()
            win2.tree.set_cursor(win2.treestore.get_path(root))
    except:
        print(sys.exc_info())