def new_subcat(self, subcat): tb = ui.Textbox(subcat, tsize=40, underline=True) space_width = tb.get_text_rect(' ').width spaces = ((self.popup.rect.width - tb.rect.width) // space_width) - 1 tb.set_message(subcat + (' ' * spaces)) tb = tb.to_static() self.node_labels[subcat] = tb
def log_menu(name, data): objects = [] title = ui.Textbox.static_textbox(name, tsize=35) title.rect.topleft = (30, 20) objects.append(title) info_rect = pg.Rect(0, 0, 400, 200) info_surf = pg.Surface(info_rect.size).convert() pg.draw.rect(info_surf, (255, 255, 255), info_rect, width=3, border_radius=10) info_rect.topleft = (30, 150) i = ui.Image(info_surf) i.rect = info_rect.copy() objects.append(i) label = ui.Textbox.static_textbox('info:', tsize=20) label.rect.bottomleft = info_rect.topleft label.rect.x += 10 label.rect.y -= 5 objects.append(label) node_info = ui.Textbox(data['info']) node_info.fit_text(info_rect.inflate(-10, -10), tsize=20, allignment='l') node_info.rect.center = info_rect.center objects.append(node_info) key_tb = ui.Textbox.static_textbox('key') key_tb.rect.topleft = (width // 2, 40) objects.append(key_tb) value_tb = ui.Textbox.static_textbox('return value') value_tb.rect.x = key_tb.rect.right + 30 value_tb.rect.y = key_tb.rect.y objects.append(value_tb) value_rect = value_tb.rect.inflate(150, 50) y = value_tb.rect.bottom + 20 for key, value in data['data'].items(): k = ui.Textbox.static_textbox(key) k.rect.right = key_tb.rect.right k.rect.y = y objects.append(k) v = ui.Textbox(value) v.fit_text(value_rect, allignment='l') v.crop_fitted() v.rect.left = value_tb.rect.left v.rect.y = y objects.append(v) y = v.rect.bottom + 5 b = ui.Button.text_button('back', color2=(0, 200, 0), tag='break') b.rect.centerx = width // 2 b.rect.bottom = height - 10 objects.append(b) return objects
def error_screen(errors): objects = [] body = pg.Rect(0, 0, 500, 300) upper = pg.Rect(0, 0, 500, 250) lower = pg.Rect(0, 100, 500, 50) outline = pg.Rect(0, 0, body.width + 10, body.height + 10) s = pg.Surface(outline.size).convert() pg.draw.rect(s, (255, 255, 255), outline, border_radius=10) body.center = outline.center pg.draw.rect(s, (100, 100, 100), body, border_radius=10) lower.bottomleft = body.bottomleft pg.draw.rect(s, (50, 50, 50), lower, border_bottom_right_radius=10, border_bottom_left_radius=10) i = ui.Image(s) i.rect.center = (width // 2, height // 2) objects.append(i) body.center = (width // 2, height // 2) upper.topleft = body.topleft lower.bottomleft = body.bottomleft num = len(errors) if num: text_rect = pg.Rect(0, 0, 200, 25) text_rect.center = upper.center if len(errors) < 6: message = f"{num} error{'s' if num > 1 else ''} found:" else: message = '5+ errors found:' t = ui.Textbox(message, olcolor=(0, 0, 0)) t.fit_text(text_rect, tsize=25, allignment='l') t.rect.topleft = upper.topleft t.rect.x += 10 t.rect.y += 10 objects.append(t) x = t.rect.left y = t.rect.bottom + 10 text_rect = pg.Rect(0, 0, body.width, 30) for err in errors[:5]: t = ui.Textbox(err, olcolor=(0, 0, 0)) t.fit_text(text_rect, tsize=25, allignment='l') t.rect.topleft = (x, y) objects.append(t) y += text_rect.height + 10 rx = t.rect.left - i.rect.left ry = t.rect.top - i.rect.top pg.draw.line(i.image, (0, 0, 0), (rx, ry + t.rect.height + 5), (i.rect.width - rx, ry + t.rect.height + 5), width=2) else: text_rect = pg.Rect(0, 0, upper.width - 15, upper.height - 15) text_rect.center = upper.center message = 'all tests passed, no errors found!' t = ui.Textbox(message, olcolor=(0, 0, 0)) t.fit_text(text_rect, tsize=25) t.rect.center = text_rect.center objects.append(t) b = ui.Button.text_button('ok', color2=(0, 200, 0), tag='break') b.rect.center = lower.center objects.append(b) return objects
def info_menu(n): objects = [] n = type(n)(None, -1) n.set_enabled(False) with open('data/node_info.json', 'r') as f: data = json.load(f) data = data.get(n.name, {}) title = ui.Textbox(n.get_name(), tsize=35) title.rect.topleft = (30, 20) objects.append(title) info_rect = pg.Rect(0, 0, 400, 200) info_surf = pg.Surface(info_rect.size).convert() pg.draw.rect(info_surf, (255, 255, 255), info_rect, width=3, border_radius=10) info_rect.topleft = (30, 150) i = ui.Image(info_surf) i.rect = info_rect.copy() objects.append(i) label = ui.Textbox('info:', tsize=20) label.rect.bottomleft = info_rect.topleft label.rect.x += 10 label.rect.y -= 5 objects.append(label) node_info = ui.Textbox(data.get('info', '')) node_info.fit_text(info_rect.inflate(-10, -10), tsize=20, allignment='l') node_info.rect.center = info_rect.center if data.get('tips'): node_tips = ui.Textbox(data['tips']) node_tips.fit_text(info_rect.inflate(-10, -10), tsize=20, allignment='l') node_tips.rect.center = info_rect.center node_text = ui.Image(node_info.image) node_text.rect.center = info_rect.center objects.append(node_text) def update_info(): if label.get_message() == 'info:': label.set_message('tips:') node_text.image = node_tips.image else: label.set_message('info:') node_text.image = node_info.image b = ui.Button.text_button('>', padding=(15, 15), func=update_info, border_radius=20) b.rect.midleft = info_rect.midright objects.append(b) else: objects.append(node_info) port_rect = pg.Rect(0, 0, 300, 200) w, h = port_rect.size port_surf = pg.Surface(port_rect.size).convert() port_surf.fill((1, 1, 1)) port_info_rect = pg.Rect(5, 20, w - 10, h - 25) pg.draw.rect(port_surf, (0, 0, 0), port_info_rect) port_surf.set_colorkey((1, 1, 1)) port_box = ui.Image(port_surf, bgcolor=(100, 100, 100)) port_box.rect = port_rect.copy() port_box.rect.topleft = (650, 100) objects.append(port_box) port_label_rect = pg.Rect(0, 0, w, 20) port_label_rect.midtop = port_box.rect.midtop port_info_rect.midtop = port_label_rect.midbottom port_info_rect.inflate_ip(-10, -5) port_data = [] port_index = [0] for p in n.ports: info_text = data.get('ports', {}).get(str(p.port)) if info_text is None: continue d = {'port': p, 'color': p.get_color(p.types)} p_label = ui.Textbox(f'Port {p.port}', fgcolor=(0, 0, 0)) p_label.fit_text(port_label_rect, tsize=20, allignment='l') d['label'] = p_label.image p_info = ui.Textbox(info_text) p_info.fit_text(port_info_rect, tsize=15, allignment='l') d['info'] = p_info.image port_data.append(d) n.rect.midtop = port_box.rect.midbottom n.rect.y += 100 n.set_port_pos() objects.append(n) if port_data: port_label = ui.Image(port_data[0]['label']) port_label.rect.center = port_label_rect.center port_label.rect.x += 5 objects.append(port_label) port_info = ui.Image(port_data[0]['info']) port_info.rect.center = port_info_rect.center objects.append(port_info) port_box.set_background(port_data[0]['color']) def update_points(port): start = port.rect.center end = port_box.rect.midbottom xs, ys = start xe, ye = end if port.port > 0: return (start, (xs - 20, ys), (xs - 20, n.rect.top - 50), (port_box.rect.centerx, n.rect.top - 50), end) else: return (start, (xs + 20, ys), (xs + 20, n.rect.top - 50), (port_box.rect.centerx, n.rect.top - 50), end) points = update_points(port_data[0]['port']) o = Draw_Lines(points, color=port_data[0]['color']) objects.append(o) if len(port_data) > 1: def update_port_info(port_index, dir=None, i=None): if i is None: port_index[0] = (port_index[0] + dir) % len(port_data) else: port_index[0] = i d = port_data[port_index[0]] port_label.image = d['label'] port_info.image = d['info'] port_box.set_background(d['color']) o.set_color(d['color']) o.set_points(update_points(d['port'])) b = ui.Button.text_button('>', padding=(15, 15), func=update_port_info, args=[port_index], kwargs={'dir': 1}, border_radius=20) b.rect.midleft = port_box.rect.midright objects.append(b) b = ui.Button.text_button('<', padding=(15, 15), func=update_port_info, args=[port_index], kwargs={'dir': -1}, border_radius=20) b.rect.midright = port_box.rect.midleft objects.append(b) for i, pd in enumerate(port_data): r = pd['port'].rect b = ui.Button(r.size, func=update_port_info, args=[port_index], kwargs={'i': i}) b.rect.center = r.center objects.insert(0, b) else: objects.pop(-2) b = ui.Button.text_button('back', color2=(0, 200, 0), tag='break') b.rect.centerx = width // 2 b.rect.bottom = height - 10 objects.append(b) return objects
import ui, caesar, vernam, aes import rsa_encryption as rsa #Defining the menu page, menu = ui.Page(Caesar=ui.Button("Caesar Cipher", 50, 325, 250, 100), Vernam=ui.Button("Vernam Cipher", 724, 325, 250, 100), RSA=ui.Button("RSA", 50, 575, 250, 100), AES=ui.Button("AES", 724, 575, 250, 100), subtitle1=ui.Text("Simple Ciphers", (512, 250), ui.subtitle_font), subtitle2=ui.Text("Complex Ciphers", (512, 500), ui.subtitle_font), explanation=ui.Text("A program for teaching people about encryption", (512, 150), ui.header3)) #Defining the back to menu button that is used across all the pages. back_button = ui.Button("Menu", 50, 35, 150, 100, function_to_call=menu.run_page) #Defining the Caesar cipher page caesar_page = ui.Page(back_button, encrypt_text_box = ui.Textbox(360, 250, 300, 50, ui.screen, 20), encrypt_shift_box = ui.Textbox(360, 400, 300, 50, ui.screen, 15, True, 2, "1", True), plaintext_title = ui.Text("Plaintext:", (512, 200), ui.subtitle_font), shift_title=ui.Text("Shift:", (512, 350), ui.subtitle_font), clear_textbox_button = ui.Button("Clear Boxes", 730, 300, 175, 100), encrypt_button = ui.Button("Encrypt!", 330, 535, 150, 100, to_return=True), decrypt_button = ui.Button("Decrypt!", 550, 535, 150, 100, to_return=True), ciphertext = ui.OutputBox(50, 650, 924, 100), ciphertext_label = ui.Text("Output:", (125, 630), ui.header3)) #Defining all of the buttons functions and linked textboxes and output boxes for the Caesar cipher page menu.Caesar.function = caesar_page.run_page caesar_page.clear_textbox_button.function = caesar_page.clear_textboxes caesar_page.encrypt_button.dedi_output_box = caesar_page.ciphertext caesar_instance = caesar.Caesar caesar_page.encrypt_button.function = caesar_instance.caesar caesar_page.encrypt_button.linked_textboxes = [caesar_page.encrypt_text_box, caesar_page.encrypt_shift_box]
def builder_objects(self): objects = [self.card] x = self.objects_dict['card'].rect.right + 10 for i, rgb in enumerate(('r', 'g', 'b')): s = ui.RGBSlider((20, 200), 'y', rgb, hcolor=(255, 255, 255), func=self.update_color) s.rect.topleft = (x, 10) s.set_state(self.objects_dict['card'].color[i]) objects.append(s) self.objects_dict[rgb] = s x += s.rect.width + 40 type_text = ui.Textbox.static_textbox('card type:', fgcolor=(255, 255, 255)) type_text.rect.topleft = s.rect.topleft type_text.rect.x += 50 objects.append(type_text) ts = Type_Selector(self.card) ts.rect.midtop = type_text.rect.midbottom ts.rect.y += 5 objects.append(ts) self.objects_dict['type_select'] = ts tag_text = ui.Textbox.static_textbox('card tags:', fgcolor=(255, 255, 255)) tag_text.rect.topleft = type_text.rect.topright tag_text.rect.x += 50 objects.append(tag_text) tag_select = Tag_Selector(self.card) tag_select.rect.midtop = tag_text.rect.midbottom tag_select.rect.y += 5 objects.append(tag_select) self.objects_dict['tag_select'] = tag_select custom_text = ui.Textbox.static_textbox('custom tag:', fgcolor=(255, 255, 255)) custom_text.rect.topleft = tag_text.rect.topright custom_text.rect.x += 30 objects.append(custom_text) custom = ui.Input((100, 30), 'tag', color=(255, 255, 255), fgcolor=(0, 0, 0), check=ui.Input.alnum_check) custom.set_func(add_custom_tag, args=[custom, tag_select]) custom.rect.topleft = custom_text.rect.bottomleft custom.rect.y += 5 objects.append(custom) self.objects_dict['custom_tag'] = custom b = ui.Button.text_button('import image', func=self.open_image) b.rect.topleft = self.objects_dict['r'].rect.bottomleft b.rect.y += 20 objects.append(b) self.objects_dict['image'] = b b = ui.Button.text_button('use webcam', func=self.record_video) b.rect.topleft = self.objects_dict['image'].rect.bottomleft b.rect.y += 20 objects.append(b) self.objects_dict['cam'] = b b = ui.Button.text_button('node editor', func=self.node_editor.run) b.rect.topleft = self.objects_dict['cam'].rect.bottomleft b.rect.y += 20 objects.append(b) self.objects_dict['node_editor'] = b b = ui.Button.text_button('save card', func=save_card, args=[self.card, self.node_editor]) b.rect.topleft = self.objects_dict['node_editor'].rect.bottomleft b.rect.y += 20 objects.append(b) self.objects_dict['save'] = b b = ui.Button.text_button('publish card', func=publish_card, args=[self.card, self.node_editor]) b.rect.topleft = self.objects_dict['save'].rect.bottomleft b.rect.y += 20 objects.append(b) self.objects_dict['publish'] = b b = ui.Button.text_button('return to menu', tag='break') b.rect.topleft = self.objects_dict['publish'].rect.bottomleft b.rect.y += 20 objects.append(b) self.objects_dict['quit'] = b t = ui.Textbox('published: False', tsize=20) t.set_func(self.update_published) t.rect.topleft = self.objects_dict['quit'].rect.topright t.rect.x += 20 objects.append(t) self.objects_dict['published'] = t am = Audio_Manager(self.mic) am.rect.topleft = self.objects_dict['published'].rect.bottomleft am.rect.y += 20 objects.append(am) self.objects_dict['audio_manager'] = am return objects
def __init__(self, name='Title', type='play', description='description', tags=None, color=[161, 195, 161], id=None, image='', node_data={}, weight=1, code='', lines=(0, 0), published=False, **kwargs): super().__init__() self.id = id self.node_data = node_data self.weight = weight self.code = code self.lines = lines self.published = published if tags is None: tags = [] self.image = pg.Surface(card_size).convert_alpha() self.image.fill((50, 50, 50)) self.rect = self.image.get_rect() r = self.rect.inflate(-30, -30) pg.draw.rect(self.image, (1, 0, 0), r) self.image.set_colorkey((1, 0, 0)) self.objects_dict = {} bg = ui.Image(pg.Surface(r.size).convert()) bg.image.fill(color) bg.rect.center = self.rect.center self.add_child(bg, current_offset=True) self.objects_dict['bg'] = bg name_box = ui.Image_Manager.get_surface((255, 45), color=(255, 255, 255), olcolor=(0, 0, 0)) name = ui.Input.from_image(name_box, message=name, fitted=True, color=(0, 0, 0, 0), fgcolor=(0, 0, 0), tsize=30) name.rect.centerx = bg.rect.centerx name.rect.y = 30 self.add_child(name, current_offset=True) self.objects_dict['name'] = name pw, ph = Card.IMAGE_SIZE pic_outline = ui.Image.from_style((pw + 4, ph + 4), color=(0, 0, 0)) pic_outline.rect.centerx = bg.rect.centerx pic_outline.rect.y = name.rect.bottom + 6 self.objects_dict['pic_outline'] = pic_outline self.add_child(pic_outline, current_offset=True) pic = ui.Image(Card.load_pic(image)) pic.rect.center = pic_outline.rect.center self.objects_dict['pic'] = pic self.add_child(pic, current_offset=True) desc_box = ui.Image_Manager.get_surface((225, 170), color=(255, 255, 255), olcolor=(0, 0, 0)) desc = ui.Input.from_image(desc_box, message=description, fitted=True, color=(0, 0, 0, 0), fgcolor=(0, 0, 0), tsize=35, length=300) desc.rect.centerx = bg.rect.centerx desc.rect.y += 300 self.add_child(desc, current_offset=True) self.objects_dict['desc'] = desc type_box_image = ui.Image_Manager.get_surface( ((pic.rect.width // 3) - 4, 20), color=(255, 255, 255), olcolor=(0, 0, 0)) type_box = ui.Image(type_box_image) type_box.rect.x = pic.rect.x type_box.rect.y += 475 self.add_child(type_box, current_offset=True) self.objects_dict['type_box'] = type_box type_rect = type_box_image.get_rect() type = ui.Textbox(type, tsize=45, fgcolor=(0, 0, 0)) type.fit_text(type_rect) type.rect.center = type_box.rect.center self.add_child(type, current_offset=True) self.objects_dict['type'] = type tags_box_image = ui.Image_Manager.get_surface( (pic.rect.width - type.rect.width - 4, 20), color=(255, 255, 255), olcolor=(0, 0, 0)) tags_box = ui.Image(tags_box_image) tags_box.rect.right = pic.rect.right tags_box.rect.y += 475 self.add_child(tags_box, current_offset=True) self.objects_dict['tags_box'] = tags_box tags_rect = tags_box_image.get_rect() tags = ui.Textbox(str(tags).replace("'", ''), tsize=45, fgcolor=(0, 0, 0)) tags.fit_text(tags_rect) tags.rect.center = tags_box.rect.center self.add_child(tags, current_offset=True) self.objects_dict['tags'] = tags