Advertisement
Uno-Dan

Just a page plugin

Sep 2nd, 2019
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.82 KB | None | 0 0
  1.  
  2. import tkinter as tk
  3.  
  4. from os import path
  5.  
  6. from content.pages.home.config.setup import setup
  7.  
  8. from pynput.mouse import Listener
  9.  
  10. from cache import Cache
  11. from widgets import Container
  12. from menus import PopupMenu
  13. from tkinter import messagebox
  14.  
  15. ABS_PATH = path.dirname(path.realpath(__file__))
  16. PAGES_PATH = path.join(f'{ABS_PATH}', 'plugins')
  17.  
  18. popups = {
  19.     'default': {
  20.         'type': 'PopupMenu',
  21.         'config': [
  22.             ('bd', 1),
  23.             ('font', 'helvetica 10'),
  24.             ('relief', 'raised'),
  25.             ('tearoff', 0),
  26.             ('foreground', '#000000'),
  27.             ('background', '#eff0f1'),
  28.             ('activeforeground', '#ffffff'),
  29.             ('activebackground', '#00aaff'),
  30.         ],
  31.         'cut': {
  32.             'type': 'MenuItem',
  33.             'options': [
  34.                 ('label', 'Cut'),
  35.                 ('image', 'drive-harddisk.png'),
  36.                 ('underline', 0),
  37.                 ('accelerator', 'Alt+D '),
  38.             ],
  39.         },
  40.         'copy': {
  41.             'type': 'MenuItem',
  42.             'options': [
  43.                 ('label', 'Copy'),
  44.                 ('image', 'drive-harddisk.png'),
  45.                 ('underline', 0),
  46.                 ('accelerator', 'Alt+D '),
  47.             ],
  48.         },
  49.         'paste': {
  50.             'type': 'MenuItem',
  51.             'options': [
  52.                 ('label', 'Paste'),
  53.                 ('image', 'drive-harddisk.png'),
  54.                 ('underline', 0),
  55.                 ('accelerator', 'Alt+D '),
  56.             ],
  57.         },
  58.     },
  59.     'treeview': {
  60.         'type': 'PopupMenu',
  61.         'config': [
  62.             ('bd', 1),
  63.             ('font', 'helvetica 10'),
  64.             ('relief', 'raised'),
  65.             ('tearoff', 0),
  66.             ('foreground', '#000000'),
  67.             ('background', '#eff0f1'),
  68.             ('activeforeground', '#ffffff'),
  69.             ('activebackground', '#00aaff'),
  70.         ],
  71.         'cut': {
  72.             'type': 'MenuItem',
  73.             'options': [
  74.                 ('label', 'Cut'),
  75.                 ('image', 'drive-harddisk.png'),
  76.                 ('underline', 0),
  77.                 ('accelerator', 'Alt+D '),
  78.             ],
  79.         },
  80.         'copy': {
  81.             'type': 'MenuItem',
  82.             'options': [
  83.                 ('label', 'Copy'),
  84.                 ('image', 'drive-harddisk.png'),
  85.                 ('underline', 0),
  86.                 ('accelerator', 'Alt+D '),
  87.             ],
  88.         },
  89.         'paste': {
  90.             'type': 'MenuItem',
  91.             'options': [
  92.                 ('label', 'Paste'),
  93.                 ('image', 'drive-harddisk.png'),
  94.                 ('underline', 0),
  95.                 ('accelerator', 'Alt+D '),
  96.             ],
  97.         },
  98.         'sep1': {
  99.             'type': 'MenuSeparator',
  100.         },
  101.         'new_menu': {
  102.             'type': 'MenuItem',
  103.             'options': [
  104.                 ('label', 'Add Menu'),
  105.                 ('image', 'drive-harddisk.png'),
  106.                 ('underline', 0),
  107.                 ('accelerator', 'Alt+D '),
  108.             ],
  109.         },
  110.         'new_item': {
  111.             'type': 'MenuItem',
  112.             'options': [
  113.                 ('label', 'Add Menu Item'),
  114.                 ('image', 'drive-harddisk.png'),
  115.                 ('underline', 0),
  116.                 ('accelerator', 'Alt+D '),
  117.             ],
  118.         },
  119.     },
  120. }
  121.  
  122.  
  123. class Plugin(Container):
  124.     def __init__(self, parent, key):
  125.         Container.__init__(self, parent, key, **setup)
  126.         self.popup = \
  127.             self.listener = None
  128.  
  129.     def build(self):
  130.         pmc = Cache(key='popups', data=popups)
  131.  
  132.         def cut(_uri, tko):
  133.             ent_path.event_generate('<Control-x>')
  134.  
  135.         def copy(_uri, tko):
  136.             ent_path.event_generate('<Control-c>')
  137.  
  138.         def paste(_uri, tko):
  139.             ent_path.event_generate('<Control-v>')
  140.  
  141.         def create_project(e):
  142.             print(22222, e.widget.get())
  143.  
  144.         def option(_uri, tko):
  145.             messagebox.showinfo(_uri, f'You clicked "{tko.label}".')
  146.  
  147.         def validate_entry(value):
  148.             if not value:
  149.                 return True
  150.             char = value[0] if len(value) == 1 else value[-1]
  151.  
  152.             if char.isalnum() or char == '_':
  153.                 if len(value) >= 2 and value[-1] == '_' and value[-2] == '_':
  154.                     return False
  155.                 return True
  156.  
  157.             return False
  158.  
  159.         def context_menu(event):
  160.             try:
  161.                 event.widget.focus()
  162.                 PopupMenu(event.widget, key, **{key: event.widget.cfg}).tk_popup(event.x_root + 5, event.y_root + 5)
  163.  
  164.             except tk.TclError:
  165.                 pass
  166.  
  167.         register = self.parent.register(validate_entry)
  168.  
  169.         pane = self.get_item('body/pane')
  170.         treeview = pane.get_item('left/treeview')
  171.         ent_path = pane.get_item('left/path/ent_path')
  172.         ent_name = pane.get_item('right/section1/ent_name')
  173.  
  174.         ent_name.bind('<Return>', create_project)
  175.         ent_name.bind('<KP_Enter>', create_project)
  176.         ent_name.config(validate='key', validatecommand=(register, '%P'))
  177.  
  178.         default_commands = dict((
  179.             ('default/copy/options', ('command', copy)),
  180.             ('default/paste/options', ('command', paste)),
  181.             ('default/cut/options', ('command', cut)),
  182.         ))
  183.         popup_widgets = {
  184.             'path': {'widget': ent_path, 'commands': default_commands},
  185.             'ent_name': {'widget': ent_name, 'commands': default_commands},
  186.             'treeview': {
  187.                 'widget': treeview,
  188.                 'commands': dict((
  189.                     ('treeview/copy/options', ('command', option)),
  190.                     ('treeview/paste/options', ('command', option)),
  191.                     ('treeview/cut/options', ('command', option)),
  192.                     ('treeview/delete/options', ('command', option)),
  193.                     ('treeview/new_menu/options', ('command', option)),
  194.                     ('treeview/new_item/options', ('command', option)),
  195.                 )),
  196.             },
  197.         }
  198.         for key, popup in popup_widgets.items():
  199.             widget = popup.get('widget')
  200.             widget.commands = popup.get('commands')
  201.  
  202.             for _uri, command in widget.commands.items():
  203.                 opts = pmc.get(_uri)
  204.                 if not opts:
  205.                     opts = pmc.get(f'default/{_uri.split("/", 1)[1]}')
  206.                 if opts:
  207.                     opts.append(command)
  208.  
  209.             widget.cfg = popups.get(key, popups.get('default'))
  210.  
  211.         for popup in popup_widgets.values():
  212.             popup.get('widget').bind(f'<Button-3>', context_menu)
  213.  
  214.         return self
  215.  
  216.     def show(self):
  217.         for k, n in self.parent.nodes.items():
  218.             if self.key != k:
  219.                 n.grid_remove()
  220.  
  221.         self.grid(**self.grid_args)
  222.  
  223.         return self
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement