Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/jarabe/journal/journalactivity.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/jarabe/journal/journalactivity.py')
-rw-r--r--src/jarabe/journal/journalactivity.py132
1 files changed, 127 insertions, 5 deletions
diff --git a/src/jarabe/journal/journalactivity.py b/src/jarabe/journal/journalactivity.py
index bb1c7f6..44a2029 100644
--- a/src/jarabe/journal/journalactivity.py
+++ b/src/jarabe/journal/journalactivity.py
@@ -17,7 +17,9 @@
import logging
from gettext import gettext as _
+from gettext import ngettext
import uuid
+import gobject
import gtk
import dbus
@@ -25,7 +27,8 @@ import statvfs
import os
from sugar.graphics.window import Window
-from sugar.graphics.alert import ErrorAlert
+from sugar.graphics.alert import Alert, ErrorAlert
+from sugar.graphics.icon import Icon
from sugar.bundle.bundle import ZipExtractException, RegistrationException
from sugar import env
@@ -34,6 +37,7 @@ from sugar import wm
from jarabe.model import bundleregistry
from jarabe.journal.journaltoolbox import MainToolbox, DetailToolbox
+from jarabe.journal.journaltoolbox import EditToolbox
from jarabe.journal.listview import ListView
from jarabe.journal.detailview import DetailView
from jarabe.journal.volumestoolbar import VolumesToolbar
@@ -118,9 +122,12 @@ class JournalActivity(JournalWindow):
self._secondary_view = None
self._list_view = None
self._detail_view = None
+ self._edit_toolbox = None
self._main_toolbox = None
self._detail_toolbox = None
self._volumes_toolbar = None
+ self._editing_mode = False
+ self._editing_alert = None
self._setup_main_view()
self._setup_secondary_view()
@@ -141,6 +148,7 @@ class JournalActivity(JournalWindow):
self._dbus_service = JournalActivityDBusService(self)
self.iconify()
+ self._iconified = True
self._critical_space_alert = None
self._check_available_space()
@@ -172,6 +180,7 @@ class JournalActivity(JournalWindow):
self._list_view.connect('detail-clicked', self.__detail_clicked_cb)
self._list_view.connect('clear-clicked', self.__clear_clicked_cb)
self._list_view.connect('volume-error', self.__volume_error_cb)
+ self._list_view.connect('select-toggled', self.__select_toggled_cb)
self._main_view.pack_start(self._list_view)
self._list_view.show()
@@ -185,6 +194,14 @@ class JournalActivity(JournalWindow):
search_toolbar.connect('query-changed', self._query_changed_cb)
search_toolbar.set_mount_point('/')
+ self._edit_toolbox = EditToolbox()
+ edit_toolbar = self._edit_toolbox.edit_toolbar
+ edit_toolbar.connect('edit-none', self.__edit_none_activated_cb)
+ edit_toolbar.connect('edit-all', self.__edit_all_activated_cb)
+ edit_toolbar.connect('edit-erase', self.__edit_erase_activated_cb)
+ edit_toolbar.connect('edit-copy', self.__edit_copy_activated_cb)
+
+
def _setup_secondary_view(self):
self._secondary_view = gtk.VBox()
@@ -197,6 +214,85 @@ class JournalActivity(JournalWindow):
self._secondary_view.pack_end(self._detail_view)
self._detail_view.show()
+ def __edit_none_activated_cb(self, toolbar):
+ list_model = self._list_view.get_model()
+ list_model.set_selection_none()
+
+ def __edit_all_activated_cb(self, toolbar):
+ list_model = self._list_view.get_model()
+ list_model.set_selection_all()
+
+ def _remove_editing_alert(self):
+ if self._editing_alert is not None:
+ self.remove_alert(self._editing_alert)
+ self._editing_alert = None
+
+ def _add_editing_alert(self, title, message, operation, callback, data):
+ cancel_icon = Icon(icon_name='dialog-cancel')
+ ok_icon = Icon(icon_name='dialog-ok')
+
+ alert = Alert()
+ alert.props.title = title
+ alert.props.msg = message
+ alert.add_button(gtk.RESPONSE_CANCEL, _('Cancel'), cancel_icon)
+ alert.add_button(gtk.RESPONSE_OK, operation, ok_icon)
+ alert.connect('response', callback, data)
+ alert.show()
+
+ self._remove_editing_alert()
+ self._editing_alert = alert
+ self.add_alert(alert)
+
+ def __edit_erase_activated_cb(self, toolbar):
+ list_model = self._list_view.get_model()
+ entries_set = list_model.get_selection()
+ entries_len = len(entries_set)
+
+ message = ngettext('Do you want to erase %d entry?',
+ 'Do you want to erase %d entries?',
+ entries_len) % entries_len
+
+ self._add_editing_alert(_('Confirm erase'), message, _('Erase'),
+ self.__edit_erase_confirm_cb, entries_set)
+
+ def __edit_erase_confirm_cb(self, alert, response_id, entries_set):
+ self._remove_editing_alert()
+ if response_id == gtk.RESPONSE_OK:
+ gobject.idle_add(self._edit_erase_selection, entries_set)
+
+ def _edit_erase_selection(self, entries_set):
+ mount_path = self._list_view.get_mountpoint()
+ model.delete_entries(entries_set, mount_path)
+
+ def __edit_copy_activated_cb(self, toolbar, mount_info, mount_path):
+ list_model = self._list_view.get_model()
+ entries_set = list_model.get_selection()
+ entries_len = len(entries_set)
+
+ message = ngettext('Do you want to copy %d entry to %s?',
+ 'Do you want to copy %d entries to %s?',
+ entries_len) % (entries_len, mount_info)
+
+ self._add_editing_alert(_('Confirm copy'), message, _('Copy'),
+ self.__edit_copy_confirm_cb, (entries_set, mount_path))
+
+ def __edit_copy_confirm_cb(self, alert, response_id, data):
+ entries_set, mount_path = data
+ self._remove_editing_alert()
+ if response_id == gtk.RESPONSE_OK:
+ gobject.idle_add(self._edit_copy_selection,
+ entries_set, mount_path)
+
+ def _edit_copy_selection(self, entries_set, mount_path):
+ status, message = model.copy_entries(entries_set, mount_path)
+
+ if status is False:
+ alert = ErrorAlert(title=_('Copying error'), msg=message)
+ alert.connect('response', self.__alert_response_cb)
+ alert.show()
+ self.add_alert(alert)
+
+
def _key_press_event_cb(self, widget, event):
keyname = gtk.gdk.keyval_name(event.keyval)
if keyname == 'Escape':
@@ -208,6 +304,15 @@ class JournalActivity(JournalWindow):
def __clear_clicked_cb(self, list_view):
self._main_toolbox.search_toolbar.clear_query()
+ def __select_toggled_cb(self, list_view, mode):
+ logging.debug('Selection mode is %s', str(mode))
+ self._editing_mode = mode
+
+ # HACK: Don't exit detail view
+ if self.toolbar_box != self._detail_toolbox:
+ self.show_main_view()
+
+
def __go_back_clicked_cb(self, detail_view):
self.show_main_view()
@@ -216,15 +321,28 @@ class JournalActivity(JournalWindow):
self.show_main_view()
def show_main_view(self):
- if self.toolbar_box != self._main_toolbox:
- self.set_toolbar_box(self._main_toolbox)
- self._main_toolbox.show()
+ self._remove_editing_alert()
+
+ if self._editing_mode:
+ #HACK: Hide current mount point copy-to option
+ mount_point = self._list_view.get_mountpoint()
+ edit_toolbar = self._edit_toolbox.edit_toolbar
+ edit_toolbar.arrange_copy_options(mount_point)
+
+ toolbox = self._edit_toolbox
+ else:
+ toolbox = self._main_toolbox
+ if self.toolbar_box != toolbox:
+ self.set_toolbar_box(toolbox)
+ toolbox.show()
if self.canvas != self._main_view:
self.set_canvas(self._main_view)
self._main_view.show()
def _show_secondary_view(self, object_id):
+ self._remove_editing_alert()
+
metadata = model.get(object_id)
try:
self._detail_toolbox.entry_toolbar.set_metadata(metadata)
@@ -322,11 +440,15 @@ class JournalActivity(JournalWindow):
logging.debug('window_state_event_cb %r', self)
if event.changed_mask & gtk.gdk.WINDOW_STATE_ICONIFIED:
state = event.new_window_state
- visible = not state & gtk.gdk.WINDOW_STATE_ICONIFIED
+ self._iconified = state & gtk.gdk.WINDOW_STATE_ICONIFIED
+ visible = not self._iconified
self._list_view.set_is_visible(visible)
+
def __visibility_notify_event_cb(self, window, event):
logging.debug('visibility_notify_event_cb %r', self)
+ if self._iconified:
+ return
visible = event.state != gtk.gdk.VISIBILITY_FULLY_OBSCURED
self._list_view.set_is_visible(visible)