[gnome-clocks: 4/5] Implement deleting functionality for World Clocks
- From: Seif Lotfy <seiflotfy src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-clocks: 4/5] Implement deleting functionality for World Clocks
- Date: Sat, 25 Aug 2012 11:01:33 +0000 (UTC)
commit 4d23553c9be98368bb3f20e0caec6f84383e889e
Author: Seif Lotfy <seif lotfy com>
Date: Fri Aug 24 12:46:08 2012 +0200
Implement deleting functionality for World Clocks
Added Delete button widget for "Selection Mode" and finished
deleteing functionality for world clocks.
gnomeclocks/app.py | 42 ++++++++++++---
gnomeclocks/clocks.py | 14 +++--
gnomeclocks/widgets.py | 132 +++++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 172 insertions(+), 16 deletions(-)
---
diff --git a/gnomeclocks/app.py b/gnomeclocks/app.py
index 34deca1..24c45c8 100644
--- a/gnomeclocks/app.py
+++ b/gnomeclocks/app.py
@@ -17,12 +17,15 @@
# Author: Seif Lotfy <seif lotfy collabora co uk>
import os
+import sys
from gettext import ngettext
-from gi.repository import Gtk, Gdk, GObject, GLib, Gio
+from gi.repository import Gtk, Gdk, GObject, GLib, Gio, GtkClutter
from clocks import Clock, World, Alarm, Timer, Stopwatch
+from widgets import Embed
from utils import Dirs
from gnomeclocks import __version__, AUTHORS, COPYRIGHTS
+GtkClutter.init(sys.argv)
class Window(Gtk.ApplicationWindow):
def __init__(self, app):
@@ -49,12 +52,13 @@ class Window(Gtk.ApplicationWindow):
self.set_size_request(640, 480)
self.vbox = vbox = Gtk.VBox()
- self.add(vbox)
+ embed = Embed(vbox)
+ self.add(embed)
self.notebook = Gtk.Notebook()
self.notebook.set_show_tabs(False)
self.notebook.set_show_border(False)
- self.toolbar = ClocksToolbar()
+ self.toolbar = ClocksToolbar(embed._selectionToolbar)
vbox.pack_start(self.toolbar, False, False, 0)
vbox.pack_start(self.toolbar.selection_toolbar, False, False, 0)
@@ -75,6 +79,7 @@ class Window(Gtk.ApplicationWindow):
self.world.connect("show-clock", self._on_show_clock)
self.toolbar.connect("view-clock", self._on_view_clock)
+ vbox.show_all()
self.show_all()
self.toolbar.selection_toolbar.hide()
@@ -136,8 +141,9 @@ class Window(Gtk.ApplicationWindow):
class SelectionToolbar(Gtk.Toolbar):
- def __init__(self):
+ def __init__(self, _selectionToolbar):
Gtk.Toolbar.__init__(self)
+ self._selectionToolbar = _selectionToolbar
self.get_style_context().add_class("clocks-toolbar")
self.set_icon_size(Gtk.IconSize.MENU)
self.get_style_context().add_class(Gtk.STYLE_CLASS_MENUBAR)
@@ -177,6 +183,8 @@ class SelectionToolbar(Gtk.Toolbar):
self.doneButton.get_style_context().add_class('suggested-action')
self.doneButton.set_label(_("Done"))
self.doneButton.set_size_request(64, 34)
+ self.doneButton.connect("clicked", self._on_done_clicked)
+ self._selectionToolbar._toolbarDelete.connect("clicked", self._on_delete_clicked)
self.leftBox = box = Gtk.Box()
box.pack_start(self.doneButton, False, False, 0)
@@ -202,11 +210,29 @@ class SelectionToolbar(Gtk.Toolbar):
def _on_selection_changed(self, view):
selection = view.get_selection()
self.set_selection_label(len(selection))
-
+ if len(selection) > 0:
+ self._selectionToolbar._fade_in()
+ else:
+ self._selectionToolbar._fade_out()
+
+ def _on_done_clicked(self, widget):
+ #TODO: do something
+ self._selectionToolbar._fade_out()
+
+ def _on_delete_clicked(self, widget):
+ selection = self.current_view.get_selection()
+ if type(self.current_view) == World:
+ model = self.current_view.liststore
+ items = []
+ for treepath in selection:
+ items.append(model[treepath][3])
+ self.current_view.delete_clocks(items)
+ selection = self.current_view.get_selection()
+ self.set_selection_label(len(selection))
+ self._selectionToolbar._fade_out()
class ClockButton(Gtk.RadioButton):
_group = None
-
def __init__(self, text):
Gtk.RadioButton.__init__(self, group=ClockButton._group, draw_indicator=False)
self.text = text
@@ -234,7 +260,7 @@ class ClocksToolbar(Gtk.Toolbar):
__gsignals__ = {'view-clock': (GObject.SignalFlags.RUN_LAST,
None, (Clock,))}
- def __init__(self):
+ def __init__(self, selectionToolbar):
Gtk.Toolbar.__init__(self)
self.get_style_context().add_class("clocks-toolbar")
@@ -298,7 +324,7 @@ class ClocksToolbar(Gtk.Toolbar):
box.pack_end(self.applyButton, False, False, 0)
toolbox.pack_start(box, True, True, 0)
- self.selection_toolbar = SelectionToolbar()
+ self.selection_toolbar = SelectionToolbar(selectionToolbar)
self.selection_toolbar.doneButton.connect("clicked",
self._on_selection_mode, False)
diff --git a/gnomeclocks/clocks.py b/gnomeclocks/clocks.py
index 48c4c92..8b7c4a3 100644
--- a/gnomeclocks/clocks.py
+++ b/gnomeclocks/clocks.py
@@ -131,9 +131,13 @@ class World(Clock):
"<b>" + name + "</b>",
d])
- def delete_clock(self, d):
- self.clocks.remove(d.location)
+ def delete_clocks(self, clocks):
+ for d in clocks:
+ self.clocks.remove(d._location)
+ worldclockstorage.save_clocks(self.clocks)
self.iconview.unselect_all()
+ self.liststore.clear()
+ self.load_clocks()
def update_empty_view(self):
if len(self.liststore) == 0:
@@ -148,8 +152,7 @@ class World(Clock):
self.show_all()
def open_new_dialog(self):
- parent = self.get_parent().get_parent().get_parent()
- window = NewWorldClockDialog(parent)
+ window = NewWorldClockDialog(self.get_toplevel())
window.connect("response", self.on_dialog_response)
window.show_all()
@@ -268,8 +271,7 @@ class Alarm(Clock):
print "To Do!"
def open_new_dialog(self):
- parent = self.get_parent().get_parent().get_parent()
- window = AlarmDialog(self, parent)
+ window = AlarmDialog(self, self.get_toplevel())
window.connect("response", self.on_dialog_response, True)
window.show_all()
diff --git a/gnomeclocks/widgets.py b/gnomeclocks/widgets.py
index 4a9a85f..2328557 100644
--- a/gnomeclocks/widgets.py
+++ b/gnomeclocks/widgets.py
@@ -17,7 +17,7 @@
# Author: Seif Lotfy <seif lotfy collabora co uk>
from gi.repository import Gtk, Gdk, GdkPixbuf, GObject, Gio, Pango, PangoCairo
-from gi.repository import GWeather
+from gi.repository import GWeather, Clutter, GtkClutter
from storage import Location
from alarm import AlarmItem
@@ -27,6 +27,7 @@ import os
import cairo
import time
+SELECTION_TOOLBAR_DEFAULT_WIDTH = 300;
# FIXME: Use real sunrise/sunset time in the future
def get_is_day(hour):
@@ -103,6 +104,7 @@ class NewWorldClockDialog(Gtk.Dialog):
class DigitalClock():
def __init__(self, location):
+ self._location = location
self.location = location.location
self.id = location.id
self.timezone = self.location.get_timezone()
@@ -672,5 +674,131 @@ class SelectableIconView(Gtk.IconView):
self.emit("selection-changed")
else:
self.emit("item-activated", path)
-
return False
+
+def alphaGtkWidget(widget):
+ widget.override_background_color(0, Gdk.RGBA(0,0,0,0))
+
+class SelectionToolbar():
+
+ def __init__(self, parent_actor):
+ self._parent_actor = parent_actor
+
+ self.widget = Gtk.Toolbar()
+ self.widget.set_show_arrow(False)
+ self.widget.set_icon_size(Gtk.IconSize.LARGE_TOOLBAR)
+ self.widget.get_style_context().add_class('osd');
+ self.widget.set_size_request(SELECTION_TOOLBAR_DEFAULT_WIDTH, -1);
+
+ self.actor = GtkClutter.Actor.new_with_contents(self.widget)
+ self.actor.set_opacity(0)
+ alphaGtkWidget(self.actor.get_widget())
+
+ constraint = Clutter.AlignConstraint()
+ constraint.set_source(self._parent_actor)
+ constraint.set_align_axis(Clutter.AlignAxis.X_AXIS)
+ constraint.set_factor(0.50)
+ self.actor.add_constraint(constraint)
+
+ constraint = Clutter.AlignConstraint()
+ constraint.set_source(self._parent_actor)
+ constraint.set_align_axis(Clutter.AlignAxis.Y_AXIS)
+ constraint.set_factor(0.95)
+ self.actor.add_constraint(constraint)
+
+ self._leftBox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
+ self._leftGroup = Gtk.ToolItem()
+ self._leftGroup.set_expand(True)
+ self._leftGroup.add(self._leftBox)
+ self.widget.insert(self._leftGroup, -1);
+ self._toolbarDelete = Gtk.Button("Delete") #FIXME: Make translatable
+ self._leftBox.pack_start(self._toolbarDelete, True, True, 0);
+ self._toolbarDelete.connect('clicked', self._on_toolbar_delete)
+ self.widget.show_all()
+
+ def _on_toolbar_delete(self, widget):
+ pass
+
+ def change_select_mode(self, mode):
+ if mode:
+ self._fade_in() #TODO implement fading in
+ else:
+ self._fade_out()
+
+ def _fade_in(self):
+ if self.actor.get_opacity() != 0:
+ return
+ else:
+ self.actor.set_opacity(0)
+ self.actor.show()
+ # FIXME: add tween
+ #Tweener.addTween(self.actor,
+ # { opacity: 255,
+ # time: 0.30,
+ # transition: 'easeOutQuad' });
+ self.actor.set_opacity(255)
+ self.actor.show()
+
+ def _fade_out(self):
+ # FIXME: add tween
+ #Tweener.addTween(self.actor,
+ #{ opacity: 0,
+ # time: 0.30,
+ # transition: 'easeOutQuad',
+ # onComplete: function() {
+ # self.actor.hide();
+ # },
+ # onCompleteScope: this });
+ self.actor.set_opacity(0)
+ self.actor.hide()
+
+
+class Embed (GtkClutter.Embed):
+ def __init__(self, notebook):
+ GtkClutter.Embed.__init__(self)
+ self.set_use_layout_size(True)
+
+ self.stage = self.get_stage()
+
+ self._overlayLayout = Clutter.BinLayout()
+ self.actor = Clutter.Box()
+ self.actor.set_layout_manager(self._overlayLayout)
+ constraint = Clutter.BindConstraint()
+ constraint.set_source(self.stage)
+ constraint.set_coordinate(Clutter.BindCoordinate.SIZE)
+ self.actor.add_constraint(constraint)
+ self.stage.add_actor(self.actor)
+
+ self._contentsLayout = Clutter.BoxLayout()
+ self._contentsLayout.set_vertical(True)
+ self._contentsActor = Clutter.Box()
+ self._contentsActor.set_layout_manager(self._contentsLayout)
+ self._overlayLayout.add(self._contentsActor,
+ Clutter.BinAlignment.FILL, Clutter.BinAlignment.FILL)
+
+ # pack the main GtkNotebook and a spinnerbox in a BinLayout, so that
+ # we can easily bring them front/back
+ self._viewLayout = Clutter.BinLayout()
+ self._viewActor = Clutter.Box()
+ self._viewActor.set_layout_manager(self._viewLayout)
+ self._contentsLayout.set_expand(self._viewActor, True)
+ self._contentsLayout.set_fill(self._viewActor, True, True)
+ self._contentsActor.add_actor(self._viewActor)
+
+ self._notebook = notebook
+ self._notebookActor = GtkClutter.Actor.new_with_contents(self._notebook)
+ self._viewLayout.add(self._notebookActor,
+ Clutter.BinAlignment.FILL,
+ Clutter.BinAlignment.FILL)
+
+ self._selectionToolbar = SelectionToolbar(self._contentsActor)
+ self._overlayLayout.add(self._selectionToolbar.actor,
+ Clutter.BinAlignment.FIXED,
+ Clutter.BinAlignment.FIXED)
+ self.show_all()
+
+ def set_show_selectionbar(show):
+ if show:
+ self._selectionToolbar._fade_in()
+ else:
+ self._selectionToolbar._fade_out()
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]