22
22
pygtk.require("2.0")
31
import olive.backend.fileops as fileops
32
import olive.backend.errors as errors
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 bzrlib.plugins.gtk.errors import show_bzr_error
33
from bzrlib.plugins.gtk.annotate.gannotate import GAnnotateWindow
34
from bzrlib.plugins.gtk.annotate.config import GAnnotateConfig
35
from bzrlib.plugins.gtk.diff import DiffWindow
36
from launch import launch
37
from olive import Preferences
35
40
""" This class is responsible for building the context menus. """
36
def __init__(self, gladefile, comm, dialog):
41
def __init__(self, path, selected, app=None):
38
if sys.platform == 'win32':
39
self.uifile = os.path.dirname(sys.executable) + "/share/olive/cmenu.ui"
41
self.uifile = "/usr/share/olive/cmenu.ui"
43
if not os.path.exists(self.uifile):
44
# Load from current directory if not installed
45
self.uifile = "cmenu.ui"
47
if not os.path.exists(self.uifile):
49
print _('UI description file cannot be found.')
52
self.gladefile = gladefile
43
from guifiles import UIFILENAME
45
self.uifile = UIFILENAME
48
self.pref = Preferences()
52
self.selected = selected
56
55
# Create the file list context menu
57
56
self.ui = gtk.UIManager()
97
132
self.cmenu_right = self.ui.get_widget('/context_right')
98
133
self.cmenu_left = self.ui.get_widget('/context_left')
99
134
self.toolbar_diff = self.ui.get_widget('/toolbar_diff')
135
self.cmenu_remote = self.ui.get_widget('/context_remote')
102
commit_menu = self.ui.get_widget('/context_right/commit')
103
commit_image = self.comm.menuitem_branch_commit.get_image()
104
commit_pixbuf = commit_image.get_pixbuf()
105
commit_icon = gtk.Image()
106
commit_icon.set_from_pixbuf(commit_pixbuf)
107
commit_menu.set_image(commit_icon)
108
diff_menu = self.ui.get_widget('/context_right/diff')
109
diff_image = self.comm.menuitem_stats_diff.get_image()
110
diff_pixbuf = diff_image.get_pixbuf()
111
diff_icon = gtk.Image()
112
diff_icon.set_from_pixbuf(diff_pixbuf)
113
diff_menu.set_image(diff_icon)
138
# TODO: do it without using deprecated comm
139
#commit_menu = self.ui.get_widget('/context_right/commit')
140
#commit_image = self.comm.menuitem_branch_commit.get_image()
141
#commit_pixbuf = commit_image.get_pixbuf()
142
#commit_icon = gtk.Image()
143
#commit_icon.set_from_pixbuf(commit_pixbuf)
144
#commit_menu.set_image(commit_icon)
145
#diff_menu = self.ui.get_widget('/context_right/diff')
146
#diff_image = self.comm.menuitem_stats_diff.get_image()
147
#diff_pixbuf = diff_image.get_pixbuf()
148
#diff_icon = gtk.Image()
149
#diff_icon.set_from_pixbuf(diff_pixbuf)
150
#diff_menu.set_image(diff_icon)
115
152
def right_context_menu(self):
116
153
return self.cmenu_right
118
155
def left_context_menu(self):
119
156
return self.cmenu_left
158
def remote_context_menu(self):
159
return self.cmenu_remote
121
162
def add_file(self, action):
122
163
""" Right context menu -> Add """
123
166
# Add only the selected file
124
directory = self.comm.get_path()
125
filename = self.comm.get_selected_right()
167
directory = self.path
168
filename = self.selected
127
170
if filename is None:
128
self.dialog.error_dialog(_('No file was selected'),
129
_('Please select a file from the list,\nor choose the other option.'))
171
error_dialog(_('No file was selected'),
172
_('Please select a file from the list,\nor choose the other option.'))
175
bzrlib.add.smart_add([os.path.join(directory, filename)])
178
def annotate(self, action):
179
""" Right context menu -> Annotate """
180
directory = self.path
181
filename = self.selected
184
error_dialog(_('No file was selected'),
185
_('Please select a file from the list.'))
188
wt, path = WorkingTree.open_containing(os.path.join(directory, filename))
191
file_id = wt.path2id(wt.relpath(os.path.join(directory, filename)))
193
window = GAnnotateWindow(all=False, plain=False)
194
window.set_title(os.path.join(directory, filename) + " - Annotate")
195
config = GAnnotateConfig(window)
133
fileops.add([directory + '/' + filename])
134
except errors.NotBranchError:
135
self.dialog.error_dialog(_('Directory is not a branch'),
136
_('You can perform this action only in a branch.'))
141
self.comm.refresh_right()
199
window.annotate(wt, branch, file_id)
143
204
def remove_file(self, action):
144
205
""" Right context menu -> Remove """
145
206
# Remove only the selected file
146
directory = self.comm.get_path()
147
filename = self.comm.get_selected_right()
150
self.dialog.error_dialog(_('No file was selected'),
151
_('Please select a file from the list,\nor choose the other option.'))
155
fileops.remove([directory + '/' + filename])
156
except errors.NotBranchError:
157
self.dialog.error_dialog(_('Directory is not a branch'),
158
_('You can perform this action only in a branch.'))
160
except errors.NotVersionedError:
161
self.dialog.error_dialog(_('File not versioned'),
162
_('The selected file is not versioned.'))
167
self.comm.refresh_right()
207
directory = self.path
208
filename = self.selected
211
error_dialog(_('No file was selected'),
212
_('Please select a file from the list,\nor choose the other option.'))
215
wt, path = WorkingTree.open_containing(os.path.join(directory, filename))
217
self.app.set_path(self.path)
218
self.app.refresh_right()
220
def rename_file(self, action):
221
""" Right context menu -> Rename """
222
from rename import OliveRename
223
wt = WorkingTree.open_containing(self.path + os.sep + self.selected)[0]
224
rename = OliveRename(wt, wt.relpath(self.path), self.selected)
227
def open_file(self, action):
228
""" Right context menu -> Open """
229
# Open only the selected file
230
filename = self.selected
233
error_dialog(_('No file was selected'),
234
_('Please select a file from the list,\nor choose the other option.'))
238
# TODO: how to enter a directory?
241
fullpath = self.path + os.sep + filename
242
if os.path.isdir(fullpath):
243
# selected item is an existant directory
244
# TODO: how to enter a directory?
249
def revert(self, action):
250
""" Right context menu -> Revert """
251
wt, path = WorkingTree.open_containing(self.path)
252
ret = wt.revert([os.path.join(path, self.selected)])
254
warning_dialog(_('Conflicts detected'),
255
_('Please have a look at the working tree before continuing.'))
257
info_dialog(_('Revert successful'),
258
_('All files reverted to last revision.'))
259
self.app.refresh_right()
169
261
def commit(self, action):
170
262
""" Right context menu -> Commit """
171
from commit import OliveCommit
172
commit = OliveCommit(self.gladefile, self.comm, self.dialog)
263
from commit import CommitDialog
266
wt, path = WorkingTree.open_containing(self.path)
268
except NotBranchError, e:
271
commit = CommitDialog(wt, path, not branch, self.selected)
272
response = commit.run()
273
if response != gtk.RESPONSE_NONE:
276
if response == gtk.RESPONSE_OK:
277
self.app.refresh_right()
175
282
def diff(self, action):
176
283
""" Right context menu -> Diff """
177
from diff import OliveDiff
178
diff = OliveDiff(self.gladefile, self.comm, self.dialog)
284
wt = WorkingTree.open_containing(self.path)[0]
285
window = DiffWindow()
286
parent_tree = wt.branch.repository.revision_tree(wt.branch.last_revision())
287
window.set_diff(wt.branch.nick, wt, parent_tree)
288
window.set_file(wt.relpath(self.path + os.sep + self.selected))
181
291
def bookmark(self, action):
182
292
""" Right context menu -> Bookmark """
183
if self.comm.pref.add_bookmark(self.comm.get_path()):
184
self.dialog.info_dialog(_('Bookmark successfully added'),
185
_('The current directory was bookmarked. You can reach\nit by selecting it from the left panel.'))
293
if self.pref.add_bookmark(self.path):
294
info_dialog(_('Bookmark successfully added'),
295
_('The current directory was bookmarked. You can reach\nit by selecting it from the left panel.'))
187
self.dialog.warning_dialog(_('Location already bookmarked'),
188
_('The current directory is already bookmarked.\nSee the left panel for reference.'))
190
self.comm.refresh_left()
298
warning_dialog(_('Location already bookmarked'),
299
_('The current directory is already bookmarked.\nSee the left panel for reference.'))
301
self.app.refresh_left()
303
def edit_bookmark(self, action):
304
""" Left context menu -> Edit """
305
from bookmark import BookmarkDialog
307
if self.selected != None:
308
bookmark = BookmarkDialog(self.selected, self.app.window)
309
response = bookmark.run()
311
if response != gtk.RESPONSE_NONE:
314
if response == gtk.RESPONSE_OK:
315
self.app.refresh_left()
192
319
def remove_bookmark(self, action):
193
320
""" Left context menu -> Remove """
194
self.comm.pref.remove_bookmark(self.comm.get_selected_left())
196
self.comm.refresh_left()
322
if self.selected != None:
323
self.pref.remove_bookmark(self.selected)
326
self.app.refresh_left()
328
def open_folder(self, action):
329
""" Left context menu -> Open Folder """
198
335
def diff_selected(self, action):
199
336
""" Diff toolbutton -> Selected... """