Added base controller class and implementation for connections tab
authorStas Shtin <antisvin@gmail.com>
Fri, 9 Apr 2010 12:10:32 +0000 (16:10 +0400)
committerStas Shtin <antisvin@gmail.com>
Fri, 9 Apr 2010 12:10:32 +0000 (16:10 +0400)
src/ipypbx/controllers.py
src/ipypbx/main.py
src/ipypbx/models.py
src/ipypbx/sql.py
src/ipypbx/ui.py

index 2bb3169..873d98d 100644 (file)
 # along with IPyPBX.  If not, see <http://www.gnu.org/licenses/>.
 
 #from ipypbx import models
-from PyQt4 import QtCore
+from PyQt4 import QtCore, QtGui, QtSql
 
 
-class BaseHandler(object):
+class BaseController(QtCore.QObject):
     """
-    Base class for various entity handlers.
+    Base class for other controllers.
 
     Doesn't do anything useful on its own.
     """
-    items = None
-    current_items = None
+    fields = ()
+    hidden_fields = ()
+    visible_fields = ()
+    
+    def __init__(self, model=None, view_list=None, view_display=None, parent=None):
+        super(BaseController, self).__init__(parent)
+        
+        # Find out base name.
+        classname = self.__class__.__name__
+        self.base_name = (
+            classname[:-10] if classname.endswith('Controller')
+            else classname)
+        self.base_name = self.base_name[0].lower() + self.base_name[1:]
+
+        if model:
+            # We're given an existing model.
+            self.model = model
+        else:
+            # Initialize a new model.
+            self.model = QtSql.QSqlTableModel(parent)
+            self.model.setTable(self.base_name + 's')
+
+            # Create model header from fields list.
+            for i, field in enumerate(self.fields):
+                self.model.setHeaderData(
+                    i, QtCore.Qt.Horizontal, QtCore.QVariant(field))
+
+            # Fetch model data.
+            self.model.select()
+
+        if view_list:
+            # We're given an existing view list.
+            self.view_list = view_list
+        else:
+            # Get view list from the parent.
+            self.view_list = getattr(parent, self.base_name + 'ViewList')
+            self.view_list.setModel(self.model)
+
+            # Hide fields not meant for display.
+            for i, field in enumerate(self.fields):
+                if (field in self.hidden_fields or
+                    field not in self.visible_fields):
+                    self.view_list.setColumnHidden(i, True)
+
+            # Stretch headers to fill all available width.
+            self.view_list.setSelectionMode(QtGui.QTableView.SingleSelection)
+            self.view_list.setSelectionBehavior(QtGui.QTableView.SelectRows)
+            self.view_list.resizeColumnsToContents()
+            self.view_list.resizeRowsToContents()
+            self.view_list.horizontalHeader().setStretchLastSection(True)
+
+        if view_display:
+            # We're given an existing view display.
+            self.view_display = view_display
+        else:
+            # Get view display from the parent.
+            self.view_display = getattr(parent, self.base_name + 'ViewDisplay')
+            self.view_display.setModel(self.model)
+
+        # Register signals for this controller.
+        for sender, signal, receiver in self.getSignalsData():
+            QtCore.QObject.connect(sender, QtCore.SIGNAL(signal), receiver)        
+
+    def getSignalsData(self):
+        """
+        Default signals built from controller's base name.
+        """
+        parent = self.parent()
+        
+        return (
+            (getattr(parent, self.base_name + 'Add'), 'clicked()', self.add),
+            (getattr(parent, self.base_name + 'ViewList'),
+             'currentRowChanged(int)', self.select),
+            (getattr(parent, self.base_name + 'Save'), 'clicked()',
+             self.save),
+            )
 
-    def __init__(self, parent):
-        self.parent = parent
-        self.initState()
+    def add(self):
+        """
+        TODO: Default implementation.
+        """
+        return NotImplemented
+    
+    def save(self):
+        """
+        TODO: Default implementation.
+        """
+        return NotImplemented
 
-    def initState(self):
+    def add(self):
+        """
+        TODO: Default implementation.
+        """
         return NotImplemented
 
 
-class ConnectionController(QtCore.QObject):
+class ConnectionController(BaseController):
     """
     Connections handler.
     """
