3
# Copyright (C) 2011 Tim Marston <edam@waxworlds.org>
5
# This file is part of Manage Raws (hereafter referred to as "this
6
# program"). See http://ed.am/dev/gtk/eog-manage-raws for more
9
# This program is free software: you can redistribute it and/or modify
10
# it under the terms of the GNU General Public License as published by
11
# the Free Software Foundation, either version 3 of the License, or
12
# (at your option) any later version.
14
# This program is distributed in the hope that it will be useful,
15
# but WITHOUT ANY WARRANTY; without even the implied warranty of
16
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
# GNU General Public License for more details.
19
# You should have received a copy of the GNU General Public License
20
# along with this program. If not, see <http://www.gnu.org/licenses/>.
25
from gi.repository import GObject, Gtk, Eog, Gio
28
class ManageRawsPlugin( GObject.Object, Eog.WindowActivatable ):
30
# Override EogWindowActivatable's window property
31
window = GObject.property( type = Eog.Window )
33
# list of file extension to recognise as RAW files
1
import eog, gtk, os, re
3
class HelloWorldPlugin(eog.Plugin):
34
5
raw_file_extensions = [ 'cr2', '3fr', 'ari', 'arw', 'srf', 'sr2', 'bay',
35
6
'crw', 'cr2', 'cap', 'iiq', 'eip', 'dcs', 'dcr', 'drf', 'k25', 'kdc',
36
7
'dng', 'erf', 'fff', 'mef', 'mos', 'mrw', 'nef', 'nrw', 'orf', 'ptx',
37
8
'pef', 'pxn', 'r3d', 'raf', 'raw', 'rw2', 'rwl', 'rwz', 'x3f' ]
39
10
def __init__( self ):
40
GObject.Object.__init__( self )
11
eog.Plugin.__init__( self )
42
def do_activate( self ):
13
def activate( self, window ):
45
ui_manager = self.window.get_ui_manager()
46
self.action_group = Gtk.ActionGroup( 'EogManageRawsPluginActions' )
47
self.action_group.add_actions( [ ( 'EogPluginRunKeepRaw', None,
17
manager = window.get_ui_manager()
18
self._action_group = gtk.ActionGroup( 'EogRawToolsPluginActions' )
19
self._action_group.add_actions( [ ( 'EogPluginRunKeepRaw', None,
48
20
_( 'Keep Raw Image' ), 'K',
49
21
_( "Move the accompanying raw file to a 'raw' subdirectory" ),
50
self.do_keep_raw_image ) ], self.window )
51
self.action_group.add_actions( [ ( 'EogPluginRunUnkeepRaw', None,
52
_( 'Unkeep Raw Image' ), 'U',
53
_( "Move the accompanying raw file back to the image's directory" ),
54
self.do_unkeep_raw_image ) ], self.window )
55
self.action_group.add_actions( [ ( 'EogPluginRunDeleteRaw', None,
22
self.on_keep_raw_image ) ] )
23
self._action_group.add_actions( [ ( 'EogPluginRunDeleteRaw', None,
56
24
_( 'Delete Unkept Raw Images' ), None,
57
25
_( "Delete all raw files in the current image's directory (the unkept ones)" ),
58
self.do_delete_raw_images ) ], self.window )
59
ui_manager.insert_action_group( self.action_group, -1 )
60
self.ui_id = ui_manager.add_ui_from_string( """
26
self.on_delete_raw_images ) ] )
27
manager.insert_action_group( self._action_group, -1 )
28
self._ui_id = manager.add_ui_from_string( """
62
30
<menubar name="MainMenu">
63
31
<menu name="ToolsMenu" action="Tools">
65
33
<menuitem name="EogPluginRunKeepRaw"
66
34
action="EogPluginRunKeepRaw" />
67
<menuitem name="EogPluginRunUnkeepRaw"
68
action="EogPluginRunUnkeepRaw" />
69
35
<menuitem name="EogPluginRunDeleteRaw"
70
36
action="EogPluginRunDeleteRaw" />
82
48
# insert status bar
83
self.statusbar = Gtk.Statusbar()
84
#self.statusbar.set_size_request( 100, 10 )
85
statusbar = self.window.get_statusbar()
86
statusbar.pack_end( self.statusbar, False, False, 0 );
49
self._statusbar = gtk.Statusbar()
50
self._statusbar.set_has_resize_grip( False )
51
self._statusbar.set_size_request( 85, 10 )
52
statusbar = window.get_statusbar()
53
statusbar.pack_end( self._statusbar, False, False, 0 );
54
self._statusbar.show()
89
56
# connect to selection change
90
thumb_view = self.window.get_thumb_view()
91
self.on_selection_change_id = thumb_view.connect_after( \
92
'selection_changed', self.on_selection_change, self.window )
57
thumb_view = window.get_thumb_view()
58
self._on_selection_change_id = thumb_view.connect_after( \
59
'selection_changed', self.on_selection_change, window )
95
self.update_status( self.window )
97
def do_deactivate( self ):
62
self.update_status( window )
64
def deactivate( self, window ):
67
thumb_view = window.get_thumb_view()
68
thumb_view.disconnect( self._on_selection_change_id )
99
70
# remove menu items
100
ui_manager = self.window.get_ui_manager()
101
ui_manager.remove_ui( self.ui_id )
103
ui_manager.remove_action_group( self.action_group )
104
self.action_group = None
105
ui_manager.ensure_update()
107
# disconnect handlers
108
thumb_view = self.window.get_thumb_view()
109
thumb_view.disconnect( self.on_selection_change_id )
71
manager = window.get_ui_manager()
72
manager.remove_ui( self._ui_id )
73
manager.remove_action_group( self._action_group )
74
manager.ensure_update()
111
76
# remove status bar entry
112
statusbar = self.window.get_statusbar()
113
Gtk.Container.remove( statusbar, self.statusbar )
77
statusbar = window.get_statusbar()
78
statusbar.remove( self._statusbar )
115
80
def on_selection_change( self, view, data ):
116
81
self.update_status( data )
172
137
image = thumb_view.get_first_selected_image()
173
138
raw_fname = self.get_raw_filename_from_image( image )
174
139
path = os.path.dirname( image.get_file().get_path() )
175
self.statusbar.pop( 0 )
140
self._statusbar.pop( 0 )
176
141
if( raw_fname is False ):
177
self.statusbar.push( 0, " " + _( 'raw: -' ) )
142
self._statusbar.push( 0, _( 'raw: -' ) )
178
143
elif( os.path.isfile( path + '/' + raw_fname ) ):
179
self.statusbar.push( 0, " " + _( 'raw: unkept' ) )
144
self._statusbar.push( 0, _( 'raw: delete' ) )
181
self.statusbar.push( 0, " " + _( 'raw: keep' ) )
146
self._statusbar.push( 0, _( 'raw: keep' ) )
183
def do_keep_raw_image( self, action, window ):
148
def on_keep_raw_image( self, action ):
185
150
# do we have just the one selected image? we can't handle multiple
186
151
# images because EogThumbView.get_selected_images() doesn't work.
187
thumb_view = window.get_thumb_view()
152
thumb_view = self._window.get_thumb_view()
188
153
if( thumb_view.get_n_selected() == 1 ):
193
158
self.keep_raw_image( image )
196
self.update_status( window )
198
def do_unkeep_raw_image( self, action, window ):
200
# do we have just the one selected image? we can't handle multiple
201
# images because EogThumbView.get_selected_images() doesn't work.
202
thumb_view = window.get_thumb_view()
203
if( thumb_view.get_n_selected() == 1 ):
206
image = thumb_view.get_first_selected_image()
208
self.unkeep_raw_image( image )
211
self.update_status( window )
161
self.update_status( self._window )
213
163
def keep_raw_image( self, image ):
215
165
raw_fname = self.get_raw_filename_from_image( image )
216
166
if( raw_fname is False ):
217
dialog = Gtk.MessageDialog( None, Gtk.DialogFlags.MODAL,
218
Gtk.MessageType.INFO, Gtk.ButtonsType.CLOSE,
167
dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL,
168
gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE,
219
169
_( 'Raw file not found!' ) )
220
170
dialog.format_secondary_text( _( "This image doesn't appear to " +
221
171
"have an accompanying raw file." ) )
234
184
# move the raw file in to the raw directory
235
185
os.rename( path + '/' + raw_fname, path + '/raw/' + raw_fname )
237
def unkeep_raw_image( self, image ):
239
raw_fname = self.get_raw_filename_from_image( image )
240
if( raw_fname is False ):
241
dialog = Gtk.MessageDialog( None, Gtk.DialogFlags.MODAL,
242
Gtk.MessageType.INFO, Gtk.ButtonsType.CLOSE,
243
_( 'Raw file not found!' ) )
244
dialog.format_secondary_text( _( "This image doesn't appear to " +
245
"have an accompanying raw file." ) )
250
# does raw file exist?
251
path = os.path.dirname( image.get_file().get_path() )
252
if( os.path.isfile( path + '/raw/' + raw_fname ) ):
254
# move the raw file back to the parent directory
255
os.rename( path + '/raw/' + raw_fname, path + '/' + raw_fname )
257
# if the raw directory is empty, remove it
258
if( len( os.listdir( path + '/raw' ) ) == 0 ):
259
os.rmdir( path + '/raw' )
261
def do_delete_raw_images( self, action, window ):
187
def on_delete_raw_images( self, action ):
263
189
# get path to first selected image, if there is one
264
thumb_view = window.get_thumb_view()
190
thumb_view = self._window.get_thumb_view()
265
191
if( thumb_view.get_n_selected() == 1 ):
266
192
image = thumb_view.get_first_selected_image()
267
193
path = os.path.dirname( image.get_file().get_path() )
295
221
"Do you want to continue?" ) )
296
222
result = dialog.run()
298
if( result != Gtk.ResponseType.YES ):
224
if( result != gtk.RESPONSE_YES ):
301
227
# delete the files
302
228
for file in files:
303
Gio.file_parse_name( path + '/' + file ).trash( None )
304
#os.unlink( path + '/' + file )
229
os.unlink( path + '/' + file )
306
self.update_status( window )
231
self.update_status( self._window )
308
233
# else, tell the user there aren't any raw files!
310
dialog = Gtk.MessageDialog( None, Gtk.DialogFlags.MODAL,
311
Gtk.MessageType.INFO, Gtk.ButtonsType.CLOSE,
235
dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL,
236
gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE,
312
237
_( 'No raw files to delete!' ) )
313
238
dialog.format_secondary_text(
314
239
_( 'There are no raw files to delete!' ) )