From a2287864765358aa8a63ed06508663588d5eae07 Mon Sep 17 00:00:00 2001 From: Stas Shtin Date: Fri, 9 Apr 2010 16:10:32 +0400 Subject: [PATCH 1/1] Added base controller class and implementation for connections tab --- src/ipypbx/controllers.py | 126 +++++++++++++++++++++++++++++++++++---------- src/ipypbx/main.py | 47 +---------------- src/ipypbx/models.py | 2 + src/ipypbx/sql.py | 1 + src/ipypbx/ui.py | 15 ++++-- 5 files changed, 115 insertions(+), 76 deletions(-) diff --git a/src/ipypbx/controllers.py b/src/ipypbx/controllers.py index 2bb3169..873d98d 100644 --- a/src/ipypbx/controllers.py +++ b/src/ipypbx/controllers.py @@ -16,44 +16,120 @@ # along with IPyPBX. If not, see . #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}]' diff --git a/src/ipypbx/main.py b/src/ipypbx/main.py index 72d1de0..d1d7bb5 100644 --- a/src/ipypbx/main.py +++ b/src/ipypbx/main.py @@ -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() diff --git a/src/ipypbx/models.py b/src/ipypbx/models.py index 229c9f6..68f9a5b 100644 --- a/src/ipypbx/models.py +++ b/src/ipypbx/models.py @@ -16,6 +16,8 @@ # along with IPyPBX. If not, see . +# THIS FILE WILL BE DELETED SOON + from axiom.item import Item from axiom.attributes import boolean, integer, reference, text diff --git a/src/ipypbx/sql.py b/src/ipypbx/sql.py index ed0bf8b..a467d16 100644 --- a/src/ipypbx/sql.py +++ b/src/ipypbx/sql.py @@ -17,3 +17,4 @@ creation_queries = ( class Connection(object): id, name, local_ip_address, local_port, freeswitch_ip_address, \ freeswitch_port = range(6) + diff --git a/src/ipypbx/ui.py b/src/ipypbx/ui.py index c13d6f5..77c9480 100644 --- a/src/ipypbx/ui.py +++ b/src/ipypbx/ui.py @@ -17,6 +17,13 @@ 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)) -- 1.7.9.5