Advertisement
Guest User

Untitled

a guest
Nov 20th, 2015
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.44 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding:Utf-8 -*-
  3.  
  4.  
  5. """
  6. HandyMenu : menu principal de la distribution
  7. HandyLinux <http://handylinux.org>
  8.  
  9. Auteurs :
  10. - HandyMenu-v1/2 : aka handy-menu
  11. arnault perret <arpinux@member.fsf.org>
  12. Meier Link <lucian.von.ruthven@gmail.com>
  13. manon crunchiikette <contact@handylinux.org>
  14. etienne de paris <contact@handylinux.org>
  15. fibi bestesterever <contact@handylinux.org>
  16.  
  17. - HandyMenu v3 : aka handymenu
  18. Xavier Cartron (thuban@yeuxdelibad.net)
  19.  
  20. licence : GNU General Public Licence v3
  21. Description : Handymenu from scratch
  22. Dépendances : python-gtk2
  23.  
  24. """
  25.  
  26. version = "3.2"
  27. auteur = "thuban"
  28. licence = "GPLv3"
  29. homepage = "https://handylinux.org"
  30.  
  31. import os
  32. import sys
  33. import pygtk
  34. pygtk.require('2.0')
  35. import gtk
  36. import gettext
  37. from hm_utils import *
  38.  
  39. gettext.bindtextdomain('handymenu', '/usr/share/locale')
  40. gettext.textdomain('handymenu')
  41. _ = gettext.gettext
  42.  
  43.  
  44. class Handymenu():
  45. def close_application(self, widget, event, data=None):
  46. # tests nécessaires pour que seul clic-gauche et Entrée soient valables
  47. if event.type == gtk.gdk.BUTTON_RELEASE and \
  48. event.state & gtk.gdk.BUTTON1_MASK:
  49. gtk.main_quit()
  50. elif event.type == gtk.gdk.KEY_PRESS:
  51. if event.keyval == gtk.keysyms.Return:
  52. gtk.main_quit()
  53.  
  54. def configure(self, data=None):
  55. os.system(configcmd)
  56. gtk.main_quit()
  57.  
  58. def about(self, wid=None, data=None):
  59. # fenêtre à propos.
  60. m = gtk.MessageDialog(type=gtk.MESSAGE_INFO,\
  61. buttons = gtk.BUTTONS_OK)
  62. m.set_markup(_('<b>Handymenu</b>\n\n\
  63. version : {0}\n\
  64. author : {1}\n\
  65. licence : {2}\n\
  66. homepage : {3}').format(version, auteur, licence, homepage))
  67. ret = m.run()
  68. if ret == gtk.RESPONSE_DELETE_EVENT or ret == gtk.RESPONSE_OK:
  69. m.destroy()
  70.  
  71. def add_recent(self,app):
  72. """add a recent application
  73. appname, icon, cmd= app['name'], app['icon'], app['cmd']
  74. """
  75. max = 6 # maximum d'applications récentes
  76.  
  77. for s in self.config:
  78. if s['id'] == 'recent': # on prend la bonne section
  79. # check if app is not already in recents
  80. if app not in s['apps']:
  81. s['apps'].insert(0,app)
  82. # on vire les vieux éléments
  83. if len(s['apps']) > max:
  84. s['apps'].pop()
  85. save_config(self.config)
  86.  
  87. def exec_app(self, widget, event, data):
  88. exe = False
  89. if event.type == gtk.gdk.BUTTON_RELEASE and \
  90. event.state & gtk.gdk.BUTTON1_MASK:
  91. exe = True
  92. elif event.type == gtk.gdk.KEY_PRESS:
  93. if event.keyval == gtk.keysyms.Return:
  94. exe = True
  95. if exe:
  96. appname, icon, cmd= data['name'], data['icon'], data['cmd']
  97. open_cmd(cmd.strip())
  98. self.add_recent(data)
  99. if self.closeafterrun:
  100. gtk.main_quit()
  101.  
  102. def change_bg_on_focus(self,widget,b):
  103. exe = False
  104. settings = gtk.settings_get_default()
  105. colors = settings.get_property("gtk-color-scheme")
  106. colors=colors.split("\n")
  107. for color in colors:
  108. if 'base' in color:
  109. exe = True
  110. if exe:
  111. ebox = widget.get_parent()
  112. ebox.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#41B1FF"))
  113.  
  114. def change_bg_on_focus_leave(self,widget,b):
  115. settings = gtk.settings_get_default()
  116. colors = settings.get_property("gtk-color-scheme")
  117. colors=colors.split("\n")
  118. exe = False
  119. for color in colors:
  120. if 'base' in color:
  121. base_color=color.split(':')[1].strip()
  122. exe = True
  123. if exe:
  124. ebox = widget.get_parent()
  125. ebox.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(base_color))
  126.  
  127. def create_tabs(self):
  128. self.n_onglets = len(self.config)
  129. for s in self.config:
  130. # Description du bouton
  131. label = gtk.Label(s['name'])
  132. label.set_width_chars(onglet_width) # pour avoir des onglets uniformes
  133. # onglet coloré
  134. label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#41B1FF"))
  135.  
  136. n = len(s['apps']) # number of apps to show
  137. if n <= 4: # si peu d'applications, 1 seule ligne
  138. r = 1
  139. else:
  140. r = 2 # two rows
  141.  
  142. if n%2==0: # nombre d'applis pair ou pas
  143. c = n/r - 1
  144. else:
  145. c = n/r
  146. if n > 8 : # beaucoup d'applications : + de 2 lignes
  147. c = 4
  148. r = n/c
  149.  
  150. if n == 0 : # empty section
  151. c = 1
  152.  
  153. page = gtk.Table(rows=r, columns=c, homogeneous=True)
  154. page.grab_focus()
  155. page.set_row_spacings(10)
  156. page.set_col_spacings(10)
  157.  
  158. cur = [0,0]
  159. if n > 0:
  160. for a in s['apps']:
  161. appname, icon, cmd, generic = a['name'], a['icon'], a['cmd'], a['generic']
  162. # image utilisée dans le bouton
  163. image = gtk.Image()
  164. if icon.endswith('.png') or icon.endswith('.jpg'):
  165. pixbuf = gtk.gdk.pixbuf_new_from_file(icon)
  166. scaled_buf = pixbuf.scale_simple(iconsize,iconsize,gtk.gdk.INTERP_BILINEAR)
  167. image.set_from_pixbuf(scaled_buf)
  168. else:
  169. image.set_from_icon_name(icon, gtk.ICON_SIZE_BUTTON)
  170. image.set_pixel_size(iconsize)
  171. # nom de l'appli
  172. bapp = gtk.Button(label=appname)
  173. bapp.set_image(image)
  174. # l'image est au dessus du texte
  175. bapp.set_image_position(gtk.POS_TOP)
  176. # apparence du bouton
  177. bapp.set_relief(gtk.RELIEF_NONE)
  178. bapp.connect("button_release_event", self.exec_app, a)
  179. bapp.connect("key_press_event", self.exec_app, a)
  180. # #if not self.modeacess:
  181. # # bapp.connect("focus_in_event", self.change_bg_on_focus)
  182. # # bapp.connect("focus_out_event", self.change_bg_on_focus_leave)
  183. # # bapp.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.color_parse("#41B1FF"))
  184. # #else:
  185. # # bapp.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.color_parse("#41B1FF"))
  186. # Description du bouton
  187. bulledesc = gtk.Tooltips()
  188. bulledesc.set_tip(bapp, generic)
  189.  
  190. # Le bouton survolé change de couleur
  191. ebox = gtk.EventBox()
  192. ebox.add(bapp)
  193.  
  194. page.attach(ebox, cur[0], cur[0]+1, cur[1], cur[1]+1,\
  195. xoptions=gtk.EXPAND|gtk.FILL, yoptions=gtk.EXPAND|gtk.FILL,\
  196. xpadding=5, ypadding=5)
  197. if cur[0] < c:
  198. cur[0] +=1
  199. elif cur[0] == c:
  200. cur[0] = 0
  201. cur[1] += 1
  202.  
  203. # pour centrer
  204. align = gtk.Alignment(0.5, 0.5, 0, 0)
  205. align.add(page)
  206. self.onglets.append_page(align, label)
  207. else:
  208. desc = gtk.Label(_("This menu is still empty"))
  209. align = gtk.Alignment(0.5, 0.5, 0, 0)
  210. align.add(desc)
  211. self.onglets.append_page(align, label)
  212.  
  213. self.onglets.set_tab_label_packing(align, False, False, gtk.PACK_START)
  214. if self.n_onglets > maxonglets: # dyp il aime pas :P
  215. self.onglets.set_scrollable(True)# dyp y veut pas :P
  216.  
  217. # # def mod_acess(self, widget):
  218. # # self.modacess = widget.get_active()
  219. # # if not self.modeacess: #on enregistre ne pas avoir mode acess
  220. # # with open(noacess,'w') as n:
  221. # # n.write('Thuban veut un câlin :P')
  222. # # elif os.path.isfile(noacess): #on sera en mode acess la prochaine fois
  223. # # os.remove(noacess)
  224.  
  225. def close_after(self, widget):
  226. self.closeafterrun = widget.get_active()
  227. if not self.closeafterrun: #on enregistre de ne pas fermer
  228. with open(noclose,'w') as n:
  229. n.write('Thuban veut un câlin :P')
  230. elif os.path.isfile(noclose): #on ferme la prochiane fois
  231. os.remove(noclose)
  232.  
  233. def make_menu(self):
  234. """build the menu"""
  235. # Conteneur principal
  236. mainbox = gtk.EventBox()
  237. self.window.add(mainbox)
  238.  
  239. vbox = gtk.VBox(False, 2)
  240. vbox.set_border_width(15)
  241. mainbox.add(vbox)
  242.  
  243. # Logo
  244. image = gtk.Image()
  245. image.set_from_file(handymenuicon)
  246. logo = gtk.EventBox()
  247. logo.add(image)
  248. logo.connect_object("button_release_event", self.about, None)
  249. bulledesc = gtk.Tooltips()
  250. bulledesc.set_tip(logo, _("About"))
  251.  
  252. # Titre
  253. title = gtk.Label()
  254. title.set_markup('<span size="32000">HandyMenu </span>')
  255. title.set_justify(gtk.JUSTIFY_CENTER)
  256. titlebox = gtk.EventBox()
  257. titlebox.add(title)
  258. titlebox.connect_object("button_press_event", self.move_win, None)
  259. bulledesc = gtk.Tooltips()
  260. bulledesc.set_tip(titlebox, "handylinux.org")
  261.  
  262. # boutons
  263. # bouton pour fermer
  264. closebtn = gtk.Button()
  265. croix = gtk.Image()
  266. croix.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_MENU)
  267. closebtn.set_image(croix)
  268.  
  269. closebtn.set_relief(gtk.RELIEF_NONE)
  270. closebtn.connect("button_release_event", self.close_application)
  271. closebtn.connect("key_press_event", self.close_application)
  272. bulledesc = gtk.Tooltips()
  273. bulledesc.set_tip(closebtn, _("Close"))
  274.  
  275. # configuration
  276. qbtn = gtk.Button()
  277. image = gtk.Image()
  278. image.set_from_stock(gtk.STOCK_PREFERENCES, gtk.ICON_SIZE_MENU)
  279. qbtn.set_image(image)
  280. qbtn.set_relief(gtk.RELIEF_NONE)
  281. qbtn.connect_object("clicked", self.configure, None)
  282. bulledesc = gtk.Tooltips()
  283. bulledesc.set_tip(qbtn, _("Configure"))
  284.  
  285. # #mode accessbility ou pas
  286. # #modebtn = gtk.CheckButton()
  287. # #modebtn.connect("toggled", self.mod_acess)
  288. # #modebtn.set_active(self.modeacess)
  289. # #bulledesc = gtk.Tooltips()
  290. # #bulledesc.set_tip(modebtn, _("Mode acess"))
  291.  
  292. # fermer ou pas
  293. closeafterbtn = gtk.CheckButton()
  294. closeafterbtn.connect("toggled", self.close_after)
  295. closeafterbtn.set_active(self.closeafterrun)
  296. bulledesc = gtk.Tooltips()
  297. bulledesc.set_tip(closeafterbtn, _("Close after execution"))
  298.  
  299. # boite à boutons
  300. btnbox = gtk.VBox(False,0)
  301. btnbox.pack_start(closebtn, True, True, 0)
  302. btnbox.pack_start(qbtn, True, True, 0)
  303. # #btnbox.pack_start(modebtn, True, True, 0)
  304. btnbox.pack_start(closeafterbtn, True, True, 0)
  305.  
  306. # Boite d'en haut
  307. topbox = gtk.HBox(False, 0)
  308. topbox.pack_start(logo, False, False, 0)
  309. topbox.pack_start(titlebox, True, True, 0)
  310. topbox.pack_start(btnbox, False, False, 0)
  311.  
  312. vbox.pack_start(topbox, True, True, 0)
  313.  
  314. # onglets
  315. self.onglets = gtk.Notebook()
  316. self.onglets.set_tab_pos(gtk.POS_TOP)
  317. self.onglets.set_show_border(False)
  318. align = gtk.Alignment(0.5, 0.5, 0, 0)
  319. align.add(self.onglets)
  320. vbox.pack_start(align, True, True, 0)
  321.  
  322. # Catégories
  323. self.create_tabs()
  324.  
  325. self.window.show_all()
  326.  
  327. def move_win(self, widget, event):
  328. """move window with a simple click"""
  329. self.window.begin_move_drag(event.button, int(event.x_root), int(event.y_root), event.time)
  330.  
  331. def __init__(self):
  332. if os.path.isfile(noclose):
  333. self.closeafterrun = False
  334. else:
  335. self.closeafterrun = True
  336.  
  337. # #if os.path.isfile(noacess):
  338. # # self.modeacess = False
  339. # #else:
  340. # # self.modeacess = True
  341.  
  342. self.n_onglets = 0 # nombre d'onglets
  343. try:
  344. self.config = load_config()
  345. except Exception as err:
  346. print(err)
  347. set_default_config()
  348. self.config = load_config()
  349.  
  350. self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  351. self.window.connect("delete_event", lambda x,y: gtk.main_quit())
  352.  
  353. self.window.set_title(menuname)
  354. self.window.set_border_width(1) # pour avoir une bordure noire
  355. self.window.set_icon_from_file(handymenuicon)
  356.  
  357. self.window.set_position(gtk.WIN_POS_CENTER)
  358. self.window.set_resizable(False)
  359. self.window.set_decorated(False)
  360. self.window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("black"))
  361.  
  362. self.make_menu()
  363. self.onglets.grab_focus() # pour la gestion au clavier facilitée
  364.  
  365. def main():
  366. os.chdir(os.getenv('HOME'))
  367. menu = Handymenu()
  368. gtk.main()
  369. return 0
  370.  
  371. if __name__ == "__main__":
  372. main()
  373.  
  374.  
  375. # vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement