From 2450afba114062fed8b28e2933c7a4747e71450e Mon Sep 17 00:00:00 2001 From: Ed Page Date: Fri, 25 Sep 2009 13:08:03 -0500 Subject: [PATCH] More work in removing dead weight --- README | 37 ---- TODO | 5 - src/gtk_toolbox.py | 523 ---------------------------------------------------- 3 files changed, 565 deletions(-) delete mode 100644 README delete mode 100644 TODO diff --git a/README b/README deleted file mode 100644 index b87ce9c..0000000 --- a/README +++ /dev/null @@ -1,37 +0,0 @@ -Building a package -=================== -Run - make PLATFORM=... package -which will create a "./pkg-.../..." heirarchy. Move this structure to somewhere on the tablet, then run pypackager. - -Supported PLATFORMs include - desktop - os2007 - os2008 - -SDK Enviroment -=================== - -Native - -Follow install instructions - Ubuntu: http://www.linuxuk.org/node/38 -Install Nokia stuff (for each target) - fakeroot apt-get install maemo-explicit - -Userful commands -Login - /scratchbox/login -Change targets - sb-conf select DIABLO_ARMEL - sb-conf select DIABLO_X86 -Fixing it - fakeroot apt-get -f install - -Starting scratchbox - Xephyr :2 -host-cursor -screen 800x480x16 -dpi 96 -ac -extension Composite - scratchbox - export DISPLAY=:2 - af-sb-init.sh start -Then running a command in the "Maemo" terminal will launch it in the Xephyr session - Tip: run with "run-standalone.sh" for niceness? diff --git a/TODO b/TODO deleted file mode 100644 index 25bc1a1..0000000 --- a/TODO +++ /dev/null @@ -1,5 +0,0 @@ -src/gv_views.py: -21: @todo Alternate UI for dialogs (stackables) -416: @todo Add multi-SMS messages like GoogleVoice - - diff --git a/src/gtk_toolbox.py b/src/gtk_toolbox.py index 26803d7..da9accc 100644 --- a/src/gtk_toolbox.py +++ b/src/gtk_toolbox.py @@ -4,43 +4,13 @@ from __future__ import with_statement import os import errno -import sys import time -import itertools import functools import contextlib import logging import threading import Queue -import gobject -import gtk - - -def get_screen_orientation(): - width, height = gtk.gdk.get_default_root_window().get_size() - if width < height: - return gtk.ORIENTATION_VERTICAL - else: - return gtk.ORIENTATION_HORIZONTAL - - -def orientation_change_connect(handler, *args): - """ - @param handler(orientation, *args) -> None(?) - """ - initialScreenOrientation = get_screen_orientation() - orientationAndArgs = list(itertools.chain((initialScreenOrientation, ), args)) - - def _on_screen_size_changed(screen): - newScreenOrientation = get_screen_orientation() - if newScreenOrientation != orientationAndArgs[0]: - orientationAndArgs[0] = newScreenOrientation - handler(*orientationAndArgs) - - rootScreen = gtk.gdk.get_default_root_window() - return gtk.connect(rootScreen, "size-changed", _on_screen_size_changed) - @contextlib.contextmanager def flock(path, timeout=-1): @@ -69,23 +39,6 @@ def flock(path, timeout=-1): os.unlink(path) -@contextlib.contextmanager -def gtk_lock(): - gtk.gdk.threads_enter() - try: - yield - finally: - gtk.gdk.threads_leave() - - -def find_parent_window(widget): - while True: - parent = widget.get_parent() - if isinstance(parent, gtk.Window): - return parent - widget = parent - - def make_idler(func): """ Decorator that makes a generator-function into a function that will continue execution on next call @@ -106,37 +59,6 @@ def make_idler(func): return decorated_func -def asynchronous_gtk_message(original_func): - """ - @note Idea came from http://www.aclevername.com/articles/python-webgui/ - """ - - def execute(allArgs): - args, kwargs = allArgs - with gtk_lock(): - original_func(*args, **kwargs) - return False - - @functools.wraps(original_func) - def delayed_func(*args, **kwargs): - gobject.idle_add(execute, (args, kwargs)) - - return delayed_func - - -def synchronous_gtk_message(original_func): - """ - @note Idea came from http://www.aclevername.com/articles/python-webgui/ - """ - - @functools.wraps(original_func) - def immediate_func(*args, **kwargs): - with gtk_lock(): - return original_func(*args, **kwargs) - - return immediate_func - - def autostart(func): """ >>> @autostart @@ -281,103 +203,6 @@ def threaded_stage(target, thread_factory = threading.Thread): return queue_sink(messages) -class LoginWindow(object): - - def __init__(self, widgetTree): - """ - @note Thread agnostic - """ - self._dialog = widgetTree.get_widget("loginDialog") - self._parentWindow = widgetTree.get_widget("mainWindow") - self._serviceCombo = widgetTree.get_widget("serviceCombo") - self._usernameEntry = widgetTree.get_widget("usernameentry") - self._passwordEntry = widgetTree.get_widget("passwordentry") - - self._serviceList = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING) - self._serviceCombo.set_model(self._serviceList) - cell = gtk.CellRendererText() - self._serviceCombo.pack_start(cell, True) - self._serviceCombo.add_attribute(cell, 'text', 1) - self._serviceCombo.set_active(0) - - widgetTree.get_widget("loginbutton").connect("clicked", self._on_loginbutton_clicked) - widgetTree.get_widget("logins_close_button").connect("clicked", self._on_loginclose_clicked) - - def request_credentials(self, - parentWindow = None, - defaultCredentials = ("", "") - ): - """ - @note UI Thread - """ - if parentWindow is None: - parentWindow = self._parentWindow - - self._serviceCombo.hide() - self._serviceList.clear() - - self._usernameEntry.set_text(defaultCredentials[0]) - self._passwordEntry.set_text(defaultCredentials[1]) - - try: - self._dialog.set_transient_for(parentWindow) - self._dialog.set_default_response(gtk.RESPONSE_OK) - response = self._dialog.run() - if response != gtk.RESPONSE_OK: - raise RuntimeError("Login Cancelled") - - username = self._usernameEntry.get_text() - password = self._passwordEntry.get_text() - self._passwordEntry.set_text("") - finally: - self._dialog.hide() - - return username, password - - def request_credentials_from(self, - services, - parentWindow = None, - defaultCredentials = ("", "") - ): - """ - @note UI Thread - """ - if parentWindow is None: - parentWindow = self._parentWindow - - self._serviceList.clear() - for serviceIdserviceName in services: - self._serviceList.append(serviceIdserviceName) - self._serviceCombo.set_active(0) - self._serviceCombo.show() - - self._usernameEntry.set_text(defaultCredentials[0]) - self._passwordEntry.set_text(defaultCredentials[1]) - - try: - self._dialog.set_transient_for(parentWindow) - self._dialog.set_default_response(gtk.RESPONSE_OK) - response = self._dialog.run() - if response != gtk.RESPONSE_OK: - raise RuntimeError("Login Cancelled") - - username = self._usernameEntry.get_text() - password = self._passwordEntry.get_text() - finally: - self._dialog.hide() - - itr = self._serviceCombo.get_active_iter() - serviceId = int(self._serviceList.get_value(itr, 0)) - self._serviceList.clear() - return serviceId, username, password - - def _on_loginbutton_clicked(self, *args): - self._dialog.response(gtk.RESPONSE_OK) - - def _on_loginclose_clicked(self, *args): - self._dialog.response(gtk.RESPONSE_CANCEL) - - def safecall(f, errorDisplay=None, default=None, exception=Exception): ''' Returns modified f. When the modified f is called and throws an @@ -391,351 +216,3 @@ def safecall(f, errorDisplay=None, default=None, exception=Exception): errorDisplay.push_exception(e) return default return _safecall - - -class ErrorDisplay(object): - - def __init__(self, widgetTree): - super(ErrorDisplay, self).__init__() - self.__errorBox = widgetTree.get_widget("errorEventBox") - self.__errorDescription = widgetTree.get_widget("errorDescription") - self.__errorClose = widgetTree.get_widget("errorClose") - self.__parentBox = self.__errorBox.get_parent() - - self.__errorBox.connect("button_release_event", self._on_close) - - self.__messages = [] - self.__parentBox.remove(self.__errorBox) - - def push_message_with_lock(self, message): - with gtk_lock(): - self.push_message(message) - - def push_message(self, message): - self.__messages.append(message) - if 1 == len(self.__messages): - self.__show_message(message) - - def push_exception_with_lock(self): - with gtk_lock(): - self.push_exception() - - def push_exception(self): - userMessage = str(sys.exc_info()[1]) - self.push_message(userMessage) - logging.exception(userMessage) - - def pop_message(self): - del self.__messages[0] - if 0 == len(self.__messages): - self.__hide_message() - else: - self.__errorDescription.set_text(self.__messages[0]) - - def _on_close(self, *args): - self.pop_message() - - def __show_message(self, message): - self.__errorDescription.set_text(message) - self.__parentBox.pack_start(self.__errorBox, False, False) - self.__parentBox.reorder_child(self.__errorBox, 1) - - def __hide_message(self): - self.__errorDescription.set_text("") - self.__parentBox.remove(self.__errorBox) - - -class DummyErrorDisplay(object): - - def __init__(self): - super(DummyErrorDisplay, self).__init__() - - self.__messages = [] - - def push_message_with_lock(self, message): - self.push_message(message) - - def push_message(self, message): - if 0 < len(self.__messages): - self.__messages.append(message) - else: - self.__show_message(message) - - def push_exception(self, exception = None): - userMessage = str(sys.exc_value) - logging.exception(userMessage) - - def pop_message(self): - if 0 < len(self.__messages): - self.__show_message(self.__messages[0]) - del self.__messages[0] - - def __show_message(self, message): - logging.debug(message) - - -class MessageBox(gtk.MessageDialog): - - def __init__(self, message): - parent = None - gtk.MessageDialog.__init__( - self, - parent, - gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT, - gtk.MESSAGE_ERROR, - gtk.BUTTONS_OK, - message, - ) - self.set_default_response(gtk.RESPONSE_OK) - self.connect('response', self._handle_clicked) - - def _handle_clicked(self, *args): - self.destroy() - - -class MessageBox2(gtk.MessageDialog): - - def __init__(self, message): - parent = None - gtk.MessageDialog.__init__( - self, - parent, - gtk.DIALOG_DESTROY_WITH_PARENT, - gtk.MESSAGE_ERROR, - gtk.BUTTONS_OK, - message, - ) - self.set_default_response(gtk.RESPONSE_OK) - self.connect('response', self._handle_clicked) - - def _handle_clicked(self, *args): - self.destroy() - - -class PopupCalendar(object): - - def __init__(self, parent, displayDate, title = ""): - self._displayDate = displayDate - - self._calendar = gtk.Calendar() - self._calendar.select_month(self._displayDate.month, self._displayDate.year) - self._calendar.select_day(self._displayDate.day) - self._calendar.set_display_options( - gtk.CALENDAR_SHOW_HEADING | - gtk.CALENDAR_SHOW_DAY_NAMES | - gtk.CALENDAR_NO_MONTH_CHANGE | - 0 - ) - self._calendar.connect("day-selected", self._on_day_selected) - - self._popupWindow = gtk.Window() - self._popupWindow.set_title(title) - self._popupWindow.add(self._calendar) - self._popupWindow.set_transient_for(parent) - self._popupWindow.set_modal(True) - self._popupWindow.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG) - self._popupWindow.set_skip_pager_hint(True) - self._popupWindow.set_skip_taskbar_hint(True) - - def run(self): - self._popupWindow.show_all() - - def _on_day_selected(self, *args): - try: - self._calendar.select_month(self._displayDate.month, self._displayDate.year) - self._calendar.select_day(self._displayDate.day) - except Exception, e: - logging.exception(e) - - -class QuickAddView(object): - - def __init__(self, widgetTree, errorDisplay, signalSink, prefix): - self._errorDisplay = errorDisplay - self._manager = None - self._signalSink = signalSink - - self._clipboard = gtk.clipboard_get() - - self._taskNameEntry = widgetTree.get_widget(prefix+"-nameEntry") - self._addTaskButton = widgetTree.get_widget(prefix+"-addButton") - self._pasteTaskNameButton = widgetTree.get_widget(prefix+"-pasteNameButton") - self._clearTaskNameButton = widgetTree.get_widget(prefix+"-clearNameButton") - self._onAddId = None - self._onAddClickedId = None - self._onAddReleasedId = None - self._addToEditTimerId = None - self._onClearId = None - self._onPasteId = None - - def enable(self, manager): - self._manager = manager - - self._onAddId = self._addTaskButton.connect("clicked", self._on_add) - self._onAddClickedId = self._addTaskButton.connect("pressed", self._on_add_pressed) - self._onAddReleasedId = self._addTaskButton.connect("released", self._on_add_released) - self._onPasteId = self._pasteTaskNameButton.connect("clicked", self._on_paste) - self._onClearId = self._clearTaskNameButton.connect("clicked", self._on_clear) - - def disable(self): - self._manager = None - - self._addTaskButton.disconnect(self._onAddId) - self._addTaskButton.disconnect(self._onAddClickedId) - self._addTaskButton.disconnect(self._onAddReleasedId) - self._pasteTaskNameButton.disconnect(self._onPasteId) - self._clearTaskNameButton.disconnect(self._onClearId) - - def set_addability(self, addability): - self._addTaskButton.set_sensitive(addability) - - def _on_add(self, *args): - try: - name = self._taskNameEntry.get_text() - self._taskNameEntry.set_text("") - - self._signalSink.stage.send(("add", name)) - except Exception, e: - self._errorDisplay.push_exception() - - def _on_add_edit(self, *args): - try: - name = self._taskNameEntry.get_text() - self._taskNameEntry.set_text("") - - self._signalSink.stage.send(("add-edit", name)) - except Exception, e: - self._errorDisplay.push_exception() - - def _on_add_pressed(self, widget): - try: - self._addToEditTimerId = gobject.timeout_add(1000, self._on_add_edit) - except Exception, e: - self._errorDisplay.push_exception() - - def _on_add_released(self, widget): - try: - if self._addToEditTimerId is not None: - gobject.source_remove(self._addToEditTimerId) - self._addToEditTimerId = None - except Exception, e: - self._errorDisplay.push_exception() - - def _on_paste(self, *args): - try: - entry = self._taskNameEntry.get_text() - addedText = self._clipboard.wait_for_text() - if addedText: - entry += addedText - self._taskNameEntry.set_text(entry) - except Exception, e: - self._errorDisplay.push_exception() - - def _on_clear(self, *args): - try: - self._taskNameEntry.set_text("") - except Exception, e: - self._errorDisplay.push_exception() - - -class TapOrHold(object): - - def __init__(self, widget): - self._widget = widget - self._isTap = True - self._isPointerInside = True - self._holdTimeoutId = None - self._tapTimeoutId = None - self._taps = 0 - - self._bpeId = None - self._breId = None - self._eneId = None - self._lneId = None - - def enable(self): - self._bpeId = self._widget.connect("button-press-event", self._on_button_press) - self._breId = self._widget.connect("button-release-event", self._on_button_release) - self._eneId = self._widget.connect("enter-notify-event", self._on_enter) - self._lneId = self._widget.connect("leave-notify-event", self._on_leave) - - def disable(self): - self._widget.disconnect(self._bpeId) - self._widget.disconnect(self._breId) - self._widget.disconnect(self._eneId) - self._widget.disconnect(self._lneId) - - def on_tap(self, taps): - print "TAP", taps - - def on_hold(self, taps): - print "HOLD", taps - - def on_holding(self): - print "HOLDING" - - def on_cancel(self): - print "CANCEL" - - def _on_button_press(self, *args): - # Hack to handle weird notebook behavior - self._isPointerInside = True - self._isTap = True - - if self._tapTimeoutId is not None: - gobject.source_remove(self._tapTimeoutId) - self._tapTimeoutId = None - - # Handle double taps - if self._holdTimeoutId is None: - self._tapTimeoutId = None - - self._taps = 1 - self._holdTimeoutId = gobject.timeout_add(1000, self._on_hold_timeout) - else: - self._taps = 2 - - def _on_button_release(self, *args): - assert self._tapTimeoutId is None - # Handle release after timeout if user hasn't double-clicked - self._tapTimeoutId = gobject.timeout_add(100, self._on_tap_timeout) - - def _on_actual_press(self, *args): - if self._holdTimeoutId is not None: - gobject.source_remove(self._holdTimeoutId) - self._holdTimeoutId = None - - if self._isPointerInside: - if self._isTap: - self.on_tap(self._taps) - else: - self.on_hold(self._taps) - else: - self.on_cancel() - - def _on_tap_timeout(self, *args): - self._tapTimeoutId = None - self._on_actual_press() - return False - - def _on_hold_timeout(self, *args): - self._holdTimeoutId = None - self._isTap = False - self.on_holding() - return False - - def _on_enter(self, *args): - self._isPointerInside = True - - def _on_leave(self, *args): - self._isPointerInside = False - - -if __name__ == "__main__": - if False: - import datetime - cal = PopupCalendar(None, datetime.datetime.now()) - cal._popupWindow.connect("destroy", lambda w: gtk.main_quit()) - cal.run() - - gtk.main() -- 1.7.9.5