Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.83 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3. import os, stat, time
  4. import pygtk
  5. pygtk.require('2.0')
  6. import gtk
  7. import ConfigParser as configparser
  8.  
  9. ROOT_DIR = "/home/sts/files"
  10. TITLE = "ファイルマネージャ"
  11. COLUMN_TEXT=0
  12. COLUMN_NAMES = [ "ファイル名", "サイズ", "更新日" ]
  13. CONFIG_FILE = "config.txt"
  14.  
  15. MESSAGE_ENTER = 'パスワードを入力してください'
  16. MESSAGE_ENTER2 = 'パスワードを入力してください\n(確認)'
  17. #MESSAGE_ENTER2 = 'Please enter <b>password</b>:\n(confirm)'
  18. MESSAGE_OK1 = '<b>Successful</b>'
  19. MESSAGE_NG1 = '<b>無効なパスワードが入力されました</b>'
  20. MESSAGE_CONFIRM_DELETE = '削除してもよろしいですか'
  21. LABEL_ENTER = ''
  22.  
  23. def responseToDialog(entry, dialog, response):
  24. dialog.response(response)
  25.  
  26. def get_text(msg='',password=None):
  27. #base this on a message dialog
  28. dialog = gtk.MessageDialog(
  29. None,
  30. gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
  31. gtk.MESSAGE_QUESTION,
  32. gtk.BUTTONS_OK,
  33. None)
  34.  
  35. dialog.set_markup(msg)
  36.  
  37. #create the text input field
  38. if password != None:
  39. entry = gtk.Entry()
  40. entry.set_visibility(False)
  41. #allow the user to press enter to do ok
  42. entry.connect("activate", responseToDialog, dialog, gtk.RESPONSE_OK)
  43. #create a horizontal box to pack the entry and a label
  44. hbox = gtk.HBox()
  45. hbox.pack_start(gtk.Label(LABEL_ENTER), False, 5, 5)
  46. hbox.pack_end(entry)
  47. #some secondary text
  48. #dialog.format_secondary_markup("This will be used for <i>identification</i> purposes")
  49.  
  50. dialog.vbox.pack_end(hbox, True, True, 0)
  51.  
  52. dialog.show_all()
  53. dialog.run()
  54. text = ""
  55. if password != None:
  56. text = entry.get_text()
  57. dialog.destroy()
  58. return text
  59.  
  60. def confirm_proc(msg=''):
  61. #base this on a message dialog
  62. dialog = gtk.MessageDialog(
  63. None,
  64. gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
  65. gtk.MESSAGE_QUESTION,
  66. gtk.BUTTONS_OK_CANCEL,
  67. None)
  68. dialog.set_markup(msg)
  69. dialog.show_all()
  70. result = dialog.run()
  71. dialog.destroy()
  72. print result
  73. return result
  74.  
  75. def foreach(model, path, iter, selected):
  76. selected.append(model.get_value(iter, COLUMN_TEXT))
  77.  
  78. class PnsFilerApp:
  79.  
  80. def __init__(self, dname = ROOT_DIR):
  81.  
  82. cell_data_funcs = (
  83. None,
  84. self.file_size,
  85. #self.file_mode,
  86. self.file_last_changed)
  87.  
  88. # Create a new window
  89. self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  90. self.window.set_title( TITLE )
  91. self.window.set_size_request(640, 300)
  92. self.window.connect("delete_event", self.delete_event)
  93.  
  94.  
  95. # 設定ファイルを探す
  96. config = {}
  97. if os.path.exists(CONFIG_FILE):
  98. for line in open(CONFIG_FILE, 'r'):
  99. itemList = line[:-1].split('=')
  100. (key, value) = tuple( itemList )
  101. config[ key ] = value.replace("\r","")
  102. print config
  103. #conf = configparser.SafeConfigParser()
  104. #conf.read(CONFIG_FILE)
  105. #if conf.has_option("save_folder", ""):
  106. # x = conf.getint("save_folder", "")
  107. ROOT_DIR = config["save_folder"]
  108. else:
  109. return
  110.  
  111.  
  112. vbox = gtk.VBox(False, 0)
  113.  
  114. self.contextMenu = gtk.Menu()
  115.  
  116. buf = "圧縮"
  117. menu_items = gtk.MenuItem(buf)
  118. self.contextMenu.append(menu_items)
  119. menu_items.connect("activate", self.menuitem_response, buf)
  120. menu_items.show()
  121.  
  122. buf = "圧縮(パスワード付き)"
  123. menu_items = gtk.MenuItem(buf)
  124. self.contextMenu.append(menu_items)
  125. menu_items.connect("activate", self.menuitem_response, buf)
  126. menu_items.show()
  127.  
  128. buf = "解凍"
  129. menu_items = gtk.MenuItem(buf)
  130. self.contextMenu.append(menu_items)
  131. menu_items.connect("activate", self.menuitem_response, buf)
  132. menu_items.show()
  133.  
  134. buf = "削除"
  135. menu_items = gtk.MenuItem(buf)
  136. self.contextMenu.append(menu_items)
  137. menu_items.connect("activate", self.menuitem_response, buf)
  138. menu_items.show()
  139.  
  140. toolbar = gtk.Toolbar()
  141. vbox.pack_start(toolbar, False, False, 0)
  142.  
  143. self.upButton = gtk.ToolButton(gtk.STOCK_REFRESH);
  144. self.upButton.set_is_important(True)
  145. self.upButton.set_sensitive(True)
  146. toolbar.insert(self.upButton, -1)
  147. self.upButton.connect("clicked", self.on_refresh_clicked)
  148.  
  149. listmodel = self.make_list(dname)
  150. self.treeview = gtk.TreeView()
  151.  
  152. self.tvcolumn = [None] * len(COLUMN_NAMES)
  153. cellpb = gtk.CellRendererPixbuf()
  154. self.tvcolumn[0] = gtk.TreeViewColumn(COLUMN_NAMES[0], cellpb)
  155. self.tvcolumn[0].set_cell_data_func(cellpb, self.file_pixbuf)
  156. cell = gtk.CellRendererText()
  157. self.tvcolumn[0].pack_start(cell, False)
  158. self.tvcolumn[0].set_cell_data_func(cell, self.file_name)
  159. self.treeview.append_column(self.tvcolumn[0])
  160.  
  161. for n in range(1, len(COLUMN_NAMES)):
  162. cell = gtk.CellRendererText()
  163. self.tvcolumn[n] = gtk.TreeViewColumn(COLUMN_NAMES[n], cell)
  164. if n == 1:
  165. cell.set_property('xalign', 1.0)
  166. self.tvcolumn[n].set_cell_data_func(cell, cell_data_funcs[n])
  167. self.treeview.append_column(self.tvcolumn[n])
  168.  
  169. selection = self.treeview.get_selection()
  170. selection.set_mode(gtk.SELECTION_MULTIPLE)
  171. selection.connect('changed', self.on_tree_selection_changed2)
  172.  
  173. self.treeview.connect('row-activated', self.open_file)
  174. self.treeview.connect('button-press-event' , self.on_treeview_button_press_event)
  175. self.scrolledwindow = gtk.ScrolledWindow()
  176. self.scrolledwindow.add(self.treeview)
  177.  
  178. vbox.pack_start(self.scrolledwindow, True, True, 2)
  179.  
  180. self.treeview.set_model(listmodel)
  181.  
  182. vbox.show()
  183. self.window.add(vbox)
  184.  
  185. self.window.show_all()
  186.  
  187. return
  188.  
  189. def delete_event(self, widget, event, data=None):
  190. gtk.main_quit()
  191. return False
  192.  
  193. def button_press(self, widget, event):
  194. if event.type == gtk.gdk.BUTTON_PRESS:
  195. print "PRESS"
  196. widget.popup(None, None, None, event.button, event.time)
  197. return True
  198. return False
  199.  
  200. # Print a string when a menu item is selected
  201. def menuitem_response(self, widget, string):
  202. print "%s" % string
  203. selected = []
  204. selection = self.treeview.get_selection()
  205. selection.selected_foreach(foreach, selected)
  206. print selected
  207. password = ""
  208.  
  209. if string == "圧縮":
  210. base = self.dirname + "/"
  211. import commands
  212. cmd = '{0} {1} {2} {3}'.format("/usr/bin/zip", "-j", base + selected[0]+".zip", base + selected[0])
  213. print cmd
  214. check = commands.getoutput(cmd)
  215. print check
  216. get_text(MESSAGE_OK1)
  217.  
  218. if string == "圧縮(パスワード付き)":
  219. pass1 = get_text(MESSAGE_ENTER,password)
  220. pass2 = None
  221. if pass1 != "":
  222. pass2 = get_text(MESSAGE_ENTER2,password)
  223. if pass1 == pass2:
  224. password = pass1
  225. get_text(MESSAGE_OK1)
  226. else:
  227. get_text(MESSAGE_NG1)
  228.  
  229. if string == "解凍":
  230. base = self.dirname + "/"
  231. import commands
  232. cmd = '{0} {1} {2} {3} {4}'.format("/usr/bin/unzip", "-o", base + selected[0], "-d", base)
  233. print cmd
  234. check = commands.getoutput(cmd)
  235. print check
  236. get_text(MESSAGE_OK1)
  237.  
  238. if string == "解凍(パスワード付き)":
  239. base = self.dirname + "/"
  240. import commands
  241. cmd = '{0} {1} {2} {3} {4}'.format("/usr/bin/unzip", "-o", base + selected[0]+".zip", "-d", base)
  242. print cmd
  243. check = commands.getoutput(cmd)
  244. print check
  245. get_text(MESSAGE_OK1)
  246.  
  247. if string == "削除":
  248. if confirm_proc(MESSAGE_CONFIRM_DELETE) == gtk.RESPONSE_OK:
  249. base = self.dirname + "/"
  250. import commands
  251. cmd = '{0} {1} {2}'.format("rm", "-Rf", base + selected[0])
  252. print cmd
  253. check = commands.getoutput(cmd)
  254. print check
  255. #get_text(MESSAGE_OK1)
  256.  
  257. new_model = self.make_list(self.dirname)
  258. self.treeview.set_model(new_model)
  259.  
  260. def on_treeview_button_press_event(self, treeview, event):
  261. print "treeview event"
  262. if event.button == 1:
  263. print event.button
  264. print self.treeview.get_selection()
  265. pass
  266.  
  267. if event.button == 3:
  268. print event.button
  269. x = int(event.x)
  270. y = int(event.y)
  271. time = event.time
  272. pthinfo = self.treeview.get_path_at_pos(x, y)
  273. print pthinfo
  274. if pthinfo is not None:
  275. path, col, cellx, celly = pthinfo
  276. self.treeview.grab_focus()
  277. self.treeview.set_cursor( path, col, 0)
  278.  
  279. self.contextMenu.popup(None,
  280. None,
  281. None,
  282. event.button,
  283. event.time)
  284.  
  285. return True
  286.  
  287. def on_refresh_clicked(self, widget):
  288. new_model = self.make_list(self.dirname)
  289. self.treeview.set_model(new_model)
  290.  
  291. def on_tree_selection_changed2(self, selection):
  292. selected = []
  293. selection.selected_foreach(foreach, selected)
  294. print selected
  295.  
  296. def make_list(self, dname=None):
  297. if not dname:
  298. self.dirname = os.path.expanduser('~')
  299. else:
  300. self.dirname = os.path.abspath(dname)
  301. #self.window.set_title(self.dirname)
  302. files = [f for f in os.listdir(self.dirname) if f[0] <> '.']
  303. files.sort()
  304. files = ['..'] + files
  305. listmodel = gtk.ListStore(object)
  306. for f in files:
  307. listmodel.append([f])
  308. return listmodel
  309.  
  310. def open_file(self, treeview, path, column):
  311. model = treeview.get_model()
  312. iter = model.get_iter(path)
  313. filename = os.path.join(self.dirname, model.get_value(iter, 0))
  314. filestat = os.stat(filename)
  315. if stat.S_ISDIR(filestat.st_mode):
  316. if filename.startswith(ROOT_DIR) == True and filename.startswith(ROOT_DIR+"/..") == False:
  317. print filename
  318. print filestat.st_mode
  319. new_model = self.make_list(filename)
  320. treeview.set_model(new_model)
  321. return
  322.  
  323. def file_pixbuf(self, column, cell, model, iter):
  324. filename = os.path.join(self.dirname, model.get_value(iter, 0))
  325. filestat = os.stat(filename)
  326. if stat.S_ISDIR(filestat.st_mode):
  327. cell.set_property("stock-id", gtk.STOCK_DIRECTORY)
  328. else:
  329. cell.set_property("stock-id", gtk.STOCK_FILE)
  330. return
  331.  
  332. def file_name(self, column, cell, model, iter):
  333. cell.set_property('text', model.get_value(iter, 0))
  334. return
  335.  
  336. def file_size(self, column, cell, model, iter):
  337. filename = os.path.join(self.dirname, model.get_value(iter, 0))
  338. filestat = os.stat(filename)
  339. cell.set_property('text', filestat.st_size)
  340. return
  341.  
  342. def file_mode(self, column, cell, model, iter):
  343. filename = os.path.join(self.dirname, model.get_value(iter, 0))
  344. filestat = os.stat(filename)
  345. cell.set_property('text', oct(stat.S_IMODE(filestat.st_mode)))
  346. return
  347.  
  348. def file_last_changed(self, column, cell, model, iter):
  349. filename = os.path.join(self.dirname, model.get_value(iter, 0))
  350. filestat = os.stat(filename)
  351. cell.set_property('text', time.ctime(filestat.st_mtime))
  352. return
  353.  
  354. def main():
  355. gtk.main()
  356.  
  357. if __name__ == "__main__":
  358. app = PnsFilerApp()
  359. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement