__init__.py.old 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. #! /usr/bin/python3
  2. #
  3. ## LICENSE
  4. # This file is part of MyLibGui.
  5. #
  6. # MyLibGui is free software: you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation, either version 3 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # MyLibGui is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with MyLibGui. If not, see <http://www.gnu.org/licenses/>.
  18. #
  19. ## Imports
  20. # Python Libraries
  21. import gi
  22. gi.require_version('Gtk', '3.0')
  23. from gi.repository import Gtk
  24. from gi.repository import Gdk
  25. import logging
  26. import logging.config
  27. import os
  28. import pprint
  29. import random
  30. import string
  31. import sys
  32. import time
  33. import yaml
  34. # My libraries
  35. import mylibmisc
  36. ## Logging
  37. log = logging.getLogger(__name__+".gui")
  38. ## Global Variables
  39. LOREM_IPSUM = """Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  40. Pellentesque vel mauris non odio pharetra ultricies quis eu turpis.
  41. Proin et tortor eu magna ultricies facilisis tincidunt vehicula nisi.
  42. Donec hendrerit massa id viverra lobortis.
  43. In sed nisl a metus gravida faucibus.
  44. Praesent bibendum mi semper, sagittis mi sit amet, auctor dui.
  45. Sed ac dui sagittis quam ultricies dapibus.
  46. In non elit non felis convallis vestibulum.
  47. Vivamus ornare ante suscipit faucibus pulvinar.
  48. Cras consequat nulla quis quam faucibus mollis.
  49. Nulla dictum sapien in justo sagittis malesuada.
  50. Sed ornare orci quis laoreet elementum.
  51. Sed ornare lacus ac ipsum vulputate vulputate.
  52. Sed accumsan ante nec magna sollicitudin maximus.
  53. Aliquam condimentum magna nec convallis efficitur.
  54. Nam posuere mauris et dui pulvinar, quis iaculis leo aliquam.
  55. Nunc cursus arcu et leo vehicula, quis feugiat mi semper.
  56. """
  57. ## Classes
  58. class LabelValue(Gtk.Label):
  59. def __init__(self, *args,**kwargs):
  60. super(LabelValue, self).__init__(*args,**kwargs)
  61. self.set_css_name("valuelabel")
  62. self.set_halign(Gtk.Align(1))
  63. class LabelName(Gtk.Label):
  64. def __init__(self, *args,**kwargs):
  65. super(LabelName, self).__init__(*args,**kwargs)
  66. self.set_css_name("namelabel")
  67. self.set_halign(Gtk.Align(2))
  68. class InfoFrame(Gtk.Frame):
  69. """docstring for InfoFrame."""
  70. def __init__(self,**kwargs):
  71. super(InfoFrame, self).__init__(**kwargs)
  72. self.lines = {
  73. # id:{
  74. # "layout": layout,
  75. # "widgets": [label_name,label_value,widget],
  76. # "update_func":widget_update_func
  77. # }
  78. }
  79. self.current_line_no = 0
  80. # self.layout = Gtk.Grid(halign=Gtk.Align(1))
  81. self.layout = Gtk.Grid()
  82. self.layout.set_row_spacing(10)
  83. self.layout.set_column_spacing(5)
  84. self.layout.set_column_homogeneous(False)
  85. self.layout.set_hexpand(True)
  86. self.add(self.layout)
  87. def add_line(
  88. self,
  89. identifier,
  90. name,
  91. value,
  92. unit=None,
  93. widget=None,
  94. widget_update_func=None
  95. ):
  96. if id in self.lines.keys():
  97. raise ValueError(
  98. "Identifiers must be uniqe, but '"
  99. +identifier
  100. +"' already exists!"
  101. )
  102. self.lines[identifier] = {
  103. "layout":None,
  104. "wname":None,
  105. "wvalue":None,
  106. "wunit":None,
  107. "wextra":None,
  108. "update_func":None
  109. }
  110. self.lines[identifier]["update_func"] = widget_update_func
  111. # if there is a widget and an update function was passed then update it
  112. if widget_update_func == True:
  113. self.lines[identifier]["update_func"] = widget.set_value
  114. if self.lines[identifier]["update_func"]:
  115. self.lines[identifier]["update_func"](value)
  116. layout = Gtk.Box()
  117. layout.set_spacing(5)
  118. layout.set_homogeneous(False)
  119. self.lines[identifier]["layout"] = layout
  120. # create the labels for the name and value field and also for the unit
  121. # field if an unit was specified
  122. label_name = LabelName(name)
  123. self.lines[identifier]["wname"] = label_name
  124. self.layout.attach(label_name,0,self.current_line_no,1,1)
  125. label_value = LabelValue(value)
  126. self.lines[identifier]["wvalue"] = label_value
  127. layout.add(label_value)
  128. if unit:
  129. label_unit = LabelValue(unit)
  130. self.lines[identifier]["wunit"] = label_unit
  131. layout.add(label_unit)
  132. if widget:
  133. self.lines[identifier]["wextra"] = widget
  134. layout.add(widget)
  135. self.layout.attach(layout,1,self.current_line_no,1,1)
  136. self.current_line_no += 1
  137. def update_name(self,identifier,name):
  138. self.lines[identifier]["wname"].set_label(name)
  139. def update_unit(self,identifier,unit):
  140. self.lines[identifier]["wunit"].set_label(unit)
  141. def update_value(self,identifier,value):
  142. self.lines[identifier]["wvalue"].set_label(str(value))
  143. if self.lines[identifier]["update_func"]:
  144. self.lines[identifier]["update_func"](value)
  145. print(1)
  146. class MyGtkWindow(Gtk.Window):
  147. def __init__(self,title="Don't Panic!"):
  148. super(Gtk.Window,self).__init__(title=title)
  149. self.pressed_keys = []
  150. self.key_shortcuts = []
  151. self.connect("delete-event",self.on_delete_event)
  152. self.connect("key-press-event",self.on_key_press_event)
  153. self.connect("key-release-event",self.on_key_release_event)
  154. def keystring_to_gkd(self, keys):
  155. key_list = keys.split(" ")
  156. known_keys = []
  157. unknown_keys = []
  158. for k in key_list:
  159. if "KEY_"+k in dir(Gdk):
  160. known_keys.append(eval("Gdk.KEY_"+k))
  161. else:
  162. unknown_keys.append(k)
  163. if unknown_keys:
  164. raise ValueError("Unknown Keys: "+", ".join(unknown_keys))
  165. else:
  166. return known_keys
  167. def add_key_shortcut(self,keys,func=None,args=[],kwargs={}):
  168. key_list = self.keystring_to_gkd(keys)
  169. for ks in self.key_shortcuts:
  170. if key_list == ks[0]:
  171. self.key_shortcuts.remove(ks)
  172. break
  173. self.key_shortcuts.append([key_list,func,args,kwargs])
  174. def remove_key_shortcut(self,keys):
  175. key_list = self.keystring_to_gkd(keys)
  176. for ks in self.key_shortcuts:
  177. if key_list == ks[0]:
  178. self.key_shortcuts.remove(ks)
  179. break
  180. def on_delete_event(self,*args):
  181. print(args)
  182. Gtk.main_quit()
  183. def on_key_release_event(self,widget,event):
  184. self.pressed_keys.remove(event.keyval)
  185. def on_key_press_event(self,widget,event):
  186. self.pressed_keys.append(event.keyval)
  187. for keys,func,args,kwargs in self.key_shortcuts:
  188. if keys == self.pressed_keys:
  189. func(*args,**kwargs)
  190. break
  191. def hello_world(self,*args):
  192. print("hello world")
  193. # class ChildConsole(Gtk.Grid):
  194. # def __init__(self,parent=None):
  195. # super(ChildConsole,self).__init__()
  196. # self.parent = parent
  197. # self.history_list = []
  198. # self.history_position = -1
  199. # self.scroll = True
  200. # self.prepare()
  201. # self.button_send.connect("clicked",self.on_send_message_request)
  202. # self.entry_cmd.connect("activate",self.on_send_message_request)
  203. # self.entry_cmd.connect(
  204. # "key-press-event",
  205. # self.on_keypress
  206. # )
  207. # self.add_msg(LOREM_IPSUM,"code")
  208. # self.add_msg(LOREM_IPSUM,"code")
  209. # self.add_msg(LOREM_IPSUM,"code")
  210. # def prepare(self):
  211. # self.scroll_mark = Gtk.TextMark(name="scroll_mark")
  212. # self.text_buffer_log = Gtk.TextBuffer()
  213. # self.text_buffer_log.set_text("program:HAIIII")
  214. # self.text_view_log = Gtk.TextView()
  215. # self.text_view_log.set_buffer(self.text_buffer_log)
  216. # self.text_view_log.set_editable(False)
  217. # self.text_view_log.set_cursor_visible(False)
  218. # self.text_view_log.props.pixels_above_lines = 2
  219. # self.text_view_log.props.pixels_below_lines = 2
  220. # self.text_view_log.props.right_margin = 2
  221. # self.text_view_log.props.left_margin = 6
  222. # self.text_view_log.set_hexpand(True)
  223. # self.text_view_log.set_vexpand(True)
  224. # self.scrolled_window = Gtk.ScrolledWindow()
  225. # self.entry_cmd = Gtk.Entry()
  226. # self.entry_cmd.set_hexpand(True)
  227. # self.button_send = Gtk.Button()
  228. # self.button_send.set_label("send")
  229. # self.scrolled_window.add(self.text_view_log)
  230. # self.attach(self.scrolled_window,0,1,2,1)
  231. # self.attach(self.entry_cmd,0,2,1,1)
  232. # self.attach(self.button_send,1,2,1,1)
  233. # def add_msg(self,text,sender_name="thin air"):
  234. # for line in text.splitlines():
  235. # # if not line.strip():
  236. # # continue
  237. # self.text_buffer_log.insert(
  238. # self.text_buffer_log.get_end_iter(),
  239. # "\n{}:{}".format(sender_name,line.rstrip())
  240. # )
  241. # self.scroll_down(None)
  242. # if self.scroll:
  243. # self.scroll_down(None)
  244. # def add_msg_threadsafe(self,*args,**kwargs):
  245. # Gdk.threads_enter()
  246. # self.add_msg(*args,**kwargs)
  247. # Gdk.threads_leave()
  248. # def send(self,text):
  249. # if self.parent.client:
  250. # if self.parent.client.is_connected:
  251. # self.parent.client.send(text)
  252. # def toggle_scroll(self,*args):
  253. # self.scroll = not self.scroll
  254. # def scroll_down(self,*args):
  255. # self.scroll = True
  256. # self.text_buffer_log.add_mark(
  257. # self.scroll_mark,
  258. # self.text_buffer_log.get_end_iter()
  259. # )
  260. # self.text_view_log.scroll_to_mark(
  261. # mark=self.scroll_mark,
  262. # # mark=self.text_buffer_log.get_insert(),
  263. # within_margin=0.0,
  264. # use_align=True,
  265. # xalign=0.5,
  266. # yalign=0.5
  267. # )
  268. # self.text_buffer_log.delete_mark(self.scroll_mark)
  269. # def get_entry_text(self):
  270. # text = self.entry_cmd.get_text()
  271. # self.entry_cmd.set_text("")
  272. # return text
  273. # def on_send_message_request(self,widget):
  274. # if widget != self.entry_cmd and widget != self.button_send:
  275. # print("what tried to send the message?")
  276. # text = self.get_entry_text()
  277. # if text.strip():
  278. # self.history_position = -1
  279. # if len(self.history_list) == 0:
  280. # self.history_list.insert(0,text)
  281. # else:
  282. # if self.history_list[0] != text:
  283. # self.history_list.insert(0,text)
  284. # self.add_msg(text,"you")
  285. # self.send(text)
  286. # def on_keypress(self,widget,event):
  287. # if not widget == self.entry_cmd:
  288. # print("exiting keypress event function because the widget was \n",
  289. # "not self.entry_cmd")
  290. # return
  291. # if event.keyval == Gdk.KEY_Up: # Up
  292. # if self.history_position < len(self.history_list)-1:
  293. # self.history_position += 1
  294. # text = self.history_list[self.history_position]
  295. # self.entry_cmd.set_text(text)
  296. # return True
  297. # elif event.keyval == Gdk.KEY_Down: # Down
  298. # text = self.entry_cmd.get_text()
  299. # if self.history_position == -1 and text != "":
  300. # self.entry_cmd.set_text("")
  301. # elif self.history_position == 0:
  302. # self.history_position = -1
  303. # self.entry_cmd.set_text("")
  304. # elif self.history_position > 0:
  305. # self.history_position -= 1
  306. # text = self.history_list[self.history_position]
  307. # self.entry_cmd.set_text(text)
  308. # return True
  309. #
  310. # # class ChildOverview(Gtk.FlowBox):
  311. # class ChildOverview(Gtk.ScrolledWindow):
  312. # def __init__(self):
  313. # super(ChildOverview,self).__init__()
  314. # self.set_name("child_overview")
  315. # # self.set_column_homogeneous(True)
  316. # self.prepare()
  317. # def prepare(self):
  318. # self.infobox1 = InfoFrame()
  319. # self.infobox2 = InfoFrame()
  320. # self.make_infobox_controller()
  321. # self.make_infobox_weight()
  322. # self.make_infobox_test(self.infobox1)
  323. # self.make_infobox_test(self.infobox2)
  324. # self.layout = Gtk.Grid()
  325. # self.layout.set_column_homogeneous(True)
  326. # # self.layout.set_row_homogeneous(True)
  327. # # self.layout.add(self.infbox_controller.frame)
  328. # # self.layout.add(self.infbox_weight.frame)
  329. # # self.layout.add(self.infbox1.frame)
  330. # # self.layout.add(self.infbox2.frame)
  331. # self.layout.attach(self.infobox_controller,0,0,1,1)
  332. # self.layout.attach(self.infobox_weight, 1,0,1,1)
  333. # self.layout.attach(self.infobox1, 0,1,1,1)
  334. # self.layout.attach(self.infobox2, 1,1,1,1)
  335. # self.add(self.layout)
  336. # def make_infobox_controller(self):
  337. # levelbar_cpu = Gtk.LevelBar()
  338. # levelbar_cpu.set_hexpand(True)
  339. # levelbar_mem = Gtk.LevelBar()
  340. # levelbar_mem.set_hexpand(True)
  341. # # levelbar_mem.set_value(0.4)
  342. # self.infobox_controller = InfoFrame(label="Weight")
  343. # self.infobox_controller.add_line("uptime","Uptime:","99:59:592017-03-06 12:56")
  344. # self.infobox_controller.add_line("ip","IP:","30.47.10.O9",None)
  345. # self.infobox_controller.add_line("cpu","CPU:",30,"%",
  346. # # levelbar_cpu,levelbar_cpu.set_value)
  347. # levelbar_cpu,True)
  348. # self.infobox_controller.add_line("mem","Memory:",0.40,"%",
  349. # levelbar_mem,levelbar_mem.set_value)
  350. # # self.infobox_controller.add_line("mem_temp","Memory temp:","43 C")
  351. # # self.infobox_controller.add_line("",":","")
  352. # def make_infobox_weight(self):
  353. # self.infobox_weight = InfoFrame(label="Weight")
  354. # self.infobox_weight.add_line("total","Total:","50 kg")
  355. # self.infobox_weight.add_line("bees","Bees:","20 kg")
  356. # self.infobox_weight.add_line("honey","Honey:","42 kg")
  357. # self.infobox_weight.add_line("time","Time:","2017-03-06 12:56")
  358. # # self.infobox_weight.update_name("honey","Honi:")
  359. # # self.infobox_weight.update_value("honey","43 kg")
  360. # def make_infobox_test(self,infobox):
  361. # infobox.add_line("1","Label:","Value")
  362. # infobox.add_line("2","Baum:","Haus")
  363. # infobox.add_line("3","Weight:","40 kg")
  364. # infobox.add_line("4","Wiff","Woff")
  365. #
  366. # class ChildControl(Gtk.Grid):
  367. # def __init__(self):
  368. # super(ChildControl,self).__init__()
  369. # self.prepare()
  370. # def prepare(self):
  371. # self.label = Gtk.Label()
  372. # self.label.set_markup("<big>Another fancy self.label</big>")
  373. # self.add(self.label)
  374. #
  375. # class ChildSettings(Gtk.Grid):
  376. # def __init__(self):
  377. # super(ChildSettings,self).__init__()
  378. # self.prepare()
  379. # def prepare(self):
  380. # self.label = Gtk.Label()
  381. # self.label.set_markup("<big>Another fancy self.label</big>")
  382. # self.add(self.label)
  383. #