随分前に Fedora を 22 にアップデートしたような。
そうだ、自作 eog プラグインの更新を忘れていた!
私的に傑作プラグインだけど、そんなにリネームなんてしないジャン。
ということでとっとと更新しなければ。
Apps/EyeOfGnome/Plugins – GNOME Wiki!
公式は相変わらずヤル気ネェ…
とにかく Gedit 同様に GtkUIManager を排除する必要があるだろう。
GEdit 用に作った奴をコピペして Eog に書き換えてみた。
Eog.App なんて無いよと Python に怒られる、なんでじゃ!
dir(Eog) で調べると Eog.Application らしい、まぎらわしいわ!
AppActivatable も ApplicationActivatable だ、統一してよ。
同じ GNOME 標準アプリといっても企業ではなく GPL だからしかたがないが。
メニューを作ろうとしたけど extend_menu メソッドが使えない。
よく解らないのでソースを落とし reload プラグインを見てみる。
GtkApplicationWindow の activate で突っ込んでいた。
だから統一、、、まあいいか。
この方法だとメニュー排除が凄く面倒臭いようだ。
というか g_menu_item_set_attribute が何故か上手くいかない。
ええい面倒だ、メニューは廃止にしてしまえwww
昨今の GNOME に合わせシンプルにしたといえば皆納得するだろう。
実際筆者はメニューからリネームなんてしたことないもん。
Mac でも F2 をつい何度と押したことか、Mac は Enter なんだよね。
はどうでもよくて。
ということでこんなソースになりました。
renamedlg.py
#-*- coding:utf-8 -*- # Eye of GNOME renamedlg plugin version 3.16.0 # Copyright © 2012 sasakima-nao <sasakimanao@gmail.com> # # This program 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 2 of the License, or # (at your option) any later version. # # Eye of GNOME Plugins # https://wiki.gnome.org/Apps/EyeOfGnome/Plugins # Eye of GNOME Reference Manual # http://developer.gnome.org/eog/stable/index.html # # 2015.06.16 3.16.0 # Support eog 3.16 (Remove GtkUIManager) # # 2012.08.28 3.12.0 # Support eog 3.12 (Python3) # # 2012.08.28 3.0.0 from gi.repository import GObject, Gtk, Eog, Gio, GLib import os class RenameDlgAppActivatable(GObject.Object, Eog.ApplicationActivatable): """ Set GMenu and Accelerator """ app = GObject.property(type=Eog.Application) def __init__(self): GObject.Object.__init__(self) def do_activate(self): self.app.add_accelerator("F2", "win.rename", None) def do_deactivate(self): self.app.remove_accelerator("win.rename", None) class RenameDlgPlugin(GObject.Object, Eog.WindowActivatable): """ Rename Dialog Plugin for eog 3.6 Actibate from F2 key """ __gtype_name__ = "Rename" window = GObject.property(type=Eog.Window) def __init__(self): GObject.Object.__init__(self) def do_activate(self): # Add Action self.action = Gio.SimpleAction.new("rename", None) self.action.connect('activate', self.on_rename) self.window.add_action(self.action) def do_deactivate(self): # Remove Action self.window.remove_action("rename") def do_update_state(self): #self.action.set_enabled(not self.window.is_empty()) self.action.set_enabled(True) pass def on_rename(self, action, data=None): img = self.window.get_image() if img == None: return fullname = img.get_uri_for_display()[7:] path, name = os.path.split(fullname) label = Gtk.Label(name) entry = Gtk.Entry() entry.set_text(name) d = Gtk.Dialog( "Rename", self.window, Gtk.DialogFlags.MODAL, (Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT, Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT) ) vbox = d.get_content_area() try: vbox.pack_start(label, False, False, 0) vbox.pack_start(entry, False, False, 0) d.show_all() def dlg_ok(self): d.response(Gtk.ResponseType.ACCEPT) def on_focus_in(self, widget): try: # Calculate the number of characters # Converted to a Display Name s = entry.get_text() displayname = GLib.filename_display_name(s) i = displayname.rindex(".") entry.select_region(0, i) except ValueError: # Full select pass def on_focus_out(self, widget): entry.select_region(0, 0) entry.connect("activate", dlg_ok) entry.connect("focus-in-event", on_focus_in) entry.connect("focus-out-event", on_focus_out) # Loop until success or Cancel while 1: if d.run() == Gtk.ResponseType.ACCEPT: text = entry.get_text() if text == "": self.messagebox("File name is empty") entry.set_text(name) elif text == name: self.messagebox("Have not changed") elif text in os.listdir(path): self.messagebox("Found the same file name") else: # Get the EogListStore store = self.window.get_store() # Rename newname = os.path.join(path, text) os.rename(fullname, newname) # Turn the queue while Gtk.events_pending(): Gtk.main_iteration() # Create EogImage f = Gio.file_new_for_path(newname) newimg = Eog.Image.new_file(f) # Insert EogListStore store.append_image(newimg) # EogThumbView tv = self.window.get_thumb_view() tv.set_current_image(newimg, True) # Turn the queue while Gtk.events_pending(): Gtk.main_iteration() # Remove Image from EogListStore store.remove_image(img) break else: # Cancel Button break finally: d.destroy() def messagebox(self, text): dlg = Gtk.MessageDialog( self.window, Gtk.DialogFlags.MODAL, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, text) dlg.set_title("Eye of GNOME") r = dlg.run() dlg.destroy() return r
Gedit 及び Eye of Gnome プラグイン – L’Isola di Niente
よしよし、キチンとリネーム可能だぞと。
よく見ると update_state ハンドラが実験用のままじゃないか。
特に問題は無いから次の更新で修正しよう、オープンソースはそれでイイ。
*.plugin ファイルの仕様は 3.14 までと変わっていない。
IAge が今でも 2 のまま動く、多分ガン無視しているだけだろうけど。
ところで。
Gedit で今頃気が付いたが 3.16 は単語 W クリックの仕様が変わっていた。
do_update_state 等の W クリック単語選択はアンダーバーを含めるようになた。
以前は区切りになっていたはずなんだが、あの動作に慣れているのでとまどうYO!