123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- #!/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 <http://www.gnu.org/licenses/>.
- 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("<big>A fancy label</big>")
- 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
|