#!/usr/bin/env python3.5 # Copyright 2017 Digital # # This file is part of BeeWatch. # # BeeWatch is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # BeeWatch is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with BeeWatch. If not, see . import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from gi.repository import Gdk import logging import logging.config import os import pprint import random import string import sys import time import yaml # My libraries import beewatch import beewatch.gui import digilib.misc import digilib.gui import digilib.network ## Logging lgui = logging.getLogger(__name__+".gui") class ChildConsole(digilib.gui.ChildConsole): def __init__(self,get_client=None): super(ChildConsole,self).__init__(get_client) self.text_buffer_log.set_text("program:HAIIII") self.add_msg(digilib.misc.LOREM_IPSUM,"code") self.add_msg(digilib.misc.LOREM_IPSUM,"code") self.add_msg(digilib.misc.LOREM_IPSUM,"code") class ChildOverview(digilib.gui.ChildOverview): def __init__(self): super(ChildOverview,self).__init__() self.prepare() def prepare(self): self.infobox1 = digilib.gui.InfoFrame() self.infobox2 = digilib.gui.InfoFrame() self.make_infobox_controller() self.make_infobox_weight() self.make_infobox_test(self.infobox1) self.make_infobox_test(self.infobox2) self.layout.attach(self.infobox_controller,0,0,1,1) self.layout.attach(self.infobox_weight, 1,0,1,1) self.layout.attach(self.infobox1, 0,1,1,1) self.layout.attach(self.infobox2, 1,1,1,1) def make_infobox_controller(self): levelbar_cpu = Gtk.LevelBar() levelbar_cpu.set_hexpand(True) levelbar_mem = Gtk.LevelBar() levelbar_mem.set_hexpand(True) self.infobox_controller = digilib.gui.InfoFrame(label="Weight") self.infobox_controller.add_line("uptime","Uptime:","99:59:592017-03-06 12:56") self.infobox_controller.add_line("ip","IP:","30.47.10.O9",None) self.infobox_controller.add_line("cpu","CPU:",30,"%", levelbar_cpu,True) self.infobox_controller.add_line("mem","Memory:",0.40,"%", levelbar_mem,True) def make_infobox_weight(self): self.infobox_weight = digilib.gui.InfoFrame(label="Weight") self.infobox_weight.add_line("total","Total:","50 kg") self.infobox_weight.add_line("bees","Bees:","20 kg") self.infobox_weight.add_line("honey","Honey:","42 kg") self.infobox_weight.add_line("time","Time:","2017-03-06 12:56") def make_infobox_test(self,infobox): infobox.add_line("1","Label:","Value") infobox.add_line("2","Baum:","Haus") infobox.add_line("3","Weight:","40 kg") infobox.add_line("4","Wiff","Woff") class ChildControl(digilib.gui.ChildControl): def __init__(self): super(ChildControl, self).__init__() self.prepare() def prepare(self): pass class ChildSettings(digilib.gui.ChildSettings): def __init__(self): super(ChildSettings, self).__init__() self.prepare() def prepare(self): pass class BeeWindow(digilib.gui.WindowBase): def __init__(self,host,port,af_family): super(BeeWindow,self).__init__(title="BeeWatch") self.host = host self.port = port self.af_family = af_family self.client = None self.set_border_width(10) self.tb = digilib.misc.Container() self.prepare() self.add_key_shortcut("Control_L q",self.quit) self.add_key_shortcut("Control_L h e",lgui.info,["hello world"]) self.add_key_shortcut("Control_L h i",lgui.info,["hi world"]) # self.client = self.make_client() def prepare(self): self.child_console = ChildConsole(self.get_client) self.child_overview = ChildOverview() self.child_control = ChildControl() self.child_settings = ChildSettings() self.child_test = self.make_child_test() self.child_label = self.make_child_label() self.make_toolbar() self.stack = Gtk.Stack() self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT_RIGHT) self.stack.set_transition_duration(750) self.stack.add_titled(self.child_console, "child_console", "Console") self.stack.add_titled(self.child_overview, "child_overview", "Overview") self.stack.add_titled(self.child_control, "child_control", "Control") self.stack.add_titled(self.child_settings, "child_settings", "Settings") self.stack.add_titled(self.child_test, "check", "Check Button") self.stack.add_titled(self.child_label, "label", "A label") self.stack_switcher = Gtk.StackSwitcher() self.stack_switcher.set_stack(self.stack) self.scrolled_switcher = Gtk.ScrolledWindow() self.scrolled_switcher.add(self.stack_switcher) self.vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6) self.vbox.add(self.tb.toolbar) self.vbox.add(self.scrolled_switcher) self.vbox.add(self.stack) self.add(self.vbox) # self.vbox.pack_start(self.stack_switcher, True, True, 0) # self.vbox.pack_start(self.stack, True, True, 0) def make_toolbar(self): self.tb.toolbar = Gtk.Toolbar() self.tb.img_connect = Gtk.Image(stock=Gtk.STOCK_CONNECT) self.tb.img_connect.set_tooltip_text("Connect") self.tb.bconnect = Gtk.ToolButton() self.tb.bconnect.set_icon_widget(self.tb.img_connect) self.tb.bconnect.connect("clicked",self.on_connect_request) self.tb.img_disconnect = Gtk.Image(stock=Gtk.STOCK_DISCONNECT) self.tb.img_disconnect.set_tooltip_text("Disconnect") self.tb.bdisconnect = Gtk.ToolButton() self.tb.bdisconnect.set_icon_widget(self.tb.img_disconnect) self.tb.bdisconnect.connect("clicked",self.on_disconnect_request) self.tb.img_auto_scroll = Gtk.Image(stock=Gtk.STOCK_GOTO_BOTTOM) self.tb.img_auto_scroll.set_tooltip_text("Toggle auto scrolling") self.tb.bauto_scroll = Gtk.ToolButton() self.tb.bauto_scroll.set_icon_widget(self.tb.img_auto_scroll) self.tb.bauto_scroll.connect( "clicked",self.child_console.toggle_scroll) self.tb.img_scroll_down = Gtk.Image(stock=Gtk.STOCK_GO_DOWN) self.tb.img_scroll_down.set_tooltip_text("Toggle auto scrolling") self.tb.bscroll_down = Gtk.ToolButton() self.tb.bscroll_down.set_icon_widget(self.tb.img_scroll_down) self.tb.bscroll_down.connect( "clicked",self.child_console.scroll_down) self.tb.iconnected = Gtk.ToolItem() self.tb.img_connected = Gtk.Image(stock=Gtk.STOCK_YES) self.tb.iconnected.set_visible_horizontal(False) self.tb.iconnected.set_visible_vertical(False) self.tb.img_connected.set_tooltip_text("Connection Status: Connected") self.tb.idisconnected = Gtk.ToolItem() self.tb.img_disconnected = Gtk.Image(stock=Gtk.STOCK_NO) self.tb.img_disconnected.set_tooltip_text( "Connection Status: Disconnected") self.tb.iconnected.add(self.tb.img_connected) self.tb.idisconnected.add(self.tb.img_disconnected) self.tb.toolbar.add(self.tb.iconnected) self.tb.toolbar.add(self.tb.idisconnected) self.tb.toolbar.add(self.tb.bconnect) self.tb.toolbar.add(self.tb.bdisconnect) self.tb.toolbar.add(self.tb.bauto_scroll) self.tb.toolbar.add(self.tb.bscroll_down) def make_child_test(self): box_test = Gtk.FlowBox() for i in range(0,10): checkbutton = Gtk.CheckButton("Click me!") box_test.add(checkbutton) return box_test def make_child_label(self): grid = Gtk.Grid() label = Gtk.Label() label.set_markup("A fancy label") grid.add(label) return grid def make_client(self): client = digilib.network.Client( host=self.host, port=self.port, af_family=self.af_family, handle_data_func=self.child_console.add_msg_threadsafe, ) return client def get_client(self): return self.client def quit(self,*args): lgui.debug("quit") if self.client: self.client.stop() # if self.client.is_connected: Gtk.main_quit() def start(self): self.css_provider = Gtk.CssProvider() self.css_provider.load_from_path("config/style.css") screen = Gdk.Screen.get_default() self.style_context = Gtk.StyleContext() self.style_context.add_provider_for_screen( screen, self.css_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER, ) self.show_all() self.stack.set_visible_child(self.child_console) Gdk.threads_init() Gtk.main() def on_connect_request(self,widget): try: lgui.debug("connect request") if self.client == None: self.client = self.make_client() if not self.client.is_running(): self.client.start() if not self.client.is_connected: if self.client.connect(): self.tb.iconnected.set_visible_horizontal(True) self.tb.iconnected.set_visible_vertical(True) self.tb.idisconnected.set_visible_horizontal(False) self.tb.idisconnected.set_visible_vertical(False) lgui.debug("client started") else: lgui.debug( "client failed to connect, maybe it is connected") except Exception as e: lgui.error("error trying to connect",exc_info=e) def on_disconnect_request(self,widget): try: lgui.debug("disconnect request") if self.client != None: if self.client.is_connected: self.client.disconnect() self.tb.iconnected.set_visible_horizontal(False) self.tb.iconnected.set_visible_vertical(False) self.tb.idisconnected.set_visible_horizontal(True) self.tb.idisconnected.set_visible_vertical(True) lgui.debug("client disconnected") return lgui.debug( "client failed to disconnect, maybe it wasn't connected") except Exception as e: lgui.error("error trying to disconnect",exc_info=e) def on_scroll_down_request(self,widget): self.child_console.scroll_down() def on_toggle_scroll_request(self,widget): self.child_console.scroll = not self.child_console.scroll def on_exit_button_press(self,*args): self.destroy() Gtk.main_quit() return True