随分前に 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!