Skip to content

Instantly share code, notes, and snippets.

@trolleway
Created December 11, 2017 15:13
Show Gist options
  • Save trolleway/6ae011fe7cb67af9a433a461956840f1 to your computer and use it in GitHub Desktop.
Save trolleway/6ae011fe7cb67af9a433a461956840f1 to your computer and use it in GitHub Desktop.
test asciimatics forms
from asciimatics.widgets import Frame, ListBox, Layout, Divider, Text, \
Button, TextBox, Widget
from asciimatics.scene import Scene
from asciimatics.screen import Screen
from asciimatics.exceptions import ResizeScreenError, NextScene, StopApplication
import sys
import sqlite3
class NGWModel(object):
def __init__(self):
# Create a database in RAM
self._db = sqlite3.connect(':memory:')
self._db.row_factory = sqlite3.Row
# Create the basic contact table.
self._db.cursor().execute('''
CREATE TABLE contacts(
id INTEGER PRIMARY KEY,
name TEXT,
phone TEXT,
address TEXT,
email TEXT,
notes TEXT)
''')
self._db.commit()
# Current contact when editing.
self.current_id = None
def add(self, contact):
self._db.cursor().execute('''
INSERT INTO contacts(name, phone, address, email, notes)
VALUES(:name, :phone, :address, :email, :notes)''',
contact)
self._db.commit()
def get_summary(self):
return self._db.cursor().execute(
"SELECT name, id from contacts").fetchall()
def get_contact(self, contact_id):
return self._db.cursor().execute(
"SELECT * from contacts WHERE id=:id", {"id": contact_id}).fetchone()
def get_current_contact(self):
if self.current_id is None:
return {"name": "", "address": "", "phone": "", "email": "", "notes": ""}
else:
return self.get_contact(self.current_id)
def update_current_contact(self, details):
if self.current_id is None:
self.add(details)
else:
self._db.cursor().execute('''
UPDATE contacts SET name=:name, phone=:phone, address=:address,
email=:email, notes=:notes WHERE id=:id''',
details)
self._db.commit()
def delete_contact(self, contact_id):
self._db.cursor().execute('''
DELETE FROM contacts WHERE id=:id''', {"id": contact_id})
self._db.commit()
def upload2ngw(self, contact):
quit()
class ListView(Frame):
def __init__(self, screen, model):
super(ListView, self).__init__(screen,
screen.height * 2 // 3,
screen.width * 2 // 3,
on_load=self._reload_list,
hover_focus=True,
title="Contact List")
# Save off the model that accesses the contacts database.
self._model = model
# Create the form for displaying the list of contacts.
self._list_view = ListBox(
Widget.FILL_FRAME,
model.get_summary(),
name="contacts",
on_change=self._on_pick)
self._edit_button = Button("Edit", self._edit)
self._delete_button = Button("Delete", self._delete)
layout = Layout([100], fill_frame=True)
self.add_layout(layout)
layout.add_widget(self._list_view)
layout.add_widget(Divider())
layout2 = Layout([1, 1, 1, 1, 1])
self.add_layout(layout2)
layout2.add_widget(Button("Add", self._add), 0)
layout2.add_widget(self._edit_button, 1)
layout2.add_widget(self._delete_button, 2)
layout2.add_widget(Button("Quit", self._quit), 3)
layout2.add_widget(Button("Upload", self._upload), 4)
self.fix()
self._on_pick()
def _on_pick(self):
self._edit_button.disabled = self._list_view.value is None
self._delete_button.disabled = self._list_view.value is None
def _reload_list(self, new_value=None):
self._list_view.options = self._model.get_summary()
self._list_view.value = new_value
def _add(self):
self._model.current_id = None
raise NextScene("Edit Contact")
def _edit(self):
self.save()
self._model.current_id = self.data["contacts"]
raise NextScene("Edit Contact")
def _upload(self):
raise NextScene("Create connection")
def _delete(self):
self.save()
self._model.delete_contact(self.data["contacts"])
self._reload_list()
@staticmethod
def _quit():
raise StopApplication("User pressed quit")
class ContactView(Frame):
def __init__(self, screen, model):
super(ContactView, self).__init__(screen,
screen.height * 2 // 3,
screen.width * 2 // 3,
hover_focus=True,
title="Contact Details",
reduce_cpu=True)
# Save off the model that accesses the contacts database.
self._model = model
# Create the form for displaying the list of contacts.
layout = Layout([100], fill_frame=True)
self.add_layout(layout)
layout.add_widget(Text("Name:", "name"))
layout.add_widget(Text("Address:", "address"))
layout.add_widget(Text("Phone number:", "phone"))
layout.add_widget(Text("Email address:", "email"))
layout.add_widget(TextBox(
Widget.FILL_FRAME, "Notes:", "notes", as_string=True))
layout2 = Layout([1, 1, 1, 1])
self.add_layout(layout2)
layout2.add_widget(Button("OK", self._ok), 0)
layout2.add_widget(Button("Cancel", self._cancel), 3)
self.fix()
def reset(self):
# Do standard reset to clear out form, then populate with new data.
super(ContactView, self).reset()
self.data = self._model.get_current_contact()
def _ok(self):
self.save()
self._model.update_current_contact(self.data)
raise NextScene("Main")
@staticmethod
def _cancel():
raise NextScene("Main")
class ConnectView(Frame):
def __init__(self, screen, model):
super(ConnectView, self).__init__(screen,
screen.height * 2 // 3,
screen.width * 2 // 3,
hover_focus=True,
title="Connect to NextGIS Web",
reduce_cpu=True)
# Save off the model that accesses the contacts database.
self._model = model
# Create the form for displaying the list of contacts.
layout = Layout([100], fill_frame=True)
self.add_layout(layout)
layout.add_widget(Text("URL:", "url"))
layout.add_widget(Text("login:", "login"))
layout.add_widget(Text("password:", "password",hide_char='*'))
layout.add_widget(Text("path", "path"))
layout2 = Layout([1, 1, 1, 1])
self.add_layout(layout2)
layout2.add_widget(Button("OK", self._ok), 0)
layout2.add_widget(Button("Quit", self._quit), 3)
self.fix()
def reset(self):
# Do standard reset to clear out form, then populate with new data.
super(ConnectView, self).reset()
self.data = self._model.get_current_contact()
def _ok(self):
self.save()
self._model.upload2ngw(self.data)
raise NextScene("Main")
@staticmethod
def _quit():
raise StopApplication("User pressed quit")
@staticmethod
def _cancel():
raise NextScene("Main")
def demo(screen, scene):
scenes = [
Scene([ConnectView(screen, contacts)], -1, name="Create connection")#,
#Scene([ListView(screen, contacts)], -1, name="Main"),
#Scene([ContactView(screen, contacts)], -1, name="Edit Contact")
]
screen.play(scenes, stop_on_resize=True, start_scene=scene)
contacts = NGWModel()
last_scene = None
while True:
try:
Screen.wrapper(demo, catch_interrupt=True, arguments=[last_scene])
sys.exit(0)
except ResizeScreenError as e:
last_scene = e.scene
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment