From d20ab5081508907ab0ae5c0194c9f79b52d65856 Mon Sep 17 00:00:00 2001 From: epage Date: Thu, 5 Mar 2009 02:01:45 +0000 Subject: [PATCH] * Switched the gc_views to support enable/disable in prep for null view support * Created rough outline of null views * Removed some of the line noise How did I make such a change that covers a large area without any noticable bugs git-svn-id: file:///svnroot/gc-dialer/trunk@203 c39d3808-3fe2-4d86-a59f-b7f623ee9f21 --- Makefile | 2 +- src/browser_emu.py | 2 +- src/file_backend.py | 24 ++----- src/gc_backend.py | 4 +- src/gc_dialer.py | 21 +++--- src/gc_views.py | 182 ++++++++++++++++++++++----------------------------- src/null_views.py | 72 ++++++++++++++++++++ support/pylint.rc | 8 +-- 8 files changed, 177 insertions(+), 138 deletions(-) create mode 100644 src/null_views.py diff --git a/Makefile b/Makefile index f06db9f..3b80bd3 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ PROJECT_NAME=dialcentral SOURCE_PATH=src -SOURCE=$(SOURCE_PATH)/gc_dialer.py $(SOURCE_PATH)/views.py $(SOURCE_PATH)/file_backend.py $(SOURCE_PATH)/evo_backend.py $(SOURCE_PATH)/gc_backend.py $(SOURCE_PATH)/browser_emu.py $(SOURCE_PATH)/__init__.py +SOURCE=$(SOURCE_PATH)/gc_dialer.py $(SOURCE_PATH)/gc_views.py $(SOURCE_PATH)/null_views.py $(SOURCE_PATH)/file_backend.py $(SOURCE_PATH)/evo_backend.py $(SOURCE_PATH)/gc_backend.py $(SOURCE_PATH)/browser_emu.py $(SOURCE_PATH)/__init__.py PROGRAM=$(SOURCE_PATH)/$(PROJECT_NAME).py OBJ=$(SOURCE:.py=.pyc) BUILD_PATH=./build/ diff --git a/src/browser_emu.py b/src/browser_emu.py index 3083a1c..2438930 100644 --- a/src/browser_emu.py +++ b/src/browser_emu.py @@ -110,7 +110,7 @@ class MozillaEmulator(object): @return: The raw HTML page data, unless fd was specified. When fd was given, the return value is undefined. """ - warnings.warn("Performing download of %s" % url, UserWarning, 2) + # warnings.warn("Performing download of %s" % url, UserWarning, 2) if extraheaders is None: extraheaders = {} diff --git a/src/file_backend.py b/src/file_backend.py index 2aa77a2..0476ef0 100644 --- a/src/file_backend.py +++ b/src/file_backend.py @@ -91,11 +91,11 @@ class FilesystemAddressBookFactory(object): """ @returns Iterable of (Address Book Factory, Book Id, Book Name) """ - for root, dirs, files in os.walk(self.__path): - for file in files: - name, ext = file.rsplit(".", 1) + for root, dirs, filenames in os.walk(self.__path): + for filename in filenames: + name, ext = filename.rsplit(".", 1) if ext in self.FILETYPE_SUPPORT: - yield self, os.path.join(root, file), name + yield self, os.path.join(root, filename), name def open_addressbook(self, bookId): name, ext = bookId.rsplit(".", 1) @@ -105,19 +105,3 @@ class FilesystemAddressBookFactory(object): @staticmethod def factory_name(): return "File" - - -def print_books(): - """ - Included here for debugging. - - Either insert it into the code or launch python with the "-i" flag - """ - eab = FilesystemAddressBookFactory(os.path.expanduser("~/Desktop")) - for book in eab.get_addressbooks(): - eab = eab.open_addressbook(book[1]) - print book - for contact in eab.get_contacts(): - print "\t", contact - for details in eab.get_contact_details(contact[0]): - print "\t\t", details diff --git a/src/gc_backend.py b/src/gc_backend.py index 50f2ece..0df3dec 100644 --- a/src/gc_backend.py +++ b/src/gc_backend.py @@ -139,7 +139,7 @@ class GCDialer(object): # No point if we don't have the magic cookie if not self.is_authed(): - raise RunetimeError("Not Authenticated") + raise RuntimeError("Not Authenticated") # Strip leading 1 from 11 digit dialing if len(number) == 11 and number[0] == 1: @@ -153,7 +153,7 @@ class GCDialer(object): ) except urllib2.URLError, e: warnings.warn("%s is not accesible" % GCDialer._clicktocallURL, UserWarning, 2) - raise RunetimeError("%s is not accesible" % GCDialer._clicktocallURL) + raise RuntimeError("%s is not accesible" % GCDialer._clicktocallURL) if GCDialer._gcDialingStrRe.search(callSuccessPage) is None: raise RuntimeError("Grand Central returned an error") diff --git a/src/gc_dialer.py b/src/gc_dialer.py index 45fab6e..440f038 100755 --- a/src/gc_dialer.py +++ b/src/gc_dialer.py @@ -53,6 +53,8 @@ class Dialcentral(object): _data_path = os.path.join(os.path.expanduser("~"), ".dialcentral") def __init__(self): + self._connection = None + self._osso = None self._gcBackend = None self._clipboard = gtk.clipboard_get() @@ -77,16 +79,16 @@ class Dialcentral(object): global hildon self._app = None self._isFullScreen = False - if hildon is not None and self._window is gtk.Window: - warnings.warn("Hildon installed but glade file not updated to work with hildon", UserWarning, 2) - hildon = None - elif hildon is not None: + if hildon is not None: self._app = hildon.Program() self._window = hildon.Window() self._widgetTree.get_widget("vbox1").reparent(self._window) self._app.add_window(self._window) self._widgetTree.get_widget("usernameentry").set_property('hildon-input-mode', 7) self._widgetTree.get_widget("passwordentry").set_property('hildon-input-mode', 7|(1 << 29)) + self._widgetTree.get_widget("callbackcombo").get_child().set_property('hildon-input-mode', (1 << 4)) + hildon.hildon_helper_set_thumb_scrollbar(self._widgetTree.get_widget('recent_scrolledwindow'), True) + hildon.hildon_helper_set_thumb_scrollbar(self._widgetTree.get_widget('contacts_scrolledwindow'), True) gtkMenu = self._widgetTree.get_widget("dialpad_menubar") menu = gtk.Menu() @@ -98,7 +100,7 @@ class Dialcentral(object): self._window.connect("key-press-event", self._on_key_press) self._window.connect("window-state-event", self._on_window_state_change) else: - warnings.warn("No Hildon", UserWarning, 2) + pass # warnings.warn("No Hildon", UserWarning, 2) if hildon is not None: self._window.set_title("Keypad") @@ -134,7 +136,7 @@ class Dialcentral(object): device = osso.DeviceState(self._osso) device.set_device_state_callback(self._on_device_state_change, 0) else: - warnings.warn("No OSSO", UserWarning, 2) + pass # warnings.warn("No OSSO", UserWarning) try: import conic @@ -146,7 +148,7 @@ class Dialcentral(object): self._connection.connect("connection-event", self._on_connection_change, Dialcentral.__app_magic__) self._connection.request_connection(conic.CONNECT_FLAG_NONE) else: - warnings.warn("No Internet Connectivity API ", UserWarning, 2) + pass # warnings.warn("No Internet Connectivity API ", UserWarning) import gc_backend import file_backend @@ -198,7 +200,10 @@ class Dialcentral(object): self._contactsView.open_addressbook(*self._contactsView.get_addressbooks().next()[0][0:2]) gtk.gdk.threads_enter() try: - self._contactsView._init_books_combo() + self._dialpad.enable() + self._accountView.enable() + self._recentView.enable() + self._contactsView.enable() finally: gtk.gdk.threads_leave() diff --git a/src/gc_views.py b/src/gc_views.py index 1846da8..a407a45 100644 --- a/src/gc_views.py +++ b/src/gc_views.py @@ -24,11 +24,6 @@ import warnings import gobject import gtk -try: - import hildon -except ImportError: - hildon = None - def make_ugly(prettynumber): """ @@ -363,6 +358,7 @@ class Dialpad(object): def __init__(self, widgetTree): self._numberdisplay = widgetTree.get_widget("numberdisplay") + self._dialButton = widgetTree.get_widget("dial") self._phonenumber = "" self._prettynumber = "" self._clearall_id = None @@ -376,16 +372,17 @@ class Dialpad(object): "on_back_released": self._on_back_released, } widgetTree.signal_autoconnect(callbackMapping) - widgetTree.get_widget("dial").grab_default() - widgetTree.get_widget("dial").grab_focus() def enable(self): - pass + self._dialButton.grab_focus() def disable(self): pass def dial(self, number): + """ + @note Actual dial function is patched in later + """ raise NotImplementedError def get_number(self): @@ -435,21 +432,18 @@ class AccountInfo(object): self._callbackList = gtk.ListStore(gobject.TYPE_STRING) self._accountViewNumberDisplay = widgetTree.get_widget("gcnumber_display") self._callbackCombo = widgetTree.get_widget("callbackcombo") - if hildon is not None: - self._callbackCombo.get_child().set_property('hildon-input-mode', (1 << 4)) - - callbackMapping = { - } - widgetTree.signal_autoconnect(callbackMapping) - self._callbackCombo.get_child().connect("changed", self._on_callbackentry_changed) - - self.set_account_number("") def enable(self): - pass + assert self._backend.is_authed() + self.set_account_number("") + self._callbackList.clear() + self.update() + self._callbackCombo.get_child().connect("changed", self._on_callbackentry_changed) def disable(self): - pass + self._callbackCombo.get_child().disconnect("changed", self._on_callbackentry_changed) + self.clear() + self._callbackList.clear() def get_selected_callback_number(self): return make_ugly(self._callbackCombo.get_child().get_text()) @@ -498,23 +492,29 @@ class RecentCallsView(object): self._recentmodel = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING) self._recentview = widgetTree.get_widget("recentview") self._recentviewselection = None + textrenderer = gtk.CellRendererText() + self._recentviewColumn = gtk.TreeViewColumn("Calls", textrenderer, text=1) + self._recentviewColumn.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) - callbackMapping = { - "on_recentview_row_activated": self._on_recentview_row_activated, - } - widgetTree.signal_autoconnect(callbackMapping) + def enable(self): + assert self._backend.is_authed() + self._recentview.set_model(self._recentmodel) - self._init_recent_view() - if hildon is not None: - hildon.hildon_helper_set_thumb_scrollbar(widgetTree.get_widget('recent_scrolledwindow'), True) + self._recentview.append_column(self._recentviewColumn) + self._recentviewselection = self._recentview.get_selection() + self._recentviewselection.set_mode(gtk.SELECTION_SINGLE) - def enable(self): - pass + self._recentview.connect("row-activated", self._on_recentview_row_activated) def disable(self): - pass + self._recentview.disconnect("row-activated", self._on_recentview_row_activated) + self._recentview.remove_column(self._recentviewColumn) + self._recentview.set_model(None) def number_selected(self, number): + """ + @note Actual dial function is patched in later + """ raise NotImplementedError def update(self): @@ -528,19 +528,6 @@ class RecentCallsView(object): self._recenttime = 0.0 self._recentmodel.clear() - def _init_recent_view(self): - self._recentview.set_model(self._recentmodel) - textrenderer = gtk.CellRendererText() - - # Add the column to the treeview - column = gtk.TreeViewColumn("Calls", textrenderer, text=1) - column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) - - self._recentview.append_column(column) - - self._recentviewselection = self._recentview.get_selection() - self._recentviewselection.set_mode(gtk.SELECTION_SINGLE) - def _idly_populate_recentview(self): self._recenttime = time.time() self._recentmodel.clear() @@ -581,25 +568,65 @@ class ContactsView(object): self._contactsviewselection = None self._contactsview = widgetTree.get_widget("contactsview") + self._contactColumn = gtk.TreeViewColumn("Contact") + displayContactSource = True + if displayContactSource: + textrenderer = gtk.CellRendererText() + self._contactColumn.pack_start(textrenderer, expand=False) + self._contactColumn.add_attribute(textrenderer, 'text', 0) + textrenderer = gtk.CellRendererText() + self._contactColumn.pack_start(textrenderer, expand=True) + self._contactColumn.add_attribute(textrenderer, 'text', 1) + textrenderer = gtk.CellRendererText() + self._contactColumn.pack_start(textrenderer, expand=True) + self._contactColumn.add_attribute(textrenderer, 'text', 4) + self._contactColumn.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) + self._contactColumn.set_sort_column_id(1) + self._contactColumn.set_visible(True) + self._phoneTypeSelector = PhoneTypeSelector(widgetTree, self._backend) - callbackMapping = { - "on_contactsview_row_activated" : self._on_contactsview_row_activated, - "on_addressbook_combo_changed": self._on_addressbook_combo_changed, - } - widgetTree.signal_autoconnect(callbackMapping) - if hildon is not None: - hildon.hildon_helper_set_thumb_scrollbar(widgetTree.get_widget('contacts_scrolledwindow'), True) + def enable(self): + assert self._backend.is_authed() - self._init_contacts_view() + self._contactsview.set_model(self._contactsmodel) + self._contactsview.append_column(self._contactColumn) + self._contactsviewselection = self._contactsview.get_selection() + self._contactsviewselection.set_mode(gtk.SELECTION_SINGLE) - def enable(self): - pass + self._booksList.clear() + for (factoryId, bookId), (factoryName, bookName) in self.get_addressbooks(): + if factoryName and bookName: + entryName = "%s: %s" % (factoryName, bookName) + elif factoryName: + entryName = factoryName + elif bookName: + entryName = bookName + else: + entryName = "Bad name (%d)" % factoryId + row = (str(factoryId), bookId, entryName) + self._booksList.append(row) + + self._booksSelectionBox.set_model(self._booksList) + cell = gtk.CellRendererText() + self._booksSelectionBox.pack_start(cell, True) + self._booksSelectionBox.add_attribute(cell, 'text', 2) + self._booksSelectionBox.set_active(0) + + self._contactsview.connect("row-activated", self._on_contactsview_row_activated) + self._booksSelectionBox.connect("changed", self._on_addressbook_combo_changed) def disable(self): - pass + self._booksSelectionBox.set_model(None) + self._contactsview.set_model(None) + self._contactsview.remove_column(self._contactColumn) + self._contactsview.disconnect("row-activated", self._on_contactsview_row_activated) + self._booksSelectionBox.disconnect("changed", self._on_addressbook_combo_changed) def number_selected(self, number): + """ + @note Actual dial function is patched in later + """ raise NotImplementedError def get_addressbooks(self): @@ -639,55 +666,6 @@ class ContactsView(object): def extend(self, books): self._addressBookFactories.extend(books) - def _init_contacts_view(self): - self._contactsview.set_model(self._contactsmodel) - - # Add the column to the treeview - column = gtk.TreeViewColumn("Contact") - - #displayContactSource = False - displayContactSource = True - if displayContactSource: - textrenderer = gtk.CellRendererText() - column.pack_start(textrenderer, expand=False) - column.add_attribute(textrenderer, 'text', 0) - - textrenderer = gtk.CellRendererText() - column.pack_start(textrenderer, expand=True) - column.add_attribute(textrenderer, 'text', 1) - - textrenderer = gtk.CellRendererText() - column.pack_start(textrenderer, expand=True) - column.add_attribute(textrenderer, 'text', 4) - - column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) - column.set_sort_column_id(1) - column.set_visible(True) - self._contactsview.append_column(column) - - self._contactsviewselection = self._contactsview.get_selection() - self._contactsviewselection.set_mode(gtk.SELECTION_SINGLE) - - def _init_books_combo(self): - self._booksList.clear() - for (factoryId, bookId), (factoryName, bookName) in self.get_addressbooks(): - if factoryName and bookName: - entryName = "%s: %s" % (factoryName, bookName) - elif factoryName: - entryName = factoryName - elif bookName: - entryName = bookName - else: - entryName = "Bad name (%d)" % factoryId - row = (str(factoryId), bookId, entryName) - self._booksList.append(row) - - self._booksSelectionBox.set_model(self._booksList) - cell = gtk.CellRendererText() - self._booksSelectionBox.pack_start(cell, True) - self._booksSelectionBox.add_attribute(cell, 'text', 2) - self._booksSelectionBox.set_active(0) - def _idly_populate_contactsview(self): #@todo Add a lock so only one code path can be in here at a time self.clear() diff --git a/src/null_views.py b/src/null_views.py new file mode 100644 index 0000000..15474c8 --- /dev/null +++ b/src/null_views.py @@ -0,0 +1,72 @@ +#!/usr/bin/python2.5 + +# DialCentral - Front end for Google's Grand Central service. +# Copyright (C) 2008 Mark Bergman bergman AT merctech DOT com +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +import gobject +import gtk + + +class Dialpad(object): + + def __init__(self, widgetTree): + self._numberdisplay = widgetTree.get_widget("numberdisplay") + self._dialButton = widgetTree.get_widget("dial") + + def enable(self): + self._dialButton.set_sensitive(False) + + def disable(self): + self._dialButton.set_sensitive(True) + + +class AccountInfo(object): + + def __init__(self, widgetTree): + self._callbackList = gtk.ListStore(gobject.TYPE_STRING) + self._accountViewNumberDisplay = widgetTree.get_widget("gcnumber_display") + self._callbackCombo = widgetTree.get_widget("callbackcombo") + + def enable(self): + self._callbackCombo.set_sensitive(False) + + def disable(self): + self._callbackCombo.set_sensitive(True) + + +class RecentCallsView(object): + + def __init__(self, widgetTree): + pass + + def enable(self): + pass + + def disable(self): + pass + + +class ContactsView(object): + + def __init__(self, widgetTree): + self._booksSelectionBox = widgetTree.get_widget("addressbook_combo") + + def enable(self): + self._booksSelectionBox.set_sensitive(False) + + def disable(self): + self._booksSelectionBox.set_sensitive(True) diff --git a/support/pylint.rc b/support/pylint.rc index cad484c..404f6dc 100644 --- a/support/pylint.rc +++ b/support/pylint.rc @@ -53,16 +53,16 @@ load-plugins= #enable-msg= # Disable the message(s) with the given id(s). -disable-msg=W0403,W0612,W0613,C0103,C0111,C0301 +disable-msg=W0403,W0612,W0613,C0103,C0111,C0301,R0903,W0142,W0603,R0904 [REPORTS] # set the output format. Available formats are text, parseable, colorized, msvs # (visual studio) and html -output-format=text +output-format=colorized # Include message's id in output -include-ids=no +include-ids=yes # Put messages in a separate file for each module / package specified on the # command line instead of printing them on stdout. Reports (if any) will be @@ -70,7 +70,7 @@ include-ids=no files-output=no # Tells wether to display a full report or only the messages -reports=yes +reports=no # Python expression which should return a note less than 10 (10 is the highest # note).You have access to the variables errors warning, statement which -- 1.7.9.5