-#    def initState(self):
-#        self.connections = []
-#        #self.connections = list(state.store.query(models.Connection))
-#        self.currentConnection = None
-
-#        for connection in self.connections:
-#            self.parent.ui.connectionList.addItem(connection.name)
-
-#        if self.connections:
-#            print self.parent.ui.connectionList.currentRow()
-#            self.parent.ui.connectionList.setCurrentRow(0)
-#            QtCore.QObject.emit(
-#                self.parent.ui.connectionList, QtCore.SIGNAL('currentRowChanged(int)'), 0)
-        
+    fields = (
+        'ID', 'Name', 'Local IP Address', 'Local Port',
+        'Freeswitch IP Address', 'Freeswitch Port')
+    visible_fields = ('Name', 'Freeswitch IP Address', 'Freeswitch Port')
+    
     def select(self, row):
         """
         Select another connection as current.
@@ -82,8 +158,6 @@ class ConnectionController(QtCore.QObject):
         """
         Add new connection.
         """
-        print '!'
-        print self.parent
         self.currentConnection = None
 
         name_template = 'New connection [{0:02}]'
index 72d1de0..d1d7bb5 100644 (file)
@@ -59,55 +59,10 @@ def setupDb(prefix=PREFIX, dbname=DB_NAME):
 if __name__ == '__main__':
     app = QtGui.QApplication(sys.argv)
     setupDb()
-#    import pdb; pdb.set_trace()
-#    runApp()
     views = ui.MainWindow()
     views.show()
 
-    connectionModel = QtSql.QSqlTableModel(views)
-    connectionModel.setTable('connections')
-    connectionModel.setHeaderData(
-        sql.Connection.id, QtCore.Qt.Horizontal,
-        QtCore.QVariant('Connection_ID'))
-    connectionModel.setHeaderData(
-        sql.Connection.name, QtCore.Qt.Horizontal,
-        QtCore.QVariant('Name'))
-    connectionModel.setHeaderData(
-        sql.Connection.local_ip_address, QtCore.Qt.Horizontal,
-        QtCore.QVariant('Local_IP_Address'))
-    connectionModel.setHeaderData(
-        sql.Connection.local_port, QtCore.Qt.Horizontal,
-        QtCore.QVariant('Local_Port'))
-    connectionModel.setHeaderData(
-        sql.Connection.freeswitch_ip_address, QtCore.Qt.Horizontal,
-        QtCore.QVariant('Freeswitch_IP_Address'))
-    connectionModel.setHeaderData(
-        sql.Connection.freeswitch_port, QtCore.Qt.Horizontal,
-        QtCore.QVariant('Freeswitch_Port'))
-    connectionModel.select()
-
-    views.connectionView.setModel(connectionModel)
-    views.connectionView.setColumnHidden(sql.Connection.id, True)
-    views.connectionView.setSelectionMode(QtGui.QTableView.SingleSelection)
-    views.connectionView.setSelectionBehavior(QtGui.QTableView.SelectRows)
-    views.connectionView.resizeColumnsToContents()
-    views.connectionView.resizeRowsToContents()
-    views.connectionView.horizontalHeader().setStretchLastSection(True)
-
-
-    views.connectionData.setModel(connectionModel)
-    connectionController = controllers.ConnectionController()
-
-    signals_data = (
-    #    (self.ui.connectionList, 'currentRowChanged(int)',
-    #     self.connections.select),
-    #    (self.ui.connectionClone, 'clicked()', self.connections.clone),
-    #    (self.ui.connectionSave, 'clicked()', self.connections.save),
-#        (views.connectionAdd, 'clicked()', connectionController.add),
-        )
-
-#    for sender, signal, receiver in signals_data:
-#        QtCore.QObject.connect(sender, QtCore.SIGNAL(signal), receiver)
+    connectionController = controllers.ConnectionController(parent=views)
 
     app.exec_()
 #    sys.exit()
index 229c9f6..68f9a5b 100644 (file)
@@ -16,6 +16,8 @@
 # along with IPyPBX.  If not, see <http://www.gnu.org/licenses/>.
 
 
+# THIS FILE WILL BE DELETED SOON
+
 from axiom.item import Item
 from axiom.attributes import boolean, integer, reference, text
 
index ed0bf8b..a467d16 100644 (file)
@@ -17,3 +17,4 @@ creation_queries = (
 class Connection(object):
     id, name, local_ip_address, local_port, freeswitch_ip_address, \
         freeswitch_port = range(6)
+        
index c13d6f5..77c9480 100644 (file)
 
 from PyQt4 import QtCore, QtGui, QtSql
 
+
+class ConnectionDataMapper(QtGui.QDataWidgetMapper):
+    def add(self):
+        model = self.model()
+        model.insertRows(1, model.rowCount())
+        
+        
 class MainWindow(QtGui.QMainWindow):
     """
     Main GUI window.
@@ -44,7 +51,7 @@ class MainWindow(QtGui.QMainWindow):
         self.layoutWidget.setObjectName("layoutWidget")
         self.gridLayout = QtGui.QGridLayout(self.layoutWidget)
         self.gridLayout.setObjectName("gridLayout")
-        self.connectionData = QtGui.QDataWidgetMapper()
+        self.connectionViewDisplay = ConnectionDataMapper()
         #self.formLayout_7 = QtGui.QFormLayout()
         #self.formLayout_7.setFieldGrowthPolicy(QtGui.QFormLayout.AllNonFixedFieldsGrow)
         #self.formLayout_7.setObjectName("formLayout_7")
@@ -87,9 +94,9 @@ class MainWindow(QtGui.QMainWindow):
         self.connectionSave = QtGui.QPushButton(self.layoutWidget)
         self.connectionSave.setObjectName("connectionSave")
         self.gridLayout.addWidget(self.connectionSave, 1, 1, 1, 1)
-        self.connectionView = QtGui.QTableView(self.layoutWidget)
-        self.connectionView.setObjectName("connectionView")
-        self.gridLayout.addWidget(self.connectionView, 0, 0, 1, 1)
+        self.connectionViewList = QtGui.QTableView(self.layoutWidget)
+        self.connectionViewList.setObjectName("connectionViewList")
+        self.gridLayout.addWidget(self.connectionViewList, 0, 0, 1, 1)
         self.tabWidget.addTab(self.connectionsTab, "")
         self.sipProfilesTab = QtGui.QWidget()
         self.sipProfilesTab.setMaximumSize(QtCore.QSize(796, 16777215))