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()
101
132
self.cmenu_right = self.ui.get_widget('/context_right')
102
133
self.cmenu_left = self.ui.get_widget('/context_left')
103
134
self.toolbar_diff = self.ui.get_widget('/toolbar_diff')
135
self.cmenu_remote = self.ui.get_widget('/context_remote')
106
commit_menu = self.ui.get_widget('/context_right/commit')
107
commit_image = self.comm.menuitem_branch_commit.get_image()
108
commit_pixbuf = commit_image.get_pixbuf()
109
commit_icon = gtk.Image()
110
commit_icon.set_from_pixbuf(commit_pixbuf)
111
commit_menu.set_image(commit_icon)
112
diff_menu = self.ui.get_widget('/context_right/diff')
113
diff_image = self.comm.menuitem_stats_diff.get_image()
114
diff_pixbuf = diff_image.get_pixbuf()
115
diff_icon = gtk.Image()
116
diff_icon.set_from_pixbuf(diff_pixbuf)
117
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)
119
152
def right_context_menu(self):
120
153
return self.cmenu_right
122
155
def left_context_menu(self):
123
156
return self.cmenu_left
158
def remote_context_menu(self):
159
return self.cmenu_remote
125
162
def add_file(self, action):
126
163
""" Right context menu -> Add """
127
166
# Add only the selected file
128
directory = self.comm.get_path()
129
filename = self.comm.get_selected_right()
167
directory = self.path
168
filename = self.selected
131
170
if filename is None:
132
self.dialog.error_dialog(_('No file was selected'),
133
_('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)
137
fileops.add([directory + '/' + filename])
138
except errors.NotBranchError:
139
self.dialog.error_dialog(_('Directory is not a branch'),
140
_('You can perform this action only in a branch.'))
145
self.comm.refresh_right()
199
window.annotate(wt, branch, file_id)
147
204
def remove_file(self, action):
148
205
""" Right context menu -> Remove """
149
206
# Remove only the selected file
150
directory = self.comm.get_path()
151
filename = self.comm.get_selected_right()
154
self.dialog.error_dialog(_('No file was selected'),
155
_('Please select a file from the list,\nor choose the other option.'))
159
fileops.remove([directory + '/' + filename])
160
except errors.NotBranchError:
161
self.dialog.error_dialog(_('Directory is not a branch'),
162
_('You can perform this action only in a branch.'))
164
except errors.NotVersionedError:
165
self.dialog.error_dialog(_('File not versioned'),
166
_('The selected file is not versioned.'))
171
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()
173
261
def commit(self, action):
174
262
""" Right context menu -> Commit """
175
from commit import OliveCommit
176
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()
179
282
def diff(self, action):
180
283
""" Right context menu -> Diff """
181
from diff import OliveDiff
182
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))
185
291
def bookmark(self, action):
186
292
""" Right context menu -> Bookmark """
187
if self.comm.pref.add_bookmark(self.comm.get_path()):
188
self.dialog.info_dialog(_('Bookmark successfully added'),
189
_('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.'))
191
self.dialog.warning_dialog(_('Location already bookmarked'),
192
_('The current directory is already bookmarked.\nSee the left panel for reference.'))
298
warning_dialog(_('Location already bookmarked'),
299
_('The current directory is already bookmarked.\nSee the left panel for reference.'))
194
self.comm.refresh_left()
301
self.app.refresh_left()
196
303
def edit_bookmark(self, action):
197
304
""" Left context menu -> Edit """
198
from bookmark import OliveBookmark
199
bookmark = OliveBookmark(self.gladefile, self.comm, self.dialog)
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()
202
319
def remove_bookmark(self, action):
203
320
""" Left context menu -> Remove """
204
self.comm.pref.remove_bookmark(self.comm.get_selected_left())
206
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 """
208
335
def diff_selected(self, action):
209
336
""" Diff toolbutton -> Selected... """