22
22
pygtk.require("2.0")
31
import olive.backend.fileops as fileops
32
import olive.backend.errors as errors
34
from commit import OliveCommit
35
from diff import OliveDiff
28
import bzrlib.errors as errors
29
from bzrlib.workingtree import WorkingTree
31
from bzrlib.plugins.gtk.dialog import error_dialog, info_dialog, warning_dialog
32
from errors import show_bzr_error
33
from launch import launch
34
from olive import Preferences, DiffWindow
38
37
""" This class is responsible for building the context menus. """
39
def __init__(self, gladefile, comm, dialog):
38
def __init__(self, path, selected, app=None):
41
self.uifile = "/usr/share/olive/cmenu.ui"
42
if not os.path.exists(self.uifile):
43
# Load from current directory if not installed
44
self.uifile = "cmenu.ui"
40
from guifiles import UIFILENAME
42
self.uifile = UIFILENAME
45
self.pref = Preferences()
46
self.gladefile = gladefile
49
self.selected = selected
50
52
# Create the file list context menu
51
53
self.ui = gtk.UIManager()
53
55
self.actiongroup = gtk.ActionGroup('context')
54
56
self.actiongroup.add_actions([('add', gtk.STOCK_ADD,
56
'Add the selected file',
58
_('Add the selected file'),
58
60
('remove', gtk.STOCK_REMOVE,
60
'Remove the selected file',
62
_('Remove the selected file'),
62
('commit', gtk.STOCK_REDO,
66
_('Rename the selected file'),
68
('open', gtk.STOCK_OPEN,
70
_('Open the selected file'),
74
_('Revert the changes'),
78
_('Commit the changes'),
68
'Show the diff of the file',
82
_('Show the diff of the file'),
72
'Show the log of the file',
76
'Bookmark current location',
86
_('Bookmark current location'),
88
('edit_bookmark', gtk.STOCK_EDIT,
90
_('Edit the selected bookmark'),
78
92
('remove_bookmark', gtk.STOCK_REMOVE,
80
'Remove the selected bookmark',
94
_('Remove the selected bookmark'),
95
self.remove_bookmark),
96
('open_folder', gtk.STOCK_OPEN,
97
_('Open Folder'), None,
98
_('Open bookmark folder in Nautilus'),
100
('diff_selected', None,
101
_('Selected...'), None,
102
_('Show the differences of the selected file'),
106
_('Show the differences of all files'),
84
110
self.ui.insert_action_group(self.actiongroup, 0)
85
111
self.ui.add_ui_from_file(self.uifile)
87
113
self.cmenu_right = self.ui.get_widget('/context_right')
89
114
self.cmenu_left = self.ui.get_widget('/context_left')
115
self.toolbar_diff = self.ui.get_widget('/toolbar_diff')
118
# TODO: do it without using deprecated comm
119
#commit_menu = self.ui.get_widget('/context_right/commit')
120
#commit_image = self.comm.menuitem_branch_commit.get_image()
121
#commit_pixbuf = commit_image.get_pixbuf()
122
#commit_icon = gtk.Image()
123
#commit_icon.set_from_pixbuf(commit_pixbuf)
124
#commit_menu.set_image(commit_icon)
125
#diff_menu = self.ui.get_widget('/context_right/diff')
126
#diff_image = self.comm.menuitem_stats_diff.get_image()
127
#diff_pixbuf = diff_image.get_pixbuf()
128
#diff_icon = gtk.Image()
129
#diff_icon.set_from_pixbuf(diff_pixbuf)
130
#diff_menu.set_image(diff_icon)
91
132
def right_context_menu(self):
92
133
return self.cmenu_right
94
135
def left_context_menu(self):
95
136
return self.cmenu_left
97
139
def add_file(self, action):
98
140
""" Right context menu -> Add """
99
143
# Add only the selected file
100
directory = self.comm.get_path()
101
filename = self.comm.get_selected_right()
144
directory = self.path
145
filename = self.selected
103
147
if filename is None:
104
self.dialog.error_dialog('No file was selected.')
108
fileops.add([directory + '/' + filename])
109
except errors.NotBranchError:
110
self.dialog.error_dialog('The directory is not a branch.')
115
self.comm.refresh_right()
148
error_dialog(_('No file was selected'),
149
_('Please select a file from the list,\nor choose the other option.'))
152
bzrlib.add.smart_add([os.path.join(directory, filename)])
117
155
def remove_file(self, action):
118
156
""" Right context menu -> Remove """
119
157
# Remove only the selected file
120
directory = self.comm.get_path()
121
filename = self.comm.get_selected_right()
124
self.dialog.error_dialog('No file was selected.')
128
fileops.remove([directory + '/' + filename])
129
except errors.NotBranchError:
130
self.dialog.error_dialog('The directory is not a branch.')
132
except errors.NotVersionedError:
133
self.dialog.error_dialog('Selected file is not versioned.')
138
self.comm.refresh_right()
158
directory = self.path
159
filename = self.selected
162
error_dialog(_('No file was selected'),
163
_('Please select a file from the list,\nor choose the other option.'))
166
wt, path = WorkingTree.open_containing(os.path.join(directory, filename))
168
self.app.set_path(self.path)
169
self.app.refresh_right()
171
def rename_file(self, action):
172
""" Right context menu -> Rename """
173
from rename import OliveRename
174
wt = WorkingTree.open_containing(self.path + os.sep + self.selected)[0]
175
rename = OliveRename(wt, wt.relpath(self.path), self.selected)
178
def open_file(self, action):
179
""" Right context menu -> Open """
180
# Open only the selected file
181
filename = self.selected
184
error_dialog(_('No file was selected'),
185
_('Please select a file from the list,\nor choose the other option.'))
189
# TODO: how to enter a directory?
192
fullpath = self.path + os.sep + filename
193
if os.path.isdir(fullpath):
194
# selected item is an existant directory
195
# TODO: how to enter a directory?
200
def revert(self, action):
201
""" Right context menu -> Revert """
202
wt, path = WorkingTree.open_containing(self.path)
203
ret = wt.revert([os.path.join(path, self.selected)])
205
warning_dialog(_('Conflicts detected'),
206
_('Please have a look at the working tree before continuing.'))
208
info_dialog(_('Revert successful'),
209
_('All files reverted to last revision.'))
210
self.app.refresh_right()
140
212
def commit(self, action):
141
213
""" Right context menu -> Commit """
142
commit = OliveCommit(self.gladefile, self.comm)
214
from commit import CommitDialog
217
wt, path = WorkingTree.open_containing(self.path)
219
except NotBranchError, e:
222
commit = CommitDialog(wt, path, not branch, self.selected)
223
response = commit.run()
224
if response != gtk.RESPONSE_NONE:
227
if response == gtk.RESPONSE_OK:
228
self.app.refresh_right()
145
233
def diff(self, action):
146
234
""" Right context menu -> Diff """
147
diff = OliveDiff(self.gladefile, self.comm)
150
def log(self, action):
151
""" Right context menu -> Log """
152
self.dialog.error_dialog('This feature is not yet implemented.')
235
wt = WorkingTree.open_containing(self.path)[0]
236
window = DiffWindow()
237
parent_tree = wt.branch.repository.revision_tree(wt.branch.last_revision())
238
window.set_diff(wt.branch.nick, wt, parent_tree)
239
window.set_file(wt.relpath(self.path + os.sep + self.selected))
154
242
def bookmark(self, action):
155
243
""" Right context menu -> Bookmark """
156
if self.comm.pref.add_bookmark(self.comm.get_path()):
157
self.dialog.info_dialog('Bookmark successfully added.')
244
if self.pref.add_bookmark(self.path):
245
info_dialog(_('Bookmark successfully added'),
246
_('The current directory was bookmarked. You can reach\nit by selecting it from the left panel.'))
159
self.dialog.warning_dialog('Location already bookmarked.')
161
self.comm.refresh_left()
249
warning_dialog(_('Location already bookmarked'),
250
_('The current directory is already bookmarked.\nSee the left panel for reference.'))
252
self.app.refresh_left()
254
def edit_bookmark(self, action):
255
""" Left context menu -> Edit """
256
from bookmark import BookmarkDialog
258
if self.selected != None:
259
bookmark = BookmarkDialog(self.selected, self.app.window)
260
response = bookmark.run()
262
if response != gtk.RESPONSE_NONE:
265
if response == gtk.RESPONSE_OK:
266
self.app.refresh_left()
163
270
def remove_bookmark(self, action):
164
271
""" Left context menu -> Remove """
165
self.comm.pref.remove_bookmark(self.comm.get_selected_left())
167
self.comm.refresh_left()
273
if self.selected != None:
274
self.pref.remove_bookmark(self.selected)
277
self.app.refresh_left()
279
def open_folder(self, action):
280
""" Left context menu -> Open Folder """
286
def diff_selected(self, action):
287
""" Diff toolbutton -> Selected... """
288
print "DEBUG: not implemented."
290
def diff_all(self, action):
291
""" Diff toolbutton -> All... """
292
from diff import OliveDiff
293
diff = OliveDiff(self.comm)