billreminder r659 - in trunk: . src/gui/widgets
- From: ogmaciel svn gnome org
- To: svn-commits-list gnome org
- Subject: billreminder r659 - in trunk: . src/gui/widgets
- Date: Mon, 29 Sep 2008 01:32:48 +0000 (UTC)
Author: ogmaciel
Date: Mon Sep 29 01:32:48 2008
New Revision: 659
URL: http://svn.gnome.org/viewvc/billreminder?rev=659&view=rev
Log:
timeline.py: More keyboard shortcuts added, such as zoom in/out.
Modified:
trunk/ChangeLog
trunk/src/gui/widgets/timeline.py
Modified: trunk/src/gui/widgets/timeline.py
==============================================================================
--- trunk/src/gui/widgets/timeline.py (original)
+++ trunk/src/gui/widgets/timeline.py Mon Sep 29 01:32:48 2008
@@ -89,7 +89,7 @@
self._clicked_position = -1
self.value = date
self.orientation = gtk.ORIENTATION_HORIZONTAL
- self.position = (self._display_days - 1) / 2
+ self.position = round((self._display_days - 1) / 2)
# Widget initialization
self.drag = False
@@ -180,7 +180,7 @@
line_h = 3
line_cg = self.style.dark_gc
- x = (self._box_rect.x + self._div_width * i + self._div_width / 2)
+ x = self._box_rect.x + self._div_width * i + self._div_width / 2
width = self._bullet_radius
# bullets
@@ -247,13 +247,13 @@
cr.arc(x, y, width / 5, 0, 2 * pi)
cr.fill()
if self._dates[i].weekday() == 0:
- cr.set_line_width(max(width / 8, 0.5))
+ cr.set_line_width(max(width / 8, 0.8))
cr.move_to(x, y - max(width / 2, 4))
cr.line_to(x, y + max(width / 2, 4))
cr.stroke()
if self._dates[i] == datetime.date.today():
- cr.set_line_width(max(width / 8, 0.5))
+ cr.set_line_width(max(width / 8, 0.8))
cr.set_source_rgb(0.4, 0.4, 0.4)
h_ = (self._box_rect.height + self._box_rect.y) / 10
for j in range(0, 10, 2):
@@ -270,9 +270,9 @@
size_ = self._layout.get_pixel_size()
self.style.paint_layout(self.window, self.state, False,
None, self, '',
- self._box_rect.x + \
+ int(self._box_rect.x + \
self._div_width * i + \
- self._div_width / 2 - size_[0] / 2,
+ self._div_width / 2 - size_[0] / 2),
self._box_rect.y + \
self._box_rect.height + 10,
self._layout)
@@ -281,15 +281,16 @@
## month label
elif ((self._dates[i].day == 1 and self._type == self.DAY) or \
- (self._dates[i].day <= 7 and self._type == self.WEEK) or i == 0):
+ (self._dates[i].day <= 7 and self._type == self.WEEK) or \
+ (i == 0 and self.start_date.month == self.end_date.month)):
if i < self._display_days:
self._layout.set_markup('<small>' + self._dates[i].strftime('%b') + '</small>')
size_ = self._layout.get_pixel_size()
self.style.paint_layout(self.window, self.state, False,
None, self, '',
- self._box_rect.x + \
+ int(self._box_rect.x + \
self._div_width * i + \
- self._div_width / 2 - size_[0] / 2,
+ self._div_width / 2 - size_[0] / 2),
self._box_rect.y + \
self._box_rect.height + 10,
self._layout)
@@ -298,15 +299,17 @@
self.window.draw_rectangle(line_cg[self.state],
True,
- self._box_rect.x + self._div_width * i +
- self._div_width / 2,
+ int(self._box_rect.x + self._div_width * i +
+ self._div_width / 2),
self._box_rect.height + \
self._box_rect.y - 2,
1, line_h)
## day label
# Draw today with bold font
- if i < self._display_days:
+ if i < self._display_days and \
+ (self.display_days < 20 or self._dates[i].weekday() == 0 or \
+ self._dates[i] == self.value):
if self._dates[i] == datetime.date.today():
self._layout.set_markup('<b><small>' + str(self._dates[i].day) + '</small></b>')
else:
@@ -318,15 +321,15 @@
self.window.draw_rectangle(
self.style.base_gc[gtk.STATE_SELECTED],
True,
- self._box_rect.x + self._div_width * i,
+ int(self._box_rect.x + self._div_width * i),
int(self._box_rect.y + self._box_rect.height),
- self._div_width + 1,
+ int(self._div_width + 1),
size_[1])
self.style.paint_layout(self.window, state_, False,
None, self, '',
- self._box_rect.x + \
+ int(self._box_rect.x + \
self._div_width * i + \
- self._div_width / 2 - size_[0] / 2,
+ self._div_width / 2 - size_[0] / 2),
self._box_rect.y + \
self._box_rect.height,
self._layout)
@@ -367,10 +370,41 @@
def do_key_press_event(self, event):
- if event.hardware_keycode in (102, 104):
+ if event.hardware_keycode == 102 and event.state == gtk.gdk.CONTROL_MASK:
+ # Control+right - go to next month
+ month = (self.value.month % 12) + 1
+ year = self.value.year + (self.value.month) / 12
+ self.select_month(month=month, year=year)
+ elif event.hardware_keycode == 100 and event.state == gtk.gdk.CONTROL_MASK:
+ # Control+left - go to prev month
+ year = self.value.year - int(not self.value.month - 1)
+ month = self.value.month - 1 + (self.value.year - year) * 12
+ self.select_month(month=month, year=year)
+ elif event.hardware_keycode in (102, 104):
+ # right/down - scroll right
self.scroll(gtk.gdk.SCROLL_RIGHT)
elif event.hardware_keycode in (100, 98):
+ # left/up - scroll left
self.scroll(gtk.gdk.SCROLL_LEFT)
+ elif event.hardware_keycode == 86:
+ # "+" - zoom in
+ self.display_days -= 2
+ elif event.hardware_keycode == 82:
+ # "-" - zoom out
+ self.display_days += 2
+ elif event.hardware_keycode == 97:
+ # Home - go to Today
+ self.value = datetime.date.today()
+ self._value_changed()
+ elif event.hardware_keycode == 99:
+ # PageUp
+ self.set_position(self.position - self.display_days)
+ self.move(self.allocation.width / 2)
+ elif event.hardware_keycode == 105:
+ # PageDow
+ self.set_position(self.position + self.display_days)
+ self.move(self.allocation.width / 2)
+ self.queue_draw_area(0, 0, self.allocation.width, self.allocation.height)
def do_button_release_event(self, event):
mx, my = self.get_pointer()
@@ -384,6 +418,7 @@
if mx > self._box_rect.x and \
mx < self._box_rect.width + self._box_rect.x:
if not self._dragged:
+ self.move(mx - self._div_width / 2)
gobject.timeout_add(self._scroll_delay, self._center_selection)
if mx < self._box_rect.x or \
mx > self._box_rect.x + self._box_rect.width or \
@@ -396,6 +431,7 @@
if self._dragged:
self.move(self._box_rect.width / 2)
self._dragged = False
+ self._pressed = False
return False
def do_button_press_event(self, event):
@@ -418,24 +454,19 @@
elif mx > self._box_rect.x and \
mx < self._box_rect.width + self._box_rect.x:
self._pressed = True
- self.move(mx - self._div_width / 2)
- self._clicked_position = self.position
+ self._clicked_position = self._get_mouse_position()
return False
def do_motion_notify_event(self, event):
mx, my = self.get_pointer()
if self._pressed:
self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND1))
- pos_ = (mx - self._div_width / 2 - self._box_rect.x) / self._div_width
- x = pos_ * self._div_width + self._box_rect.x
- if mx - self._div_width / 2 > x + self._div_width / 2:
- pos_ += 1
- if pos_ != self._clicked_position:
+ pos_ = self._get_mouse_position()
+ if pos_ != self._clicked_position or self._dragged:
self._dragged = True
- self.set_position(pos_, True)
+ self.set_position((self.display_days / 2) + (pos_ - self._clicked_position), True)
else:
self._dragged = False
-
else:
# TODO Improve tooltip
if mx < self._box_rect.x or \
@@ -469,6 +500,14 @@
self.set_tooltip_text(text)
return False
+ def _get_mouse_position(self):
+ mx, my = self.get_pointer()
+ pos_ = (mx - self._div_width / 2 - self._box_rect.x) / self._div_width
+ x = pos_ * self._div_width + self._box_rect.x
+ if mx - self._div_width / 2 > x + self._div_width / 2:
+ pos_ += 1
+ return round(pos_)
+
def _value_changed(self):
self.day = self.value.day
self.month = self.value.month
@@ -486,12 +525,12 @@
self.width = allocation.width
self.height = allocation.height
# Set timeline subdivisions size
- self._div_width = (allocation.width - self._box_rect.x * 2) // \
+ self._div_width = float(allocation.width - self._box_rect.x * 2) / \
self._display_days
# Set Timeline box size
self._box_rect.x = 21
self._box_rect.y = 8
- self._box_rect.width = (self._div_width * self._display_days)
+ self._box_rect.width = allocation.width - self._box_rect.x * 2
self._box_rect.height = allocation.height - 33
# Set Bullet radius
if self._div_width - self._div_width / 4 > self._box_rect.height / 2:
@@ -593,7 +632,7 @@
def move(self, pos, update=True, redraw=True):
position_old = self.position
- self.position = (pos - self._box_rect.x) / self._div_width
+ self.position = round((pos - self._box_rect.x) / self._div_width)
x = self.position * self._div_width + self._box_rect.x
if pos > x + self._div_width / 2:
self.position += 1
@@ -601,7 +640,8 @@
self.queue_draw_area(0, 0,
self.allocation.width, self.allocation.height)
if self.debug :
- print "Timeline.position: ", self.position
+ if not self._dragged:
+ print "Timeline.position: ", self.position
if update:
# Update self.value
@@ -613,7 +653,7 @@
return position_old, self.position
def set_position(self, pos, redraw=True):
- self.position = pos
+ self.position = round(pos)
x = pos * self._div_width + self._box_rect.x
self.move(x, False, redraw)
self._dist_dates()
@@ -629,11 +669,20 @@
return self._display_days
def set_display_days(self, days):
- if days < 15:
- days = 15
- elif days > 62:
- days = 62
+ days_old = self._display_days
+ if days < 7:
+ days = 7
+ elif days > 61:
+ days = 61
+ if days == days_old:
+ return
self._display_days = days
+ self._dist_dates()
+ # Set timeline subdivisions size
+ self.on_size_allocate(self, self.allocation)
+ self._center_selection()
+ self.queue_draw_area(0, 0, self.allocation.width,
+ self.allocation.height)
display_days = property(get_display_days, set_display_days)
def get_type(self):
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]