class mainWidget(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.create_layout() self.update_buttons_state() self.connect_slots() def create_layout(self): self.facadeserver_button = QPushButton(self) self.elindevices_button = QPushButton(self) self.devlist_edit = QPlainTextEdit(self) self.elindevices_button.setText("Get list of devices and 'current' attribute values") self.layout = QVBoxLayout(self) self.layout.addWidget(self.facadeserver_button, 0) self.layout.addWidget(self.elindevices_button, 1) self.layout.addWidget(self.devlist_edit, 2) def update_buttons_state(self): self.facadeController = FacadeDeviceServerController() if self.facadeController.server_exists(): self.facadeserver_button.setText("Update Facadedevice Server") self.elindevices_button.setEnabled(True) else: self.facadeserver_button.setText("Create Facadedevice Server") self.elindevices_button.setEnabled(False) def connect_slots(self): self.connect(self.facadeserver_button, QtCore.SIGNAL("clicked()"), self.create_server) self.connect(self.elindevices_button, QtCore.SIGNAL("clicked()"), self.get_devs_and_attr_list) def create_server(self): print("Creating/Updating Facadedevice server...") self.facadeController.create_server() self.update_buttons_state() print("...done") def get_devs_and_attr_list(self): facades = self.facadeController.get_facadedevice_names() devs_and_attrs = CurrentAttributeHelper.get_devs_and_attributes(facades) self.devlist_edit.clear() self.devlist_edit.setPlainText(devs_and_attrs)
class DebugLogWidget(QWidget): def __init__(self, parent): QWidget.__init__(self, parent) self.canMonitor = parent def addToWidget(self, vbox): self.text = QPlainTextEdit(self.canMonitor) self.text.setReadOnly(True) vbox.addWidget(self.text) hbox = QHBoxLayout() hbox.setAlignment(Qt.AlignRight | Qt.AlignBottom) self.clearButton = QPushButton("Clear", self.canMonitor) self.clearButton.clicked.connect(self._clearText) hbox.addWidget(self.clearButton) vbox.addLayout(hbox) @pyqtSlot() def _clearText(self): self.text.clear() def addLineToLog(self, line): self.text.appendPlainText(line)
class Ui_ProjectorEditForm(object): """ The :class:`~openlp.core.lib.ui.projector.editform.Ui_ProjectorEditForm` class defines the user interface for the ProjectorEditForm dialog. """ def setupUi(self, edit_projector_dialog): """ Create the interface layout. """ edit_projector_dialog.setObjectName('edit_projector_dialog') edit_projector_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo-32x32.png')) edit_projector_dialog.setMinimumWidth(400) edit_projector_dialog.setModal(True) # Define the basic layout self.dialog_layout = QGridLayout(edit_projector_dialog) self.dialog_layout.setObjectName('dialog_layout') self.dialog_layout.setSpacing(8) self.dialog_layout.setContentsMargins(8, 8, 8, 8) # IP Address self.ip_label = QLabel(edit_projector_dialog) self.ip_label.setObjectName('projector_edit_ip_label') self.ip_text = QLineEdit(edit_projector_dialog) self.ip_text.setObjectName('projector_edit_ip_text') self.dialog_layout.addWidget(self.ip_label, 0, 0) self.dialog_layout.addWidget(self.ip_text, 0, 1) # Port number self.port_label = QLabel(edit_projector_dialog) self.port_label.setObjectName('projector_edit_ip_label') self.port_text = QLineEdit(edit_projector_dialog) self.port_text.setObjectName('projector_edit_port_text') self.dialog_layout.addWidget(self.port_label, 1, 0) self.dialog_layout.addWidget(self.port_text, 1, 1) # PIN self.pin_label = QLabel(edit_projector_dialog) self.pin_label.setObjectName('projector_edit_pin_label') self.pin_text = QLineEdit(edit_projector_dialog) self.pin_label.setObjectName('projector_edit_pin_text') self.dialog_layout.addWidget(self.pin_label, 2, 0) self.dialog_layout.addWidget(self.pin_text, 2, 1) # Name self.name_label = QLabel(edit_projector_dialog) self.name_label.setObjectName('projector_edit_name_label') self.name_text = QLineEdit(edit_projector_dialog) self.name_text.setObjectName('projector_edit_name_text') self.dialog_layout.addWidget(self.name_label, 3, 0) self.dialog_layout.addWidget(self.name_text, 3, 1) # Location self.location_label = QLabel(edit_projector_dialog) self.location_label.setObjectName('projector_edit_location_label') self.location_text = QLineEdit(edit_projector_dialog) self.location_text.setObjectName('projector_edit_location_text') self.dialog_layout.addWidget(self.location_label, 4, 0) self.dialog_layout.addWidget(self.location_text, 4, 1) # Notes self.notes_label = QLabel(edit_projector_dialog) self.notes_label.setObjectName('projector_edit_notes_label') self.notes_text = QPlainTextEdit(edit_projector_dialog) self.notes_text.setObjectName('projector_edit_notes_text') self.dialog_layout.addWidget(self.notes_label, 5, 0, alignment=QtCore.Qt.AlignTop) self.dialog_layout.addWidget(self.notes_text, 5, 1) # Time for the buttons self.button_box = QDialogButtonBox(QDialogButtonBox.Help | QDialogButtonBox.Save | QDialogButtonBox.Cancel) self.dialog_layout.addWidget(self.button_box, 8, 0, 1, 2) def retranslateUi(self, edit_projector_dialog): if self.new_projector: title = translate('OpenLP.ProjectorEditForm', 'Add New Projector') self.projector.port = PJLINK_PORT else: title = translate('OpenLP.ProjectorEditForm', 'Edit Projector') edit_projector_dialog.setWindowTitle(title) self.ip_label.setText(translate('OpenLP.ProjectorEditForm', 'IP Address')) self.ip_text.setText(self.projector.ip) self.ip_text.setFocus() self.port_label.setText(translate('OpenLP.ProjectorEditForm', 'Port Number')) self.port_text.setText(str(self.projector.port)) self.pin_label.setText(translate('OpenLP.ProjectorEditForm', 'PIN')) self.pin_text.setText(self.projector.pin) self.name_label.setText(translate('OpenLP.ProjectorEditForm', 'Name')) self.name_text.setText(self.projector.name) self.location_label.setText(translate('OpenLP.ProjectorEditForm', 'Location')) self.location_text.setText(self.projector.location) self.notes_label.setText(translate('OpenLP.ProjectorEditForm', 'Notes')) self.notes_text.clear() self.notes_text.insertPlainText(self.projector.notes)
class OWSparkDataFrame(SharedSparkContext, OWWidget): priority = 2 allSQLSelectWidgets = [] lastQuery = Setting('') name = "Data Frame" description = "Create a Spark Dataframe from an SparkSQL source" icon = "../icons/sql.png" outputs = [("DataFrame", pyspark.sql.DataFrame, widget.Dynamic)] out_df = None def __init__(self): super().__init__() gui.label(self.controlArea, self, "Spark DataFrame") self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) self.allSQLSelectWidgets.append(self) # set default settings self.domain = None self.queryFile = None self.query = '' if self.lastQuery is not None: self.query = self.lastQuery # query self.splitCanvas = QSplitter(QtCore.Qt.Vertical, self.mainArea) self.mainArea.layout().addWidget(self.splitCanvas) self.textBox = gui.widgetBox(self, 'SparkSQL') self.splitCanvas.addWidget(self.textBox) self.queryTextEdit = QPlainTextEdit(self.query, self) self.textBox.layout().addWidget(self.queryTextEdit) self.selectBox = gui.widgetBox(self.controlArea, "Select statement") self.selectBox.setSizePolicy( QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding)) gui.button(self.selectBox, self, 'format SQL!', callback=self.format_sql, disabled=0) gui.button(self.selectBox, self, 'execute!', callback=self.executeQuery, disabled=0) # info self.infoBox = gui.widgetBox(self.controlArea, "Info") self.info = [] self.info.append(gui.label(self.infoBox, self, 'No data loaded.')) self.info.append(gui.label(self.infoBox, self, '')) self.resize(300, 300) def destroy(self, destroyWindow, destroySubWindows): self.allSQLSelectWidgets.remove(self) self.destroy(self, destroyWindow, destroySubWindows) def activateLoadedSettings(self): self.query = self.lastQuery def setInfo(self, info): pass # for (i, s) in enumerate(info): # self.info[i].setText(s) def setMeta(self): pass # domain = self.data.domain # s = "Attrs:\n " + "\n ".join([str(i) for i in domain.attributes]) + "\n" + "Class:" + str(domain.classVar) # self.domainLabel.setText(s) # for i in domain.getmetas(): # self.propertyCheckBoxes[i].set() # Execute a query, create data from it and send it over the data channel def executeQuery(self): if not self.sc or not self.hc: return query = self.queryTextEdit.toPlainText() if query is None: return None self.out_df = self.hc.sql(query) self.lastQuery = query self.send("DataFrame", self.out_df) def format_sql(self): query = str(self.queryTextEdit.toPlainText()) str_sql = str(format_sql(query)) self.queryTextEdit.clear() self.queryTextEdit.insertPlainText(str_sql)
class OWSparkDataFrame(SharedSparkContext, OWWidget): priority = 2 allSQLSelectWidgets = [] settingsList = ["lastQuery"] name = "DataFrame" description = "Create a Spark Dataframe from an SparkSQL source" icon = "../icons/sql.png" outputs = [("DataFrame", pyspark.sql.DataFrame, widget.Dynamic)] out_df = None settingsHandler = settings.DomainContextHandler() def __init__(self): super().__init__() gui.label(self.controlArea, self, "Spark DataFrame") self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) self.allSQLSelectWidgets.append(self) # set default settings self.domain = None self.queryFile = None self.query = '' self.lastQuery = None # self.loadSettings() if self.lastQuery is not None: self.query = self.lastQuery # query self.splitCanvas = QSplitter(QtCore.Qt.Vertical, self.mainArea) self.mainArea.layout().addWidget(self.splitCanvas) self.textBox = gui.widgetBox(self, 'SparkSQL') self.splitCanvas.addWidget(self.textBox) self.queryTextEdit = QPlainTextEdit(self.query, self) self.textBox.layout().addWidget(self.queryTextEdit) self.selectBox = gui.widgetBox(self.controlArea, "Select statement") self.selectBox.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding)) gui.button(self.selectBox, self, 'format SQL!', callback = self.format_sql, disabled = 0) gui.button(self.selectBox, self, 'execute!', callback = self.executeQuery, disabled = 0) # info self.infoBox = gui.widgetBox(self.controlArea, "Info") self.info = [] self.info.append(gui.label(self.infoBox, self, 'No data loaded.')) self.info.append(gui.label(self.infoBox, self, '')) self.resize(300, 300) def destroy(self, destroyWindow, destroySubWindows): self.allSQLSelectWidgets.remove(self) self.destroy(self, destroyWindow, destroySubWindows) def activateLoadedSettings(self): self.query = self.lastQuery def setInfo(self, info): pass # for (i, s) in enumerate(info): # self.info[i].setText(s) def setMeta(self): pass # domain = self.data.domain # s = "Attrs:\n " + "\n ".join([str(i) for i in domain.attributes]) + "\n" + "Class:" + str(domain.classVar) # self.domainLabel.setText(s) # for i in domain.getmetas(): # self.propertyCheckBoxes[i].set() # Execute a query, create data from it and send it over the data channel def executeQuery(self): if not self.sc or not self.hc: return query = self.queryTextEdit.toPlainText() if query is None: return None self.out_df = self.hc.sql(query) self.send("DataFrame", self.out_df) self.lastQuery = query def format_sql(self): query = str(self.queryTextEdit.toPlainText()) str_sql = str(format_sql(query)) self.queryTextEdit.clear() self.queryTextEdit.insertPlainText(str_sql)
class BluetoothWindow(QMainWindow): def __init__(self, inbuf, outbuf,parent=None): super(BluetoothWindow, self).__init__(parent) self.sendbuf=outbuf self.receivebuf=inbuf self.output=QPlainTextEdit() self.output.setReadOnly(True) self.output.setLineWrapMode(QPlainTextEdit.WidgetWidth) self.hor = QHBoxLayout() self.ver = QVBoxLayout() def updateValue(key, value): pidvalues[key] = float(value) print key, "updated to", value for k, v in pidvalues.iteritems(): label = QLabel(k) edit = QLineEdit(str(v)) button = QPushButton("Update") l = QHBoxLayout() l.addWidget(label, 2) l.addWidget(edit, 5) l.addWidget(button, 2) self.ver.addLayout(l) button.clicked.connect(lambda clicked, label=label, edit=edit: updateValue(label.text(), edit.text())) self.hor.addWidget(self.output) self.hor.addLayout(self.ver) w = QWidget() w.setLayout(self.hor) self.setCentralWidget(w) SampleTimeInSec = (pidvalues["PID_SAMPLE_TIME"]) / 1000.0 for i in range(4): pid_params.append(pid_params_typedef()) pid_params[pidvalues["PID_THROTTLE"]].kp = pidvalues["KP_THROTTLE"]; pid_params[pidvalues["PID_THROTTLE"]].ki = pidvalues["KI_THROTTLE"] * SampleTimeInSec; pid_params[pidvalues["PID_THROTTLE"]].kd = pidvalues["KD_THROTTLE"] / SampleTimeInSec; pid_params[pidvalues["PID_THROTTLE"]].min = pidvalues["MIN_THROTTLE"]; pid_params[pidvalues["PID_THROTTLE"]].max = pidvalues["MAX_THROTTLE"]; pid_params[pidvalues["PID_PITCH"]].kp = pidvalues["KP_PITCH"]; pid_params[pidvalues["PID_PITCH"]].ki = pidvalues["KI_PITCH"] * SampleTimeInSec; pid_params[pidvalues["PID_PITCH"]].kd = pidvalues["KD_PITCH"] / SampleTimeInSec; pid_params[pidvalues["PID_PITCH"]].min = pidvalues["MIN_PITCH"]; pid_params[pidvalues["PID_PITCH"]].max = pidvalues["MAX_PITCH"]; pid_params[pidvalues["PID_ROLL"]].kp = pidvalues["KP_ROLL"]; pid_params[pidvalues["PID_ROLL"]].ki = pidvalues["KI_ROLL"] * SampleTimeInSec; pid_params[pidvalues["PID_ROLL"]].kd = pidvalues["KD_ROLL"] / SampleTimeInSec; pid_params[pidvalues["PID_ROLL"]].min = pidvalues["MIN_ROLL"]; pid_params[pidvalues["PID_ROLL"]].max = pidvalues["MAX_ROLL"]; pid_params[pidvalues["PID_YAW"]].kp = pidvalues["KP_YAW"]; pid_params[pidvalues["PID_YAW"]].ki = pidvalues["KI_YAW"] * SampleTimeInSec; pid_params[pidvalues["PID_YAW"]].kd = pidvalues["KD_YAW"] / SampleTimeInSec; pid_params[pidvalues["PID_YAW"]].min = pidvalues["MIN_YAW"]; pid_params[pidvalues["PID_YAW"]].max = pidvalues["MAX_YAW"]; for i in pid_params: print i def receiveText(self): # | 2-5 | Roll | [-pi, pi] | # | 6-9 | Pitch | [-pi, pi] | # | 10-13 | Yaw | [-pi, pi] | # | 14-17 | Height | [0, 10m] | # | 18-21 | Battery | [0, 100%] | rolldata="" pitchdata="" yawdata="" heightdata="" batterydata="" for i in range(4): rolldata+=self.receivebuf.pop(0) for i in range(4): pitchdata+=self.receivebuf.pop(0) for i in range(4): yawdata+=self.receivebuf.pop(0) for i in range(4): heightdata+=self.receivebuf.pop(0) for i in range(4): batterydata+=self.receivebuf.pop(0) roll=struct.unpack('f', rolldata) pitch=struct.unpack('f', pitchdata) yaw=struct.unpack('f', yawdata) self.output.appendPlainText("p "+str(pitch[0])+", r "+str(roll[0])+", y "+str(yaw[0])) ## pids data.pitch = pitch[0] data.roll = roll[0] data.yaw = yaw[0] global lastThrottle pid_output.throttle = self.pid_compute(pidvalues["PID_THROTTLE"], lastThrottle, command.throttle); pid_output.pitch = self.pid_compute(pidvalues["PID_PITCH"], data.pitch, command.pitch); pid_output.roll = self.pid_compute(pidvalues["PID_ROLL"], data.roll, command.roll); pid_output.yaw = self.pid_compute(pidvalues["PID_YAW"], data.yaw, command.yaw); #Save last throttle value lastThrottle = pid_output.throttle * 2 * ( pidvalues["MAX_THROTTLE"] / MOTOR_SPEED_MAX) - pidvalues["MIN_THROTTLE"]; #Add offset to throttle pid_output.throttle += MOTOR_SPEED_HALF; self.motors_pid_apply() ## update gui self.repaint() def motor_name(self, motor): if (motor == MOTOR_RIGHT_BACK): return "RIGHT__BACK" elif (motor == MOTOR_LEFT_BACK): return "LEFT___BACK" elif (motor == MOTOR_RIGHT_FRONT): return "RIGHT_FRONT" elif (motor == MOTOR_LEFT_FRONT): return "LEFT__FRONT" else: return "UNKNOWN" def motors_set_speed(self, motor, value): self.output.appendPlainText("motor "+str(self.motor_name(motor))+", value "+str(int(value))) def motors_pid_apply(self): self.motors_set_speed(MOTOR_RIGHT_FRONT, pid_output.throttle - pid_output.pitch - pid_output.roll - pid_output.yaw); self.motors_set_speed(MOTOR_LEFT_FRONT, pid_output.throttle - pid_output.pitch + pid_output.roll + pid_output.yaw); self.motors_set_speed(MOTOR_RIGHT_BACK, pid_output.throttle + pid_output.pitch - pid_output.roll + pid_output.yaw); self.motors_set_speed(MOTOR_LEFT_BACK, pid_output.throttle + pid_output.pitch + pid_output.roll - pid_output.yaw); def pid_compute(self, index, input, setpoint): pid = pid_params[index] retVal = 0 #Compute all the working error variables*/ error = setpoint - input; pid.iterm += pid.ki * error; if (pid.iterm > pid.max) : pid.iterm = pid.max; else: if (pid.iterm < pid.min): pid.iterm = pid.min; dInput = (input - pid.lastInput); #Compute PID Output*/ retVal = (pid.kp * error + pid.iterm - pid.kd * dInput); if (retVal > pid.max): retVal = pid.max; else: if (retVal < pid.min): retVal = pid.min; #Remember some variables for next time*/ pid.lastInput = input; pid_params[index] = pid return retVal def reset(self): self.output.clear()
class LogViewer( QWidget ): """ The log (+stdout, +stderr) viewer widget """ def __init__( self, parent = None ): QWidget.__init__( self, parent ) self.__isEmpty = True self.__copyAvailable = False self.clearButton = None self.messages = None self.copyButton = None self.selectAllButton = None self.__createLayout( parent ) # create the context menu self.__menu = QMenu( self ) self.__selectAllMenuItem = self.__menu.addAction( PixmapCache().getIcon( 'selectall.png' ), 'Select All', self.messages.selectAll ) self.__copyMenuItem = self.__menu.addAction( PixmapCache().getIcon( 'copytoclipboard.png' ), 'Copy', self.messages.copy ) self.__menu.addSeparator() self.__clearMenuItem = self.__menu.addAction( PixmapCache().getIcon( 'trash.png' ), 'Clear', self.__clear ) self.messages.setContextMenuPolicy( Qt.CustomContextMenu ) self.messages.customContextMenuRequested.connect( self.__handleShowContextMenu ) self.messages.copyAvailable.connect( self.__onCopyAvailable ) self.cNormalFormat = self.messages.currentCharFormat() self.cErrorFormat = self.messages.currentCharFormat() self.cErrorFormat.setForeground( QBrush( QColor( Qt.red ) ) ) self.__updateToolbarButtons() return def __createLayout( self, parent ): " Helper to create the viewer layout " # Messages list area self.messages = QPlainTextEdit( parent ) self.messages.setLineWrapMode( QPlainTextEdit.NoWrap ) self.messages.setFont( QFont( GlobalData().skin.baseMonoFontFace ) ) self.messages.setReadOnly( True ) self.messages.setMaximumBlockCount( MAX_LINES ) # Default font size is good enough for most of the systems. # 12.0 might be good only in case of the XServer on PC (Xming). # self.messages.setFontPointSize( 12.0 ) # Buttons self.selectAllButton = QAction( PixmapCache().getIcon( 'selectall.png' ), 'Select all', self ) self.selectAllButton.triggered.connect( self.messages.selectAll ) self.copyButton = QAction( PixmapCache().getIcon( 'copytoclipboard.png' ), 'Copy to clipboard', self ) self.copyButton.triggered.connect( self.messages.copy ) spacer = QWidget() spacer.setSizePolicy( QSizePolicy.Expanding, QSizePolicy.Expanding ) self.clearButton = QAction( PixmapCache().getIcon( 'trash.png' ), 'Clear all', self ) self.clearButton.triggered.connect( self.__clear ) # Toolbar self.toolbar = QToolBar() self.toolbar.setOrientation( Qt.Vertical ) self.toolbar.setMovable( False ) self.toolbar.setAllowedAreas( Qt.LeftToolBarArea ) self.toolbar.setIconSize( QSize( 16, 16 ) ) self.toolbar.setFixedWidth( 28 ) self.toolbar.setContentsMargins( 0, 0, 0, 0 ) self.toolbar.addAction( self.selectAllButton ) self.toolbar.addAction( self.copyButton ) self.toolbar.addWidget( spacer ) self.toolbar.addAction( self.clearButton ) # layout layout = QHBoxLayout() layout.setContentsMargins( 0, 0, 0, 0 ) layout.setSpacing( 0 ) layout.addWidget( self.toolbar ) layout.addWidget( self.messages ) self.setLayout( layout ) return def __handleShowContextMenu( self, coord ): """ Show the context menu """ self.__selectAllMenuItem.setEnabled( not self.__isEmpty ) self.__copyMenuItem.setEnabled( self.__copyAvailable ) self.__clearMenuItem.setEnabled( not self.__isEmpty ) self.__menu.popup( QCursor.pos() ) return def __appendText( self, txt, isError ): " Append the text " if len( txt ) == 0: return self.__isEmpty = False cursor = self.messages.textCursor() cursor.movePosition( QTextCursor.End ) self.messages.setTextCursor( cursor ) if isError: self.messages.setCurrentCharFormat( self.cErrorFormat ) else: self.messages.setCurrentCharFormat( self.cNormalFormat ) self.messages.insertPlainText( txt ) self.messages.insertPlainText( '\n' ) self.messages.ensureCursorVisible() self.__updateToolbarButtons() return def appendMessage( self, txt ): " Append the regular message " self.__appendText( txt, False ) #QApplication.processEvents() return def appendError( self, txt ): " Append the error message " self.__appendText( txt, True ) #QApplication.processEvents() return def append( self, txt ): " Decides what the message is - error or not - and append it then " if txt.startswith( 'CRITICAL' ) or \ txt.startswith( 'ERROR' ) or \ txt.startswith( 'WARNING' ): self.appendError( txt ) else: self.appendMessage( txt ) return def __updateToolbarButtons( self ): " Contextually updates toolbar buttons " self.selectAllButton.setEnabled( not self.__isEmpty ) self.copyButton.setEnabled( self.__copyAvailable ) self.clearButton.setEnabled( not self.__isEmpty ) return def __clear( self ): " Triggers when the clear function is selected " self.__isEmpty = True self.__copyAvailable = False self.messages.clear() self.__updateToolbarButtons() return def __onCopyAvailable( self, isAvailable ): " Triggers on the copyAvailable signal " self.__copyAvailable = isAvailable self.__updateToolbarButtons() return def getText( self ): " Provides the content as a plain text " return self.messages.toPlainText()
class OWodbcTable(OWWidget): priority = 3 allSQLSelectWidgets = [] settingsList = ["recentConnections", "lastQuery"] name = "ODBC" description = "Create a Table from an ODBC datasource" icon = "../icons/sql.png" inputs = [] outputs = [ ("Data", Orange.data.Table, widget.Default), ("Feature Definitions", Orange.data.Domain, widget.Default), ("Pandas", pd.DataFrame, widget.Default), ] settingsHandler = settings.DomainContextHandler() def __init__(self): super().__init__() gui.label(self.controlArea, self, "from pandas:") self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) self.allSQLSelectWidgets.append(self) # set default settings self.domain = None self.recentConnections = list() self.recentConnections.append("(none)") self.queryFile = None self.query = "" self.lastQuery = None if self.lastQuery is not None: self.query = self.lastQuery sources = pyodbc.dataSources() dsns = list(sources.keys()) dsns.sort() for dsn in dsns: self.recentConnections.append("DSN={dsn}".format(dsn=dsn)) self.connectString = self.recentConnections[0] self.connectBox = gui.widgetBox(self.controlArea, "Database") self.connectLineEdit = gui.lineEdit(self.connectBox, self, "connectString", callback=None) self.connectCombo = gui.comboBox( self.connectBox, self, "connectString", items=self.recentConnections, valueType=str, sendSelectedValue=True ) self.button = gui.button(self.connectBox, self, "connect", callback=self.connectDB, disabled=0) # query self.splitCanvas = QSplitter(QtCore.Qt.Vertical, self.mainArea) self.mainArea.layout().addWidget(self.splitCanvas) self.textBox = gui.widgetBox(self, "HiveQL") self.splitCanvas.addWidget(self.textBox) self.queryTextEdit = QPlainTextEdit(self.query, self) self.textBox.layout().addWidget(self.queryTextEdit) self.selectBox = gui.widgetBox(self.controlArea, "Select statement") # self.selectSubmitBox = QHGroupBox("", self.selectBox) # self.queryTextEdit.setSizePolicy(QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)) # self.queryTextEdit.setMinimumWidth(300) # self.connect(self.queryTextEdit, SIGNAL('returnPressed()'), self.executeQuery) gui.button(self.selectBox, self, "Open...", callback=self.openScript) gui.button(self.selectBox, self, "Save...", callback=self.saveScript) self.selectBox.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding)) gui.button(self.selectBox, self, "format SQL!", callback=self.format_sql, disabled=0) gui.button(self.selectBox, self, "execute!", callback=self.executeQuery, disabled=0) self.domainBox = gui.widgetBox(self.controlArea, "Domain") self.domainLabel = gui.label(self.domainBox, self, "") # info self.infoBox = gui.widgetBox(self.controlArea, "Info") self.info = [] self.info.append(gui.label(self.infoBox, self, "No data loaded.")) self.info.append(gui.label(self.infoBox, self, "")) self.resize(300, 300) self.cnxn = None def destroy(self, destroyWindow, destroySubWindows): self.allSQLSelectWidgets.remove(self) self.destroy(self, destroyWindow, destroySubWindows) def activateLoadedSettings(self): # print "activating", self.recentQueries, ", ",self.recentConnections self.query = self.lastQuery self.setConnectionList() def selectConnection(self, n): if n < len(self.recentConnections): name = self.recentConnections[n] self.recentConnections.remove(name) self.recentConnections.insert(0, name) if len(self.recentConnections) > 0: self.setConnectionList() self.connectDB(self.recentConnections[0]) def setInfo(self, info): for (i, s) in enumerate(info): self.info[i].setText(s) def setMeta(self): domain = self.data.domain # s = "Attrs:\n " + "\n ".join([str(i) for i in domain.attributes]) + "\n" + "Class:" + str(domain.classVar) # self.domainLabel.setText(s) # for i in domain.getmetas(): # self.propertyCheckBoxes[i].set() # checks whether any file widget knows of any variable from the current domain def attributesOverlap(self, domain): for fw in self.allFileWidgets: if fw != self and getattr(fw, "dataDomain", None): for var in domain: if var in fw.dataDomain: return True return False # Execute a query, create data from it and send it over the data channel def executeQuery(self, query=None, throughReload=0, DK=None, DC=None): self.connectDB() query = self.queryTextEdit.toPlainText() if query is None: query = str(self.queryTextEdit.toPlainText()) # try: self.pandas = psql.read_sql_query(query, self.cnxn) # except Exception: # self.setInfo(('Query failed:', str(''))) # df = pd.DataFrame() self.data = convert_dataframe_to_orange(self.pandas) self.send("Data", self.data) self.send("Pandas", self.pandas) self.setInfo(("Query returned", "Read " + str(len(self.data)) + " examples!")) self.send("Feature Definitions", self.data.domain) self.setMeta() self.lastQuery = query def format_sql(self): query = str(self.queryTextEdit.toPlainText()) str_sql = str(format_sql(query)) self.queryTextEdit.clear() self.queryTextEdit.insertPlainText(str_sql) def connectDB(self): if self.connectString is None: self.connectString = str(self.connectString) if self.connectString in self.recentConnections: self.recentConnections.remove(self.connectString) self.recentConnections.insert(0, self.connectString) print(self.connectString) self.cnxn = pyodbc.connect(self.connectString, autocommit=True) # set the query combo box def setConnectionList(self): self.connectCombo.clear() if not self.recentConnections: self.connectCombo.insertItem("(none)") else: self.connectLineEdit.setText(self.recentConnections[0]) for connection in self.recentConnections: self.connectCombo.insertItem(connection) self.connectCombo.updateGeometry() def openScript(self, filename=None): if self.queryFile is None: self.queryFile = "" if filename == None: self.queryFile = QFileDialog.getOpenFileName( self, "Open SQL file", self.queryFile, "SQL files (*.sql)\nAll files(*.*)" ) else: self.queryFile = filename if self.queryFile == "": return f = open(self.queryFile, "r") self.queryTextEdit.setPlainText(f.read()) f.close() def saveScript(self): if self.queryFile is None: self.queryFile = "" self.queryFile = QFileDialog.getSaveFileName( self, "Save SQL file", self.queryFile, "SQL files (*.sql)\nAll files(*.*)" ) if self.queryFile: fn = "" head, tail = os.path.splitext(self.queryFile) if not tail: fn = head + ".sql" else: fn = self.queryFile f = open(fn, "w") f.write(self.queryTextEdit.toPlainText()) f.close()
class MigrationWidget(QWidget): def __init__(self): super(MigrationWidget, self).__init__() self._migration = {} vbox = QVBoxLayout(self) lbl_title = QLabel(self.tr("Current code:")) self.current_list = QListWidget() lbl_suggestion = QLabel(self.tr("Suggested changes:")) self.suggestion = QPlainTextEdit() self.suggestion.setReadOnly(True) self.btn_apply = QPushButton(self.tr("Apply change!")) hbox = QHBoxLayout() hbox.addSpacerItem(QSpacerItem(1, 0, QSizePolicy.Expanding)) hbox.addWidget(self.btn_apply) vbox.addWidget(lbl_title) vbox.addWidget(self.current_list) vbox.addWidget(lbl_suggestion) vbox.addWidget(self.suggestion) vbox.addLayout(hbox) self.connect(self.current_list, SIGNAL("itemClicked(QListWidgetItem*)"), self.load_suggestion) self.connect(self.btn_apply, SIGNAL("clicked()"), self.apply_changes) def apply_changes(self): lineno = int(self.current_list.currentItem().data(Qt.UserRole)) lines = self._migration.migration_data[lineno][0].split('\n') remove = -1 code = '' for line in lines: if line.startswith('-'): remove += 1 elif line.startswith('+'): code += '%s\n' % line[1:] editorWidget = main_container.MainContainer().get_actual_editor() block_start = editorWidget.document().findBlockByLineNumber(lineno) block_end = editorWidget.document().findBlockByLineNumber(lineno + remove) cursor = editorWidget.textCursor() cursor.setPosition(block_start.position()) cursor.setPosition(block_end.position(), QTextCursor.KeepAnchor) cursor.movePosition(QTextCursor.EndOfLine, QTextCursor.KeepAnchor) cursor.insertText(code[:-1]) def load_suggestion(self, item): lineno = int(item.data(Qt.UserRole)) lines = self._migration.migration_data[lineno][0].split('\n') code = '' for line in lines: if line.startswith('+'): code += '%s\n' % line[1:] self.suggestion.setPlainText(code) editorWidget = main_container.MainContainer().get_actual_editor() if editorWidget: editorWidget.jump_to_line(lineno) editorWidget.setFocus() def refresh_lists(self, migration): self._migration = migration self.current_list.clear() base_lineno = -1 for lineno in sorted(migration.migration_data.keys()): linenostr = 'L%s\n' % str(lineno + 1) data = migration.migration_data[lineno] lines = data[0].split('\n') if base_lineno == data[1]: continue base_lineno = data[1] message = '' for line in lines: if line.startswith('-'): message += '%s\n' % line item = QListWidgetItem(linenostr + message) item.setToolTip(linenostr + message) item.setData(Qt.UserRole, lineno) self.current_list.addItem(item) def clear(self): """ Clear the widget """ self.current_list.clear() self.suggestion.clear()
class UserDialog(QDialog): holdc = {} def __init__(self, parent=None): super(UserDialog, self).__init__(parent) self.pagetitle = self.sessionname self.tableFont = QFont('Century Gothic', 8) self.table = QTableWidget() self.cols = [ 'SN', 'ITEM', 'QUANTITY', 'UNIT AMOUNT', 'TOTAL AMOUNT', 'DATE' ] self.h1_pull_box = QVBoxLayout() #self.tableFont.setFamily('Century Gothic') self.tableHeaderStyle = "::section {" "background-color: teal; color:white}" #pull all CA self.editID = 0 self.hold_unit = {} self.hold_store = {} self.hold_storeGroup = {} self.hold_borrowed = {} from_label = QLabel('From:') to_label = QLabel('To:') self.fromData = QDateEdit() self.toData = QDateEdit() currentDate = QDate() self.fromData.setDate(currentDate.currentDate()) self.fromData.setCalendarPopup(True) self.toData.setDate(currentDate.currentDate()) self.toData.setCalendarPopup(True) menu = QMenu() menu.addAction('All', lambda: self.reloadTable(0)) menu.addAction('In-Stock', lambda: self.reloadTable(1)) menu.addAction('Out-Stock', lambda: self.reloadTable(2)) menu.addAction('Damaged', lambda: self.reloadTable(3)) menu.addAction('Borrowed', lambda: self.reloadTable(4)) self.pull_btn = QPushButton() self.pull_btn.setText("Load") self.pull_btn.setMenu(menu) h_pull_box = QHBoxLayout() h_pull_box.addWidget(from_label) h_pull_box.addWidget(self.fromData) h_pull_box.addWidget(to_label) h_pull_box.addWidget(self.toData) h_pull_box.addWidget(self.pull_btn) storeGroup = self.pullGroupStore() unit = self.pullUnit() self.storeGroupText = QLabel('Category') self.storeGroupData = QComboBox() self.storeGroupData.currentIndexChanged.connect(self.reloadStore) self.storeText = QLabel('Items') self.storeData = QComboBox() self.amountText = QLabel('Total Cost') self.amountData = QLineEdit() self.amountData.setPlaceholderText('0000.00') self.tellerText = QLabel('Reciept No.') self.tellerData = QLineEdit() self.tellerData.setPlaceholderText('xxxxxxxxx') self.quantityText = QLabel('Quantity.') self.quantityData = QLineEdit() self.quantityData.setPlaceholderText('00.0') self.periodText = QLabel('Period (days)') self.periodData = QLineEdit() self.periodData.setPlaceholderText('00.0') self.personText = QLabel('Recieved By:') self.personData = QLineEdit() self.personData.setPlaceholderText('00.0') self.unitText = QLabel('Unit') self.unitData = QComboBox() self.borrowedText = QLabel('Borrowed') self.borrowedData = QComboBox() self.dateText = QLabel('Date') self.dateData = QDateEdit() self.dateData.setDate(currentDate.currentDate()) self.dateData.setCalendarPopup(True) self.descriptionText = QLabel('Description') self.descriptionData = QPlainTextEdit() self.descriptionData.move(200, 100) self.borrowedText.hide() self.borrowedData.hide() mboz = QVBoxLayout() hboz = QHBoxLayout() self.state = QLabel('') self.r1 = QRadioButton('In-stock') self.r1.setChecked(True) self.r1.toggled.connect(lambda: self.changeStates()) self.r2 = QRadioButton('Out-stock') self.r2.toggled.connect(lambda: self.changeStates()) self.r3 = QRadioButton('Damaged') self.r3.toggled.connect(lambda: self.changeStates()) self.r4 = QRadioButton('Borrowed') self.r4.toggled.connect(lambda: self.changeStates()) self.r5 = QRadioButton('Returned') self.r5.toggled.connect(lambda: self.changeStates()) hboz.addWidget(self.r1) hboz.addWidget(self.r2) hboz.addWidget(self.r3) hboz.addWidget(self.r4) hboz.addWidget(self.r5) i = 0 for a in storeGroup: self.hold_storeGroup[i] = a['id'] tex = str(a['name']).upper() self.storeGroupData.addItem(tex) i += 1 i = 0 str_key = self.hold_storeGroup[self.storeGroupData.currentIndex()] store = self.pullStore(str_key) for a in store: self.hold_store[i] = a['id'] tex = str(a['name']).upper() self.storeData.addItem(tex) i += 1 i = 0 for a in unit: self.hold_unit[i] = a['id'] tex = str(a['name']).upper() self.unitData.addItem(tex) i += 1 self.reloadBorrowed() self.FormLayout = QFormLayout() self.FormLayout.addRow(self.storeGroupText, self.storeGroupData) self.FormLayout.addRow(self.storeText, self.storeData) self.FormLayout.addRow(self.tellerText, self.tellerData) self.FormLayout.addRow(self.quantityText, self.quantityData) self.FormLayout.addRow(self.amountText, self.amountData) self.FormLayout.addRow(self.dateText, self.dateData) self.FormLayout.addRow(self.periodText, self.periodData) self.FormLayout.addRow(self.borrowedText, self.borrowedData) self.FormLayout.addRow(self.personText, self.personData) self.FormLayout.addRow(self.descriptionText, self.descriptionData) self.periodText.hide() self.periodData.hide() mboz.addLayout(hboz) mboz.addLayout(self.FormLayout) mboz.addWidget(self.state) groupBox1 = QGroupBox('Add Store Item') groupBox1.setLayout(mboz) self.pb = QPushButton() self.pb.setObjectName("Add") self.pb.setText("Add Store Item") self.pb1 = QPushButton() self.pb1.setObjectName("Edit") self.pb1.setText("Edit Row") self.pb1.setEnabled(False) self.pb2 = QPushButton() self.pb2.setObjectName("Close") self.pb2.setText("Close") self.pb3 = QPushButton() self.pb3.setObjectName("Delete") self.pb3.setText("Delete Row") self.pb3.setEnabled(False) self.pb4 = QPushButton() self.pb4.setObjectName("Reset") self.pb4.setText("Reset") self.pb4.hide() self.pb5 = QPushButton() self.pb5.setObjectName("Change") self.pb5.setText("Change Store") self.pb5.hide() self.pb6 = QPushButton() self.pb6.setObjectName("Clear") self.pb6.setText("Clear Selection") self.pb6.setEnabled(False) hbo = QHBoxLayout() hbo.addWidget(self.pb) hbo.addWidget(self.pb5) hbo.addWidget(self.pb4) hbo.addWidget(self.pb2) groupBox2 = QGroupBox('Store Data') groupBox2.setLayout(hbo) al = self.pullStoreData(0) if al and len(al) > 0: al = al else: al = {} self.storeData.currentIndexChanged.connect( lambda: self.reloadBorrowed()) header = self.table.horizontalHeader() header.setResizeMode(QHeaderView.ResizeToContents) header.setStretchLastSection(True) header.setStyleSheet(self.tableHeaderStyle) vheader = self.table.verticalHeader() vheader.setStyleSheet(self.tableHeaderStyle) # Body self.table.setWindowTitle("Store") self.table.setStyleSheet("color:white") self.table.resize(300, 250) self.table.setFont(self.tableFont) self.table.setSortingEnabled(2) #self.table.resizeColumnsToContents() self.table.setRowCount(len(al)) self.table.setColumnCount(len(self.cols)) self.table.setHorizontalHeaderLabels(self.cols) self.table.setContextMenuPolicy(Qt.CustomContextMenu) self.table.customContextMenuRequested.connect(self.handleHeaderMenu) self.table.hideColumn(0) self.table.setSelectionMode(QAbstractItemView.MultiSelection) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) i = 0 for q in al: #row id if q['state'] == 1: color = QColor(100, 0, 0) elif q['state'] == 2: color = QColor(100, 100, 0) elif q['state'] == 3: color = QColor(100, 0, 100) elif q['state'] == 4: color = QColor(0, 100, 100) else: color = QColor(0, 50, 150) self.table.setItem(i, 0, QTableWidgetItem(str(q['id']))) self.table.item(i, 0).setBackground(color) self.table.setItem(i, 1, QTableWidgetItem(str(q['itemname']).upper())) self.table.item(i, 1).setBackground(color) self.table.setItem(i, 2, QTableWidgetItem(str(q['quantity']).upper())) self.table.item(i, 2).setBackground(color) try: zamt = str("{:,}".format(float(q['amount']))) except: zamt = '' self.table.setItem(i, 3, QTableWidgetItem(zamt)) self.table.item(i, 3).setBackground(color) try: if len(q['amount']) > 0 and float(q['amount']) > 0: tot = float(q['amount']) * float(q['quantity']) else: tot = 0 except: tot = 0 self.table.setItem(i, 4, QTableWidgetItem(str(tot).upper())) self.table.item(i, 4).setBackground(color) damz = float(q['datepaid']) damt = datetime.utcfromtimestamp(damz).strftime('%d-%m-%Y') self.table.setItem(i, 5, QTableWidgetItem(str(damt))) self.table.item(i, 5).setBackground(color) i += 1 self.table.itemSelectionChanged.connect(self.confirmSelection) self.table.resizeRowsToContents() v_pull_box = QVBoxLayout() self.h1_pull_box.addWidget(self.table) v_pull_box.addLayout(h_pull_box) v_pull_box.addLayout(self.h1_pull_box) h2_pull_box = QHBoxLayout() h2_pull_box.addWidget(self.pb1) h2_pull_box.addWidget(self.pb3) h2_pull_box.addWidget(self.pb6) v_pull_box.addLayout(h2_pull_box) groupBox3 = QGroupBox() groupBox3.setLayout(hbo) groupBox2.setLayout(v_pull_box) grid = QGridLayout() grid.addWidget(groupBox1, 0, 0) grid.addWidget(groupBox2, 0, 1, 2, 1) grid.addWidget(groupBox3, 1, 0) self.setLayout(grid) self.connect(self.pb, SIGNAL("clicked()"), lambda: self.button_click()) self.connect(self.pb1, SIGNAL("clicked()"), lambda: self.button_editshow()) self.connect(self.pb2, SIGNAL("clicked()"), lambda: self.button_close(self)) self.connect(self.pb3, SIGNAL("clicked()"), lambda: self.button_delete()) self.connect(self.pb4, SIGNAL("clicked()"), lambda: self.button_reset()) self.connect(self.pb5, SIGNAL("clicked()"), lambda: self.button_edit()) self.connect(self.pb6, SIGNAL("clicked()"), lambda: self.button_clear()) #self.connect(self.pull_btn, SIGNAL("clicked()"), lambda x =1: self.reloadTable(x)) self.setWindowTitle(self.pagetitle) def stateReciept(self): self.amountText.show() self.amountData.show() self.tellerText.show() self.tellerData.show() self.tellerText.setText('Reciept No.') self.periodText.hide() self.periodData.hide() self.personText.setText('Recieved By:') self.personData.setPlaceholderText('Fullname or department') self.borrowedText.hide() self.borrowedData.hide() self.reloadTable(1) def stateIssue(self): self.amountText.hide() self.amountData.hide() self.tellerText.show() self.tellerData.show() self.tellerText.setText('Issue No.') self.periodText.hide() self.periodData.hide() self.personText.setText('Issued to:') self.personData.setPlaceholderText('Fullname or department issued to') self.borrowedText.hide() self.borrowedData.hide() self.reloadTable(2) def stateDamage(self): self.amountText.hide() self.amountData.hide() self.tellerText.hide() self.tellerData.hide() self.periodText.hide() self.periodData.hide() self.personText.setText('Reported By:') self.personData.setPlaceholderText('Fullname or department') self.borrowedText.hide() self.borrowedData.hide() self.reloadTable(3) def stateBorrowed(self): self.amountText.hide() self.amountData.hide() self.tellerText.hide() self.tellerData.hide() self.periodText.show() self.periodData.show() self.personText.setText('Given to:') self.personData.setPlaceholderText( 'Fullname or department borrowed to') self.borrowedText.hide() self.borrowedData.hide() self.reloadTable(4) def stateReturned(self): self.amountText.hide() self.amountData.hide() self.tellerText.hide() self.tellerData.hide() self.periodText.hide() self.periodData.hide() self.personText.setText('Returned By:') self.personData.setPlaceholderText( 'Fullname or department borrowed to') self.borrowedText.show() self.borrowedData.show() self.reloadBorrowed() self.reloadTable(5) def changeStates(self): self.getQuantity() if self.r1.isChecked(): self.stateReciept() elif self.r2.isChecked(): self.stateIssue() elif self.r3.isChecked(): self.stateDamage() elif self.r4.isChecked(): self.stateBorrowed() elif self.r5.isChecked(): self.stateReturned() def handleHeaderMenu(self, pos): print('column(%d)' % self.table.horizontalHeader().logicalIndexAt(pos)) menu = QMenu() menu.addAction('Add') menu.addAction('Delete') menu.exec_(QCursor.pos()) def pullGroupStore(self): cn = Db() arr = cn.selectn('datas', '', '', {"pubID": 23, "active": 0}) return arr def pullStore(self, a): cn = Db() arr = cn.selectn('datas', '', '', {"subID": a}) return arr def pullUnit(self): cn = Db() arr = cn.selectn('datas', '', '', {"pubID": 20, "active": 0}) return arr def pullStoreData(self, a=None): st_date = self.fromData.date().toPyDate() en_date = self.toData.date().toPyDate() st_date = time.mktime(st_date.timetuple()) en_date = time.mktime(en_date.timetuple()) db = 'school_stores' + str(self.session) cn = Db() arr = cn.selectStoreDate(db, st_date, en_date, a) return arr def mySelectTable(self): ''' get the selected rpws in a table returns list or row ids ''' sels = self.table.selectedIndexes() sels = self.table.selectionModel().selectedRows() park = [] park1 = [] for j in sels: park.append(j.row()) for i in set(park): selected = self.table.item(i, 0).text() park1.append(selected) return park1 def editRow(self, a): _session = self.session g = Db() db = 'school_stores' + str(_session) data = g.selectn(db, '', 1, {'id': a}) if len(data) > 0: try: amt = float(data['amount']) qty = float(data['quantity']) if amt > 0 and qty > 0: cost = amt * qty else: cost = 0 except: cost = 0 amt = 0 qty = 0 if data['state'] == 1: self.r1.setChecked(True) elif data['state'] == 2: self.r2.setChecked(True) elif data['state'] == 3: self.r3.setChecked(True) elif data['state'] == 4: self.r4.setChecked(True) elif data['state'] == 5: self.r5.setChecked(True) self.amountData.setText(str(cost)) self.descriptionData.clear() self.descriptionData.insertPlainText(str(data['description'])) self.tellerData.setText(str(data['teller'])) self.periodData.setText(str(data['period'])) self.personData.setText(str(data['person'])) self.quantityData.setText(str(qty)) stID = self.hold_store.keys()[self.hold_store.values().index( data['itemID'])] self.storeData.setCurrentIndex(stID) def reloadBorrowed(self): self.getQuantity() _store = self.hold_store[self.storeData.currentIndex()] _session = self.session g = Db() db = 'school_stores' + str(_session) data = g.selectn(db, '', '', {'itemID': _store, 'state': 4}) fig = 0 self.borrowedData.clear() self.hold_borrowed = {} i = 0 for a in data: ret = g.selectStoreReturned(db, a['id']) if ret: retu = ret['qty'] else: retu = 0 fig = float(a['quantity']) - float(retu) damz = float(a['datepaid']) if float(fig) > 0: self.hold_borrowed[i] = a['id'] damt = datetime.utcfromtimestamp(damz).strftime('%d-%m-%Y') tex = str(damt) + " " + str( a['person']).upper() + " (" + str(fig).upper() + ")" self.borrowedData.addItem(tex) i += 1 def reloadStore(self): self.getQuantity() cat = self.hold_storeGroup[self.storeGroupData.currentIndex()] store = self.pullStore(cat) self.storeData.clear() self.hold_store = {} i = 0 for a in store: self.hold_store[i] = a['id'] tex = str(a['name']).upper() self.storeData.addItem(tex) i += 1 def getQuantity(self): if self.storeData.currentIndex() > -1: s = self.hold_store[self.storeData.currentIndex()] _session = self.session g = Db() db = 'school_stores' + str(_session) fi = g.selectStoreQuantity(db, s) remain = 0 arr = {} for a in fi: arr[a['state']] = a['qty'] if 1 in arr: re = arr[1] else: re = 0 if 2 in arr: isu = arr[2] else: isu = 0 if 3 in arr: dam = arr[3] else: dam = 0 if 4 in arr: bor = arr[4] else: bor = 0 if 5 in arr: ret = arr[5] else: ret = 0 borrowed = float(bor) - float(ret) issued = float(isu) + float(borrowed) + float(dam) remain = float(re) - float(issued) self.quantityText.setText('QTY: ' + str(remain)) if remain == 0 and (self.r2.isChecked() or self.r3.isChecked() or self.r4.isChecked()): self.quantityData.setEnabled(False) else: self.quantityData.setEnabled(True) return remain def reloadTable(self, a): self.getQuantity() if not a == 0: data = self.pullStoreData(a) else: data = self.pullStoreData() self.table.close() self.table = QTableWidget() header = self.table.horizontalHeader() header.setResizeMode(QHeaderView.ResizeToContents) header.setStretchLastSection(True) header.setStyleSheet(self.tableHeaderStyle) vheader = self.table.verticalHeader() vheader.setStyleSheet(self.tableHeaderStyle) # Body self.table.setWindowTitle("Stores") self.table.setStyleSheet("color:white") self.table.resize(300, 250) self.table.setFont(self.tableFont) self.table.setSortingEnabled(2) self.table.resizeColumnsToContents() self.table.setRowCount(len(data)) self.table.setColumnCount(len(self.cols)) self.table.setHorizontalHeaderLabels(self.cols) self.table.setContextMenuPolicy(Qt.CustomContextMenu) self.table.customContextMenuRequested.connect(self.handleHeaderMenu) self.table.hideColumn(0) self.table.setSelectionMode(QAbstractItemView.MultiSelection) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) i = 0 for q in data: #row id if q['state'] == 1: color = QColor(100, 0, 0) elif q['state'] == 2: color = QColor(100, 100, 0) elif q['state'] == 3: color = QColor(100, 0, 100) elif q['state'] == 4: color = QColor(0, 100, 100) else: color = QColor(0, 50, 150) self.table.setItem(i, 0, QTableWidgetItem(str(q['id']))) self.table.item(i, 0).setBackground(color) self.table.setItem(i, 1, QTableWidgetItem(str(q['itemname']).upper())) self.table.item(i, 1).setBackground(color) self.table.setItem(i, 2, QTableWidgetItem(str(q['quantity']).upper())) self.table.item(i, 2).setBackground(color) try: zamt = str("{:,}".format(float(q['amount']))) except: zamt = '' self.table.setItem(i, 3, QTableWidgetItem(zamt)) self.table.item(i, 3).setBackground(color) try: if len(q['amount']) > 0 and float(q['amount']) > 0: tot = float(q['amount']) * float(q['quantity']) else: tot = 0 except: tot = 0 self.table.setItem(i, 4, QTableWidgetItem(str(tot).upper())) self.table.item(i, 4).setBackground(color) damz = float(q['datepaid']) damt = datetime.utcfromtimestamp(damz).strftime('%d-%m-%Y') self.table.setItem(i, 5, QTableWidgetItem(str(damt))) self.table.item(i, 5).setBackground(color) i += 1 self.table.itemSelectionChanged.connect(self.confirmSelection) self.table.resizeRowsToContents() self.h1_pull_box.addWidget(self.table) self.table.show() def pullOnes(self, a, b): cn = Db() arr = cn.selectn(a, '', 1, {'id': b}) return arr def confirmSelection(self): item = self.mySelectTable() if len(item) == 1: self.pb1.setEnabled(True) self.pb3.setEnabled(True) self.pb6.setEnabled(True) elif len(item) > 1: self.pb1.setEnabled(False) self.pb3.setEnabled(True) self.pb6.setEnabled(True) else: self.pb1.setEnabled(False) self.pb3.setEnabled(False) self.pb6.setEnabled(False) def button_close(self, b): b.close() def button_editshow(self): item = self.mySelectTable() self.editRow(item[0]) self.pb.hide() self.pb4.show() self.pb5.show() def button_delete(self): item = self.mySelectTable() _session = self.session g = Db() db = 'school_stores' + str(_session) for j in item: g.delete(db, {'id': j}) self.reloadTable(1) def button_edit(self): _session = self.session _amounts = self.amountData.text() _teller = self.tellerData.text() _quantity = self.quantityData.text() _person = self.personData.text() _period = self.periodData.text() _date = self.dateData.date().toPyDate() _date = time.mktime(_date.timetuple()) _description = self.descriptionData.toPlainText() _store = self.hold_store[self.storeData.currentIndex()] _borrowed = self.hold_borrowed[self.borrowedData.currentIndex()] arr = {} #recieved if self.r1.isChecked() and _amounts and not ( _amounts == 0) and int(_store) > 0 and int(_quantity) > 0: _amount = float(_amounts) / float(_quantity) arr['amount'] = _amount arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['teller'] = _teller arr['quantity'] = _quantity arr['person'] = _person arr['state'] = 1 #issued elif self.r2.isChecked() and int(_store) > 0 and int(_quantity) > 0: _amount = float(_amounts) / float(_quantity) arr['amount'] = _amount arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['teller'] = _teller arr['quantity'] = _quantity arr['person'] = _person arr['state'] = 2 #damaged elif self.r3.isChecked() and int(_store) > 0 and int(_quantity) > 0: arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['teller'] = _teller arr['quantity'] = _quantity arr['person'] = _person arr['state'] = 3 elif self.r4.isChecked() and int(_store) > 0 and int(_quantity) > 0: arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['quantity'] = _quantity arr['person'] = _person arr['period'] = _period arr['state'] = 4 elif self.r5.isChecked() and int(_store) > 0 and int(_quantity) > 0: _borrowed = self.hold_borrowed[self.borrowedData.currentIndex()] arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['quantity'] = _quantity arr['person'] = _person arr['period'] = _period arr['active'] = _borrowed arr['state'] = 5 ups = {} ups['id'] = self.editID if int(self.editID) > 0 and len(arr) > 0: db = 'school_stores' + str(_session) g = Db() g.update(db, arr, ups) if int(self.editID) > 0: self.button_reset() def button_reset(self): self.getQuantity() self.reloadTable(1) self.amountData.setText('') self.descriptionData.clear() self.tellerData.setText('') self.personData.setText('') self.periodData.setText('') self.quantityData.setText('') self.pb4.hide() self.pb5.hide() self.pb.show() self.editID = 0 self.button_clear() self.confirmSelection() self.reloadBorrowed() def button_clear(self): self.table.selectionModel().clearSelection() def button_click(self): _session = self.session _amounts = self.amountData.text() _teller = self.tellerData.text() _quantity = self.quantityData.text() _person = self.personData.text() _period = self.periodData.text() _date = self.dateData.date().toPyDate() _date = time.mktime(_date.timetuple()) _description = self.descriptionData.toPlainText() _store = self.hold_store[self.storeData.currentIndex()] arr = {} #recieved if self.r1.isChecked() and _amounts and not ( _amounts == 0) and int(_store) > 0 and int(_quantity) > 0: _amount = float(_amounts) / float(_quantity) arr['amount'] = _amount arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['teller'] = _teller arr['quantity'] = _quantity arr['person'] = _person arr['state'] = 1 #issued elif self.r2.isChecked() and _amounts and not ( _amounts == 0) and int(_store) > 0 and int(_quantity) > 0: _amount = float(_amounts) / float(_quantity) arr['amount'] = _amount arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['teller'] = _teller arr['quantity'] = _quantity arr['person'] = _person arr['state'] = 2 #damaged elif self.r3.isChecked() and int(_store) > 0 and int( float(_quantity)) > 0: arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['teller'] = _teller arr['quantity'] = _quantity arr['person'] = _person arr['state'] = 3 elif self.r4.isChecked() and int(_store) > 0 and int( float(_quantity)) > 0: arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['quantity'] = _quantity arr['person'] = _person arr['period'] = _period arr['state'] = 4 elif self.r5.isChecked() and int(_store) > 0 and int( float(_quantity)) > 0 and self.borrowedData.currentIndex() > 0: _borrowed = self.hold_borrowed[self.borrowedData.currentIndex()] arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['quantity'] = _quantity arr['person'] = _person arr['period'] = _period arr['active'] = _borrowed arr['state'] = 5 if len(arr) > 0: db = 'school_stores' + str(_session) g = Db() ins = g.insert(db, arr) if int(ins) > 0: self.button_reset()
class LogViewer(QWidget): """ The log (+stdout, +stderr) viewer widget """ def __init__(self, parent=None): QWidget.__init__(self, parent) self.__isEmpty = True self.__copyAvailable = False self.clearButton = None self.messages = None self.copyButton = None self.selectAllButton = None self.__createLayout(parent) # create the context menu self.__menu = QMenu(self) self.__selectAllMenuItem = self.__menu.addAction( PixmapCache().getIcon('selectall.png'), 'Select All', self.messages.selectAll) self.__copyMenuItem = self.__menu.addAction( PixmapCache().getIcon('copytoclipboard.png'), 'Copy', self.messages.copy) self.__menu.addSeparator() self.__clearMenuItem = self.__menu.addAction( PixmapCache().getIcon('trash.png'), 'Clear', self.__clear) self.messages.setContextMenuPolicy(Qt.CustomContextMenu) self.messages.customContextMenuRequested.connect( self.__handleShowContextMenu) self.messages.copyAvailable.connect(self.__onCopyAvailable) self.cNormalFormat = self.messages.currentCharFormat() self.cErrorFormat = self.messages.currentCharFormat() self.cErrorFormat.setForeground(QBrush(QColor(Qt.red))) self.__updateToolbarButtons() return def __createLayout(self, parent): " Helper to create the viewer layout " # Messages list area self.messages = QPlainTextEdit(parent) self.messages.setLineWrapMode(QPlainTextEdit.NoWrap) self.messages.setFont(QFont(GlobalData().skin.baseMonoFontFace)) self.messages.setReadOnly(True) self.messages.setMaximumBlockCount(MAX_LINES) # Default font size is good enough for most of the systems. # 12.0 might be good only in case of the XServer on PC (Xming). # self.messages.setFontPointSize( 12.0 ) # Buttons self.selectAllButton = QAction(PixmapCache().getIcon('selectall.png'), 'Select all', self) self.selectAllButton.triggered.connect(self.messages.selectAll) self.copyButton = QAction(PixmapCache().getIcon('copytoclipboard.png'), 'Copy to clipboard', self) self.copyButton.triggered.connect(self.messages.copy) spacer = QWidget() spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.clearButton = QAction(PixmapCache().getIcon('trash.png'), 'Clear all', self) self.clearButton.triggered.connect(self.__clear) # Toolbar self.toolbar = QToolBar() self.toolbar.setOrientation(Qt.Vertical) self.toolbar.setMovable(False) self.toolbar.setAllowedAreas(Qt.LeftToolBarArea) self.toolbar.setIconSize(QSize(16, 16)) self.toolbar.setFixedWidth(28) self.toolbar.setContentsMargins(0, 0, 0, 0) self.toolbar.addAction(self.selectAllButton) self.toolbar.addAction(self.copyButton) self.toolbar.addWidget(spacer) self.toolbar.addAction(self.clearButton) # layout layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) layout.addWidget(self.toolbar) layout.addWidget(self.messages) self.setLayout(layout) return def __handleShowContextMenu(self, coord): """ Show the context menu """ self.__selectAllMenuItem.setEnabled(not self.__isEmpty) self.__copyMenuItem.setEnabled(self.__copyAvailable) self.__clearMenuItem.setEnabled(not self.__isEmpty) self.__menu.popup(QCursor.pos()) return def __appendText(self, txt, isError): " Append the text " if len(txt) == 0: return self.__isEmpty = False cursor = self.messages.textCursor() cursor.movePosition(QTextCursor.End) self.messages.setTextCursor(cursor) if isError: self.messages.setCurrentCharFormat(self.cErrorFormat) else: self.messages.setCurrentCharFormat(self.cNormalFormat) self.messages.insertPlainText(txt) self.messages.insertPlainText('\n') self.messages.ensureCursorVisible() self.__updateToolbarButtons() return def appendMessage(self, txt): " Append the regular message " self.__appendText(txt, False) #QApplication.processEvents() return def appendError(self, txt): " Append the error message " self.__appendText(txt, True) #QApplication.processEvents() return def append(self, txt): " Decides what the message is - error or not - and append it then " if txt.startswith( 'CRITICAL' ) or \ txt.startswith( 'ERROR' ) or \ txt.startswith( 'WARNING' ): self.appendError(txt) else: self.appendMessage(txt) return def __updateToolbarButtons(self): " Contextually updates toolbar buttons " self.selectAllButton.setEnabled(not self.__isEmpty) self.copyButton.setEnabled(self.__copyAvailable) self.clearButton.setEnabled(not self.__isEmpty) return def __clear(self): " Triggers when the clear function is selected " self.__isEmpty = True self.__copyAvailable = False self.messages.clear() self.__updateToolbarButtons() return def __onCopyAvailable(self, isAvailable): " Triggers on the copyAvailable signal " self.__copyAvailable = isAvailable self.__updateToolbarButtons() return def getText(self): " Provides the content as a plain text " return self.messages.toPlainText()
class FormStudentMedical(QDialog): def __init__(self, student, term, edit=None, parent=None): super(FormStudentMedical, self).__init__(parent) self.student = student self.term = term self.db_class = 'student_class' + str(self.term) self.db_subject = 'student_subject' + str(self.term) student = self.pullData('students', 1, {'id': self.student}) term = self.pullData('terms', 1, {'id': self.term}) session = self.pullData('session', 1, {'id': term['sessionID']}) self.session = str( str(session['name']) + " " + str(term['name'] + " Term")).title() self.fullname = str( str(student['surname']) + " " + str(student['firstname'])).title() self.sessionID = session['id'] fullnameLbl = QLabel(self.fullname) fullnameLbl.setFont(QFont("Candara", 14, QFont.Bold)) termLbl = QLabel(self.session) termLbl.setFont(QFont("Candara", 12, QFont.Bold)) ailmentLbl = QLabel('Ailment/Allergies') treatmentLbl = QLabel('Treatment/Medication') self.ailmentData = QPlainTextEdit() self.treatmentData = QPlainTextEdit() self.pb = QPushButton() self.pb.setObjectName("close") self.pb.setText("Close") self.pb1 = QPushButton() self.pb1.setObjectName("Add") self.pb1.setText("Add") self.pb2 = QPushButton() self.pb2.setObjectName("Edit") self.pb2.setText("Edit") self.connect(self.pb1, SIGNAL("clicked()"), lambda: self.button_click()) self.connect(self.pb2, SIGNAL("clicked()"), lambda: self.button_edit()) self.connect(self.pb, SIGNAL("clicked()"), lambda: self.button_close()) self.dateLbl = QLabel('Choose Date:') currentDate = QDate() self.dateData = QDateEdit() self.dateData.setDate(currentDate.currentDate()) self.dateData.setCalendarPopup(True) h_box = QHBoxLayout() h_box.addWidget(self.dateLbl) h_box.addWidget(self.dateData) h_box1 = QHBoxLayout() h_box1.addWidget(self.pb) h_box1.addWidget(self.pb1) h_box1.addWidget(self.pb2) self.v_box = QVBoxLayout() self.v_box.addWidget(fullnameLbl) self.v_box.addWidget(termLbl) self.v_box.addLayout(h_box) self.v_box.addWidget(ailmentLbl) self.v_box.addWidget(self.ailmentData) self.v_box.addWidget(treatmentLbl) self.v_box.addWidget(self.treatmentData) self.v_box.addLayout(h_box1) if edit and len(edit) > 0: self.edit = edit self.editRow(edit) self.pb1.hide() self.pb2.show() else: self.edit = None self.pb1.show() self.pb2.hide() self.setLayout(self.v_box) self.setWindowTitle("Medical Report Form") def pullData(self, db, sid, arr): g = Db() data = g.selectn(db, '', sid, arr) return data def convert_arr(self, arr): ar = [] for a in arr: ar.append(a['subjectID']) return ar def editRow(self, a): e = a.split('_') g = Db() self.mainrow = e[1] self.mainses = e[0] db = 'school_medicals' + str(e[0]) data = g.selectn(db, '', 1, {'id': e[1]}) if data and len(data) > 0: self.ailmentData.clear() self.ailmentData.insertPlainText(str(data['ailment'])) self.treatmentData.clear() self.treatmentData.insertPlainText(str(data['treatment'])) def button_close(self): self.reject() def button_click(self): ailment = self.ailmentData.toPlainText() treatment = self.treatmentData.toPlainText() _date = self.dateData.date().toPyDate() _date = time.mktime(_date.timetuple()) db = 'school_medicals' + str(self.sessionID) if len(ailment) > 0 and len(treatment) > 0: arr = {} arr['studentID'] = self.student arr['ailment'] = ailment arr['treatment'] = treatment arr['datepaid'] = _date g = Db() g.insert(db, arr) ## set subject self.getValue() def button_edit(self): ailment = self.ailmentData.toPlainText() treatment = self.treatmentData.toPlainText() _date = self.dateData.date().toPyDate() _date = time.mktime(_date.timetuple()) db = 'school_medicals' + str(self.mainses) if len(ailment) > 0 and len(treatment) > 0: arr = {} arr['ailment'] = ailment arr['treatment'] = treatment arr['datepaid'] = _date g = Db() g.update(db, arr, {'id': self.mainrow}) ## set subject self.getValue() def getValue(self): self.accept()
class TalkDetailsWidget(QWidget): def __init__(self, parent=None): super(TalkDetailsWidget, self).__init__(parent) self.layout = QGridLayout() self.setLayout(self.layout) self.buttonLayout = QHBoxLayout() saveIcon = QIcon.fromTheme("document-save") self.saveButton = QPushButton('Save Talk') self.saveButton.setIcon(saveIcon) self.buttonLayout.addWidget(self.saveButton) self.layout.addLayout(self.buttonLayout, 0, 1, 1, 1) self.titleLabel = QLabel('Title') self.titleLineEdit = QLineEdit() self.presenterLabel = QLabel('Presenter') self.presenterLineEdit = QLineEdit() self.layout.addWidget(self.titleLabel, 1, 0, 1, 1) self.layout.addWidget(self.titleLineEdit, 1, 1, 1, 1) self.layout.addWidget(self.presenterLabel, 1, 2, 1, 1) self.layout.addWidget(self.presenterLineEdit, 1, 3, 1, 1) self.eventLabel = QLabel('Event') self.eventLineEdit = QLineEdit() self.categoryLabel = QLabel('Category') self.categoryLineEdit = QLineEdit() self.layout.addWidget(self.eventLabel, 2, 0, 1, 1) self.layout.addWidget(self.eventLineEdit, 2, 1, 1, 1) self.layout.addWidget(self.categoryLabel, 2, 2, 1, 1) self.layout.addWidget(self.categoryLineEdit, 2, 3, 1, 1) self.roomLabel = QLabel('Room') self.roomLineEdit = QLineEdit() self.dateLayout = QHBoxLayout() self.dateLabel = QLabel('Date') self.dateEdit = QDateEdit() currentDate = QDate() self.dateEdit.setDate(currentDate.currentDate()) self.dateEdit.setCalendarPopup(True) self.layout.addWidget(self.roomLabel, 3, 0, 1, 1) self.layout.addWidget(self.roomLineEdit, 3, 1, 1, 1) self.dateLayout.addWidget(self.dateEdit) self.layout.addWidget(self.dateLabel, 3, 2, 1, 1) self.layout.addLayout(self.dateLayout, 3, 3, 1, 1) self.startTimeLayout = QHBoxLayout() self.startTimeLabel = QLabel('Start Time') self.startTimeEdit = QTimeEdit() self.startTimeLayout.addWidget(self.startTimeEdit) self.endTimeLayout = QHBoxLayout() self.endTimeLabel = QLabel('End Time') self.endTimeEdit = QTimeEdit() self.endTimeLayout.addWidget(self.endTimeEdit) self.layout.addWidget(self.startTimeLabel, 4, 0, 1, 1) self.layout.addLayout(self.startTimeLayout, 4, 1, 1, 1) self.layout.addWidget(self.endTimeLabel, 4, 2, 1, 1) self.layout.addLayout(self.endTimeLayout, 4, 3, 1, 1) self.descriptionLabel = QLabel('Description') self.descriptionLabel.setAlignment(Qt.AlignTop) self.descriptionTextEdit = QPlainTextEdit() self.layout.addWidget(self.descriptionLabel, 5, 0, 1, 1) self.layout.addWidget(self.descriptionTextEdit, 5, 1, 1, 3) def enable_input_fields(self): self.titleLineEdit.setPlaceholderText("Enter Talk Title") self.presenterLineEdit.setPlaceholderText("Enter Presenter Name") self.categoryLineEdit.setPlaceholderText("Enter Category Type") self.eventLineEdit.setPlaceholderText("Enter Event Name") self.roomLineEdit.setPlaceholderText("Enter Room Location") self.titleLineEdit.setEnabled(True) self.presenterLineEdit.setEnabled(True) self.categoryLineEdit.setEnabled(True) self.eventLineEdit.setEnabled(True) self.roomLineEdit.setEnabled(True) self.dateEdit.setEnabled(True) self.startTimeEdit.setEnabled(True) self.endTimeEdit.setEnabled(True) self.descriptionTextEdit.setEnabled(True) def disable_input_fields(self): self.titleLineEdit.setPlaceholderText("") self.presenterLineEdit.setPlaceholderText("") self.categoryLineEdit.setPlaceholderText("") self.eventLineEdit.setPlaceholderText("") self.roomLineEdit.setPlaceholderText("") self.titleLineEdit.setEnabled(False) self.presenterLineEdit.setEnabled(False) self.categoryLineEdit.setEnabled(False) self.eventLineEdit.setEnabled(False) self.roomLineEdit.setEnabled(False) self.dateEdit.setEnabled(False) self.startTimeEdit.setEnabled(False) self.endTimeEdit.setEnabled(False) self.descriptionTextEdit.setEnabled(False) def clear_input_fields(self): self.titleLineEdit.clear() self.presenterLineEdit.clear() self.categoryLineEdit.clear() self.eventLineEdit.clear() self.roomLineEdit.clear() self.descriptionTextEdit.clear()
class OWodbcTable(OWWidget): priority = 3 allSQLSelectWidgets = [] settingsList = ["recentConnections", "lastQuery"] name = "ODBC" description = "Create a Table from an ODBC datasource" icon = "../icons/sql.png" inputs = [] outputs = [("Data", Orange.data.Table, widget.Default), ("Feature Definitions", Orange.data.Domain, widget.Default), ("Pandas", pd.DataFrame, widget.Default)] settingsHandler = settings.DomainContextHandler() def __init__(self): super().__init__() gui.label(self.controlArea, self, "from pandas:") self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) self.allSQLSelectWidgets.append(self) # set default settings self.domain = None self.recentConnections = list() self.recentConnections.append("(none)") self.queryFile = None self.query = '' self.lastQuery = None if self.lastQuery is not None: self.query = self.lastQuery sources = pyodbc.dataSources() dsns = list(sources.keys()) dsns.sort() for dsn in dsns: self.recentConnections.append("DSN={dsn}".format(dsn=dsn)) self.connectString = self.recentConnections[0] self.connectBox = gui.widgetBox(self.controlArea, "Database") self.connectLineEdit = gui.lineEdit(self.connectBox, self, 'connectString', callback=None) self.connectCombo = gui.comboBox(self.connectBox, self, 'connectString', items=self.recentConnections, valueType=str, sendSelectedValue=True) self.button = gui.button(self.connectBox, self, 'connect', callback=self.connectDB, disabled=0) # query self.splitCanvas = QSplitter(QtCore.Qt.Vertical, self.mainArea) self.mainArea.layout().addWidget(self.splitCanvas) self.textBox = gui.widgetBox(self, 'HiveQL') self.splitCanvas.addWidget(self.textBox) self.queryTextEdit = QPlainTextEdit(self.query, self) self.textBox.layout().addWidget(self.queryTextEdit) self.selectBox = gui.widgetBox(self.controlArea, "Select statement") # self.selectSubmitBox = QHGroupBox("", self.selectBox) # self.queryTextEdit.setSizePolicy(QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)) # self.queryTextEdit.setMinimumWidth(300) # self.connect(self.queryTextEdit, SIGNAL('returnPressed()'), self.executeQuery) gui.button(self.selectBox, self, "Open...", callback=self.openScript) gui.button(self.selectBox, self, "Save...", callback=self.saveScript) self.selectBox.setSizePolicy( QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding)) gui.button(self.selectBox, self, 'format SQL!', callback=self.format_sql, disabled=0) gui.button(self.selectBox, self, 'execute!', callback=self.executeQuery, disabled=0) self.domainBox = gui.widgetBox(self.controlArea, "Domain") self.domainLabel = gui.label(self.domainBox, self, '') # info self.infoBox = gui.widgetBox(self.controlArea, "Info") self.info = [] self.info.append(gui.label(self.infoBox, self, 'No data loaded.')) self.info.append(gui.label(self.infoBox, self, '')) self.resize(300, 300) self.cnxn = None def destroy(self, destroyWindow, destroySubWindows): self.allSQLSelectWidgets.remove(self) self.destroy(self, destroyWindow, destroySubWindows) def activateLoadedSettings(self): # print "activating", self.recentQueries, ", ",self.recentConnections self.query = self.lastQuery self.setConnectionList() def selectConnection(self, n): if n < len(self.recentConnections): name = self.recentConnections[n] self.recentConnections.remove(name) self.recentConnections.insert(0, name) if len(self.recentConnections) > 0: self.setConnectionList() self.connectDB(self.recentConnections[0]) def setInfo(self, info): for (i, s) in enumerate(info): self.info[i].setText(s) def setMeta(self): domain = self.data.domain # s = "Attrs:\n " + "\n ".join([str(i) for i in domain.attributes]) + "\n" + "Class:" + str(domain.classVar) # self.domainLabel.setText(s) # for i in domain.getmetas(): # self.propertyCheckBoxes[i].set() # checks whether any file widget knows of any variable from the current domain def attributesOverlap(self, domain): for fw in self.allFileWidgets: if fw != self and getattr(fw, "dataDomain", None): for var in domain: if var in fw.dataDomain: return True return False # Execute a query, create data from it and send it over the data channel def executeQuery(self, query=None, throughReload=0, DK=None, DC=None): self.connectDB() query = self.queryTextEdit.toPlainText() if query is None: query = str(self.queryTextEdit.toPlainText()) # try: self.pandas = psql.read_sql_query(query, self.cnxn) # except Exception: # self.setInfo(('Query failed:', str(''))) # df = pd.DataFrame() self.data = convert_dataframe_to_orange(self.pandas) self.send("Data", self.data) self.send("Pandas", self.pandas) self.setInfo( ('Query returned', 'Read ' + str(len(self.data)) + ' examples!')) self.send("Feature Definitions", self.data.domain) self.setMeta() self.lastQuery = query def format_sql(self): query = str(self.queryTextEdit.toPlainText()) str_sql = str(format_sql(query)) self.queryTextEdit.clear() self.queryTextEdit.insertPlainText(str_sql) def connectDB(self): if self.connectString is None: self.connectString = str(self.connectString) if self.connectString in self.recentConnections: self.recentConnections.remove(self.connectString) self.recentConnections.insert(0, self.connectString) print(self.connectString) self.cnxn = pyodbc.connect(self.connectString, autocommit=True) # set the query combo box def setConnectionList(self): self.connectCombo.clear() if not self.recentConnections: self.connectCombo.insertItem("(none)") else: self.connectLineEdit.setText(self.recentConnections[0]) for connection in self.recentConnections: self.connectCombo.insertItem(connection) self.connectCombo.updateGeometry() def openScript(self, filename=None): if self.queryFile is None: self.queryFile = '' if filename == None: self.queryFile = QFileDialog.getOpenFileName( self, 'Open SQL file', self.queryFile, 'SQL files (*.sql)\nAll files(*.*)') else: self.queryFile = filename if self.queryFile == "": return f = open(self.queryFile, 'r') self.queryTextEdit.setPlainText(f.read()) f.close() def saveScript(self): if self.queryFile is None: self.queryFile = '' self.queryFile = QFileDialog.getSaveFileName( self, 'Save SQL file', self.queryFile, 'SQL files (*.sql)\nAll files(*.*)') if self.queryFile: fn = "" head, tail = os.path.splitext(self.queryFile) if not tail: fn = head + ".sql" else: fn = self.queryFile f = open(fn, 'w') f.write(self.queryTextEdit.toPlainText()) f.close()
class TagHelpViewer( QWidget ): """ The tag help viewer widget """ def __init__( self, parent = None ): QWidget.__init__( self, parent ) self.__isEmpty = True self.__copyAvailable = False self.__clearButton = None self.__textEdit = None self.__header = None self.__copyButton = None self.__selectAllButton = None self.__createLayout( parent ) # create the context menu self.__menu = QMenu( self ) self.__selectAllMenuItem = self.__menu.addAction( PixmapCache().getIcon( 'selectall.png' ), 'Select All', self.__textEdit.selectAll ) self.__copyMenuItem = self.__menu.addAction( PixmapCache().getIcon( 'copytoclipboard.png' ), 'Copy', self.__textEdit.copy ) self.__menu.addSeparator() self.__clearMenuItem = self.__menu.addAction( PixmapCache().getIcon( 'trash.png' ), 'Clear', self.__clear ) self.__textEdit.setContextMenuPolicy( Qt.CustomContextMenu ) self.__textEdit.customContextMenuRequested.connect( self.__handleShowContextMenu ) self.__textEdit.copyAvailable.connect( self.__onCopyAvailable ) self.__updateToolbarButtons() return def __createLayout( self, parent ): " Helper to create the viewer layout " # __textEdit list area self.__textEdit = QPlainTextEdit( parent ) self.__textEdit.setLineWrapMode( QPlainTextEdit.NoWrap ) self.__textEdit.setFont( QFont( GlobalData().skin.baseMonoFontFace ) ) self.__textEdit.setReadOnly( True ) # Default font size is good enough for most of the systems. # 12.0 might be good only in case of the XServer on PC (Xming). # self.__textEdit.setFontPointSize( 12.0 ) # Buttons self.__selectAllButton = QAction( PixmapCache().getIcon( 'selectall.png' ), 'Select all', self ) self.__selectAllButton.triggered.connect(self.__textEdit.selectAll ) self.__copyButton = QAction( PixmapCache().getIcon( 'copytoclipboard.png' ), 'Copy to clipboard', self ) self.__copyButton.triggered.connect( self.__textEdit.copy ) spacer = QWidget() spacer.setSizePolicy( QSizePolicy.Expanding, QSizePolicy.Expanding ) self.__clearButton = QAction( PixmapCache().getIcon( 'trash.png' ), 'Clear all', self ) self.__clearButton.triggered.connect( self.__clear ) # Toolbar toolbar = QToolBar() toolbar.setOrientation( Qt.Vertical ) toolbar.setMovable( False ) toolbar.setAllowedAreas( Qt.LeftToolBarArea ) toolbar.setIconSize( QSize( 16, 16 ) ) toolbar.setFixedWidth( 28 ) toolbar.setContentsMargins( 0, 0, 0, 0 ) toolbar.addAction( self.__selectAllButton ) toolbar.addAction( self.__copyButton ) toolbar.addWidget( spacer ) toolbar.addAction( self.__clearButton ) self.__header = QLabel( "Signature: none" ) self.__header.setFrameStyle( QFrame.StyledPanel ) self.__header.setSizePolicy( QSizePolicy.Ignored, QSizePolicy.Fixed ) self.__header.setAutoFillBackground( True ) headerPalette = self.__header.palette() headerBackground = headerPalette.color( QPalette.Background ) headerBackground.setRgb( min( headerBackground.red() + 30, 255 ), min( headerBackground.green() + 30, 255 ), min( headerBackground.blue() + 30, 255 ) ) headerPalette.setColor( QPalette.Background, headerBackground ) self.__header.setPalette( headerPalette ) verticalLayout = QVBoxLayout() verticalLayout.setContentsMargins( 2, 2, 2, 2 ) verticalLayout.setSpacing( 2 ) verticalLayout.addWidget( self.__header ) verticalLayout.addWidget( self.__textEdit ) # layout layout = QHBoxLayout() layout.setContentsMargins( 0, 0, 0, 0 ) layout.setSpacing( 0 ) layout.addWidget( toolbar ) layout.addLayout( verticalLayout ) self.setLayout( layout ) return def __handleShowContextMenu( self, coord ): """ Show the context menu """ self.__selectAllMenuItem.setEnabled( not self.__isEmpty ) self.__copyMenuItem.setEnabled( self.__copyAvailable ) self.__clearMenuItem.setEnabled( not self.__isEmpty ) self.__menu.popup( QCursor.pos() ) return def __calltipDisplayable( self, calltip ): " True if calltip is displayable " if calltip is None: return False if calltip.strip() == "": return False return True def __docstringDisplayable( self, docstring ): " True if docstring is displayable " if docstring is None: return False if isinstance( docstring, dict ): if docstring[ "docstring" ].strip() == "": return False return True if docstring.strip() == "": return False return True def display( self, calltip, docstring ): " Displays the given help information " calltipDisplayable = self.__calltipDisplayable( calltip ) docstringDisplayable = self.__docstringDisplayable( docstring ) self.__isEmpty = True if calltipDisplayable or docstringDisplayable: self.__isEmpty = False if calltipDisplayable: if '\n' in calltip: calltip = calltip.split( '\n' )[ 0 ] self.__header.setText( "Signature: " + calltip.strip() ) else: self.__header.setText( "Signature: n/a" ) self.__textEdit.clear() if docstringDisplayable: if isinstance( docstring, dict ): docstring = docstring[ "docstring" ] self.__textEdit.insertPlainText( docstring ) self.__updateToolbarButtons() QApplication.processEvents() return def __updateToolbarButtons( self ): " Contextually updates toolbar buttons " self.__selectAllButton.setEnabled( not self.__isEmpty ) self.__copyButton.setEnabled( self.__copyAvailable ) self.__clearButton.setEnabled( not self.__isEmpty ) return def __clear( self ): " Triggers when the clear function is selected " self.__isEmpty = True self.__copyAvailable = False self.__header.setText( "Signature: none" ) self.__textEdit.clear() self.__updateToolbarButtons() return def __onCopyAvailable( self, isAvailable ): " Triggers on the copyAvailable signal " self.__copyAvailable = isAvailable self.__updateToolbarButtons() return
class MigrationWidget(QDialog): def __init__(self, parent=None): super(MigrationWidget, self).__init__(parent, Qt.WindowStaysOnTopHint) self._migration = {} vbox = QVBoxLayout(self) lbl_title = QLabel(self.tr("Current code:")) self.current_list = QListWidget() lbl_suggestion = QLabel(self.tr("Suggested changes:")) self.suggestion = QPlainTextEdit() self.suggestion.setReadOnly(True) self.btn_apply = QPushButton(self.tr("Apply change!")) hbox = QHBoxLayout() hbox.addSpacerItem(QSpacerItem(1, 0, QSizePolicy.Expanding)) hbox.addWidget(self.btn_apply) vbox.addWidget(lbl_title) vbox.addWidget(self.current_list) vbox.addWidget(lbl_suggestion) vbox.addWidget(self.suggestion) vbox.addLayout(hbox) self.connect(self.current_list, SIGNAL("itemClicked(QListWidgetItem*)"), self.load_suggestion) self.connect(self.btn_apply, SIGNAL("clicked()"), self.apply_changes) IDE.register_service('tab_migration', self) ExplorerContainer.register_tab(translations.TR_TAB_MIGRATION, self) def install_tab(self): ide = IDE.get_service('ide') self.connect(ide, SIGNAL("goingDown()"), self.close) def apply_changes(self): lineno = int(self.current_list.currentItem().data(Qt.UserRole)) lines = self._migration[lineno][0].split('\n') remove = -1 code = '' for line in lines: if line.startswith('-'): remove += 1 elif line.startswith('+'): code += '%s\n' % line[1:] main_container = IDE.get_service('main_container') if main_container: editorWidget = main_container.get_current_editor() block_start = editorWidget.document().findBlockByLineNumber(lineno) block_end = editorWidget.document().findBlockByLineNumber(lineno + remove) cursor = editorWidget.textCursor() cursor.setPosition(block_start.position()) cursor.setPosition(block_end.position(), QTextCursor.KeepAnchor) cursor.movePosition(QTextCursor.EndOfLine, QTextCursor.KeepAnchor) cursor.insertText(code[:-1]) def load_suggestion(self, item): lineno = int(item.data(Qt.UserRole)) lines = self._migration[lineno][0].split('\n') code = '' for line in lines: if line.startswith('+'): code += '%s\n' % line[1:] self.suggestion.setPlainText(code) main_container = IDE.get_service('main_container') if main_container: editorWidget = main_container.get_current_editor() if editorWidget: editorWidget.jump_to_line(lineno) editorWidget.setFocus() def refresh_lists(self, migration): self._migration = migration self.current_list.clear() base_lineno = -1 for lineno in sorted(migration.keys()): linenostr = 'L%s\n' % str(lineno + 1) data = migration[lineno] lines = data[0].split('\n') if base_lineno == data[1]: continue base_lineno = data[1] message = '' for line in lines: if line.startswith('-'): message += '%s\n' % line item = QListWidgetItem(linenostr + message) item.setToolTip(linenostr + message) item.setData(Qt.UserRole, lineno) self.current_list.addItem(item) def clear(self): """ Clear the widget """ self.current_list.clear() self.suggestion.clear() def reject(self): if self.parent() is None: self.emit(SIGNAL("dockWidget(PyQt_PyObject)"), self) def closeEvent(self, event): self.emit(SIGNAL("dockWidget(PyQt_PyObject)"), self) event.ignore()
class MigrationWidget(QDialog): def __init__(self, parent=None): super(MigrationWidget, self).__init__(parent, Qt.WindowStaysOnTopHint) self._migration = {} vbox = QVBoxLayout(self) lbl_title = QLabel(self.tr("Current code:")) self.current_list = QListWidget() lbl_suggestion = QLabel(self.tr("Suggested changes:")) self.suggestion = QPlainTextEdit() self.suggestion.setReadOnly(True) self.btn_apply = QPushButton(self.tr("Apply change!")) hbox = QHBoxLayout() hbox.addSpacerItem(QSpacerItem(1, 0, QSizePolicy.Expanding)) hbox.addWidget(self.btn_apply) vbox.addWidget(lbl_title) vbox.addWidget(self.current_list) vbox.addWidget(lbl_suggestion) vbox.addWidget(self.suggestion) vbox.addLayout(hbox) self.connect(self.current_list, SIGNAL("itemClicked(QListWidgetItem*)"), self.load_suggestion) self.connect(self.btn_apply, SIGNAL("clicked()"), self.apply_changes) IDE.register_service('tab_migration', self) ExplorerContainer.register_tab(translations.TR_TAB_MIGRATION, self) def install_tab(self): ide = IDE.get_service('ide') self.connect(ide, SIGNAL("goingDown()"), self.close) def apply_changes(self): lineno = int(self.current_list.currentItem().data(Qt.UserRole)) lines = self._migration[lineno][0].split('\n') remove = -1 code = '' for line in lines: if line.startswith('-'): remove += 1 elif line.startswith('+'): code += '%s\n' % line[1:] main_container = IDE.get_service('main_container') if main_container: editorWidget = main_container.get_current_editor() block_start = editorWidget.document().findBlockByLineNumber(lineno) block_end = editorWidget.document().findBlockByLineNumber( lineno + remove) cursor = editorWidget.textCursor() cursor.setPosition(block_start.position()) cursor.setPosition(block_end.position(), QTextCursor.KeepAnchor) cursor.movePosition(QTextCursor.EndOfLine, QTextCursor.KeepAnchor) cursor.insertText(code[:-1]) def load_suggestion(self, item): lineno = int(item.data(Qt.UserRole)) lines = self._migration[lineno][0].split('\n') code = '' for line in lines: if line.startswith('+'): code += '%s\n' % line[1:] self.suggestion.setPlainText(code) main_container = IDE.get_service('main_container') if main_container: editorWidget = main_container.get_current_editor() if editorWidget: editorWidget.jump_to_line(lineno) editorWidget.setFocus() def refresh_lists(self, migration): self._migration = migration self.current_list.clear() base_lineno = -1 for lineno in sorted(migration.keys()): linenostr = 'L%s\n' % str(lineno + 1) data = migration[lineno] lines = data[0].split('\n') if base_lineno == data[1]: continue base_lineno = data[1] message = '' for line in lines: if line.startswith('-'): message += '%s\n' % line item = QListWidgetItem(linenostr + message) item.setToolTip(linenostr + message) item.setData(Qt.UserRole, lineno) self.current_list.addItem(item) def clear(self): """ Clear the widget """ self.current_list.clear() self.suggestion.clear() def reject(self): if self.parent() is None: self.emit(SIGNAL("dockWidget(PyQt_PyObject)"), self) def closeEvent(self, event): self.emit(SIGNAL("dockWidget(PyQt_PyObject)"), self) event.ignore()
class Ui_ProjectorEditForm(object): """ The :class:`~openlp.core.lib.ui.projector.editform.Ui_ProjectorEditForm` class defines the user interface for the ProjectorEditForm dialog. """ def setupUi(self, edit_projector_dialog): """ Create the interface layout. """ edit_projector_dialog.setObjectName('edit_projector_dialog') edit_projector_dialog.setWindowIcon( build_icon(u':/icon/openlp-logo-32x32.png')) edit_projector_dialog.setMinimumWidth(400) edit_projector_dialog.setModal(True) # Define the basic layout self.dialog_layout = QGridLayout(edit_projector_dialog) self.dialog_layout.setObjectName('dialog_layout') self.dialog_layout.setSpacing(8) self.dialog_layout.setContentsMargins(8, 8, 8, 8) # IP Address self.ip_label = QLabel(edit_projector_dialog) self.ip_label.setObjectName('projector_edit_ip_label') self.ip_text = QLineEdit(edit_projector_dialog) self.ip_text.setObjectName('projector_edit_ip_text') self.dialog_layout.addWidget(self.ip_label, 0, 0) self.dialog_layout.addWidget(self.ip_text, 0, 1) # Port number self.port_label = QLabel(edit_projector_dialog) self.port_label.setObjectName('projector_edit_ip_label') self.port_text = QLineEdit(edit_projector_dialog) self.port_text.setObjectName('projector_edit_port_text') self.dialog_layout.addWidget(self.port_label, 1, 0) self.dialog_layout.addWidget(self.port_text, 1, 1) # PIN self.pin_label = QLabel(edit_projector_dialog) self.pin_label.setObjectName('projector_edit_pin_label') self.pin_text = QLineEdit(edit_projector_dialog) self.pin_label.setObjectName('projector_edit_pin_text') self.dialog_layout.addWidget(self.pin_label, 2, 0) self.dialog_layout.addWidget(self.pin_text, 2, 1) # Name self.name_label = QLabel(edit_projector_dialog) self.name_label.setObjectName('projector_edit_name_label') self.name_text = QLineEdit(edit_projector_dialog) self.name_text.setObjectName('projector_edit_name_text') self.dialog_layout.addWidget(self.name_label, 3, 0) self.dialog_layout.addWidget(self.name_text, 3, 1) # Location self.location_label = QLabel(edit_projector_dialog) self.location_label.setObjectName('projector_edit_location_label') self.location_text = QLineEdit(edit_projector_dialog) self.location_text.setObjectName('projector_edit_location_text') self.dialog_layout.addWidget(self.location_label, 4, 0) self.dialog_layout.addWidget(self.location_text, 4, 1) # Notes self.notes_label = QLabel(edit_projector_dialog) self.notes_label.setObjectName('projector_edit_notes_label') self.notes_text = QPlainTextEdit(edit_projector_dialog) self.notes_text.setObjectName('projector_edit_notes_text') self.dialog_layout.addWidget(self.notes_label, 5, 0, alignment=QtCore.Qt.AlignTop) self.dialog_layout.addWidget(self.notes_text, 5, 1) # Time for the buttons self.button_box = QDialogButtonBox(QDialogButtonBox.Help | QDialogButtonBox.Save | QDialogButtonBox.Cancel) self.dialog_layout.addWidget(self.button_box, 8, 0, 1, 2) def retranslateUi(self, edit_projector_dialog): if self.new_projector: title = translate('OpenLP.ProjectorEditForm', 'Add New Projector') self.projector.port = PJLINK_PORT else: title = translate('OpenLP.ProjectorEditForm', 'Edit Projector') edit_projector_dialog.setWindowTitle(title) self.ip_label.setText( translate('OpenLP.ProjectorEditForm', 'IP Address')) self.ip_text.setText(self.projector.ip) self.ip_text.setFocus() self.port_label.setText( translate('OpenLP.ProjectorEditForm', 'Port Number')) self.port_text.setText(str(self.projector.port)) self.pin_label.setText(translate('OpenLP.ProjectorEditForm', 'PIN')) self.pin_text.setText(self.projector.pin) self.name_label.setText(translate('OpenLP.ProjectorEditForm', 'Name')) self.name_text.setText(self.projector.name) self.location_label.setText( translate('OpenLP.ProjectorEditForm', 'Location')) self.location_text.setText(self.projector.location) self.notes_label.setText(translate('OpenLP.ProjectorEditForm', 'Notes')) self.notes_text.clear() self.notes_text.insertPlainText(self.projector.notes)
class ExpensesDialog(QDialog): holdc = {} def __init__(self, session, parent=None): super(ExpensesDialog, self).__init__(parent) self.session = session session = self.pullOnes('session', session) self.sessionname = str(session['name']) + ' Session' self.pagetitle = self.sessionname self.tableFont = QFont('Century Gothic', 8) #self.tableFont.setFamily('Century Gothic') self.tableHeaderStyle = "::section {" "background-color: teal; color:white}" #pull all CA self.editID = 0 self.hold_account = {} self.hold_expenses = {} self.hold_expensesGroup = {} from_label = QLabel('From:') to_label = QLabel('To:') self.fromData = QDateEdit() self.toData = QDateEdit() currentDate = QDate() self.fromData.setDate(currentDate.currentDate()) self.fromData.setCalendarPopup(True) self.toData.setDate(currentDate.currentDate()) self.toData.setCalendarPopup(True) self.pull_btn = QPushButton() self.pull_btn.setText("Load") h_pull_box = QHBoxLayout() h_pull_box.addWidget(from_label) h_pull_box.addWidget(self.fromData) h_pull_box.addWidget(to_label) h_pull_box.addWidget(self.toData) h_pull_box.addWidget(self.pull_btn) expensesGroup = self.pullGroupExpenses() account = self.pullAccount() self.expenseGroupText = QLabel('Category') self.expenseGroupData = QComboBox() self.expenseGroupData.currentIndexChanged.connect(self.reloadExpenses) self.expenseText = QLabel('Expenses') self.expenseData = QComboBox() self.amountText = QLabel('Amount') self.amountData = QLineEdit() self.amountData.setPlaceholderText('0000.00') self.tellerText = QLabel('Teller/Reciept No.') self.tellerData = QLineEdit() self.tellerData.setPlaceholderText('xxxxxxxxx') self.accountText = QLabel('Account') self.accountData = QComboBox() self.dateText = QLabel('Date') self.dateData = QDateEdit() self.dateData.setDate(currentDate.currentDate()) self.dateData.setCalendarPopup(True) self.descriptionText = QLabel('Brief Description') self.descriptionData = QPlainTextEdit() self.descriptionData.move(200, 100) hboz = QHBoxLayout() self.gender = QLabel('State') self.r1 = QRadioButton('Expenses') self.r1.setChecked(True) self.r2 = QRadioButton('Refund') hboz.addWidget(self.r1) hboz.addWidget(self.r2) i = 0 for a in expensesGroup: self.hold_expensesGroup[i] = a['id'] tex = str(a['name']).upper() self.expenseGroupData.addItem(tex) i += 1 i = 0 exp_key = self.hold_expensesGroup[self.expenseGroupData.currentIndex()] expenses = self.pullExpenses(exp_key) for a in expenses: self.hold_expenses[i] = a['id'] tex = str(a['name']).upper() self.expenseData.addItem(tex) i += 1 i = 0 for a in account: self.hold_account[i] = a['id'] tex = str(a['name']).upper() self.accountData.addItem(tex) i += 1 self.FormLayout = QFormLayout() self.FormLayout.addRow(self.expenseGroupText, self.expenseGroupData) self.FormLayout.addRow(self.expenseText, self.expenseData) self.FormLayout.addRow(self.accountText, self.accountData) self.FormLayout.addRow(self.tellerText, self.tellerData) self.FormLayout.addRow(self.amountText, self.amountData) self.FormLayout.addRow(self.gender, hboz) self.FormLayout.addRow(self.dateText, self.dateData) self.FormLayout.addRow(self.descriptionText, self.descriptionData) groupBox1 = QGroupBox('Add Expenses') groupBox1.setLayout(self.FormLayout) self.pb = QPushButton() self.pb.setObjectName("Add") self.pb.setText("Add Expenses") self.pb1 = QPushButton() self.pb1.setObjectName("Edit") self.pb1.setText("Edit Row") self.pb1.setEnabled(False) self.pb2 = QPushButton() self.pb2.setObjectName("Close") self.pb2.setText("Close") self.pb3 = QPushButton() self.pb3.setObjectName("Delete") self.pb3.setText("Delete Row") self.pb3.setEnabled(False) self.pb4 = QPushButton() self.pb4.setObjectName("Reset") self.pb4.setText("Reset") self.pb4.hide() self.pb5 = QPushButton() self.pb5.setObjectName("Change") self.pb5.setText("Change Expenses") self.pb5.hide() self.pb6 = QPushButton() self.pb6.setObjectName("Clear") self.pb6.setText("Clear Selection") self.pb6.setEnabled(False) hbo = QHBoxLayout() hbo.addWidget(self.pb) hbo.addWidget(self.pb5) hbo.addWidget(self.pb4) hbo.addWidget(self.pb2) groupBox2 = QGroupBox('Expenses Data') groupBox2.setLayout(hbo) self.cols = ['SN', 'EXPENSES', 'ACCOUNT', 'AMOUNT', 'DATE'] al = self.pullExpensesData() if len(al) > 0: al = al else: al = {} self.table = QTableWidget() header = self.table.horizontalHeader() header.setResizeMode(QHeaderView.ResizeToContents) header.setStretchLastSection(True) header.setStyleSheet(self.tableHeaderStyle) vheader = self.table.verticalHeader() vheader.setStyleSheet(self.tableHeaderStyle) # Body self.table.setWindowTitle("Expenses") self.table.resize(300, 250) self.table.setFont(self.tableFont) self.table.setSortingEnabled(2) #self.table.resizeColumnsToContents() self.table.setRowCount(len(al)) self.table.setColumnCount(len(self.cols)) self.table.setHorizontalHeaderLabels(self.cols) self.table.setContextMenuPolicy(Qt.CustomContextMenu) self.table.customContextMenuRequested.connect(self.handleHeaderMenu) self.table.hideColumn(0) self.table.setSelectionMode(QAbstractItemView.MultiSelection) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) i = 0 for q in al: #row id self.table.setItem(i, 0, QTableWidgetItem(str(q['id']))) self.table.setItem(i, 1, QTableWidgetItem(str(q['expensename']).upper())) self.table.setItem(i, 2, QTableWidgetItem(str(q['accountname']).upper())) zamt = str("{:,}".format(float(q['amount']))) self.table.setItem(i, 3, QTableWidgetItem(zamt)) damz = float(q['datepaid']) damt = datetime.utcfromtimestamp(damz).strftime('%d-%m-%Y') self.table.setItem(i, 4, QTableWidgetItem(str(damt))) i += 1 self.table.itemSelectionChanged.connect(self.confirmSelection) self.table.resizeRowsToContents() v_pull_box = QVBoxLayout() self.h1_pull_box = QVBoxLayout() self.h1_pull_box.addWidget(self.table) v_pull_box.addLayout(h_pull_box) v_pull_box.addLayout(self.h1_pull_box) h2_pull_box = QHBoxLayout() h2_pull_box.addWidget(self.pb1) h2_pull_box.addWidget(self.pb3) h2_pull_box.addWidget(self.pb6) v_pull_box.addLayout(h2_pull_box) groupBox3 = QGroupBox() groupBox3.setLayout(hbo) groupBox2.setLayout(v_pull_box) grid = QGridLayout() grid.addWidget(groupBox1, 0, 0) grid.addWidget(groupBox2, 0, 1, 2, 1) grid.addWidget(groupBox3, 1, 0) self.setLayout(grid) self.connect(self.pb, SIGNAL("clicked()"), lambda: self.button_click()) self.connect(self.pb1, SIGNAL("clicked()"), lambda: self.button_editshow()) self.connect(self.pb2, SIGNAL("clicked()"), lambda: self.button_close(self)) self.connect(self.pb3, SIGNAL("clicked()"), lambda: self.button_delete()) self.connect(self.pb4, SIGNAL("clicked()"), lambda: self.button_reset()) self.connect(self.pb5, SIGNAL("clicked()"), lambda: self.button_edit()) self.connect(self.pb6, SIGNAL("clicked()"), lambda: self.button_clear()) self.connect(self.pull_btn, SIGNAL("clicked()"), lambda x=1: self.reloadTable(x)) self.setWindowTitle(self.pagetitle) def handleHeaderMenu(self, pos): print('column(%d)' % self.table.horizontalHeader().logicalIndexAt(pos)) menu = QMenu() menu.addAction('Add') menu.addAction('Delete') menu.exec_(QCursor.pos()) def pullGroupExpenses(self): cn = Db() arr = cn.selectn('datas', '', '', {"pubID": 15, "active": 0}) return arr def pullExpenses(self, a): cn = Db() arr = cn.selectn('datas', '', '', {"subID": a}) return arr def pullAccount(self): cn = Db() arr = cn.selectn('datas', '', '', {"pubID": 20, "active": 0}) return arr def pullExpensesData(self): st_date = self.fromData.date().toPyDate() en_date = self.toData.date().toPyDate() st_date = time.mktime(st_date.timetuple()) en_date = time.mktime(en_date.timetuple()) db = 'school_expenses' + str(self.session) cn = Db() arr = cn.selectExpenseDate(db, st_date, en_date) return arr def mySelectTable(self): ''' get the selected rpws in a table returns list or row ids ''' sels = self.table.selectedIndexes() sels = self.table.selectionModel().selectedRows() park = [] park1 = [] for j in sels: park.append(j.row()) for i in set(park): selected = self.table.item(i, 0).text() park1.append(selected) return park1 def editRow(self, a): _session = self.session g = Db() db = 'school_expenses' + str(_session) data = g.selectn(db, '', 1, {'id': a}) if len(data) > 0: self.editID = int(data['id']) if float(data['amount']) < 0: amt = float(data['amount']) * -1 self.amountData.setText(str(amt)) self.r1.setChecked(True) else: amt = float(data['amount']) self.amountData.setText(str(amt)) self.r2.setChecked(True) self.descriptionData.clear() self.descriptionData.insertPlainText(str(data['description'])) self.tellerData.setText(str(data['teller'])) acID = self.hold_account.keys()[self.hold_account.values().index( data['accountID'])] self.accountData.setCurrentIndex(acID) exID = self.hold_expenses.keys()[self.hold_expenses.values().index( data['expenseID'])] self.expenseData.setCurrentIndex(exID) def reloadExpenses(self): cat = self.hold_expensesGroup[self.expenseGroupData.currentIndex()] expenses = self.pullExpenses(cat) self.expenseData.clear() self.hold_expenses = {} i = 0 for a in expenses: self.hold_expenses[i] = a['id'] tex = str(a['name']).upper() self.expenseData.addItem(tex) i += 1 def reloadTable(self, a): data = self.pullExpensesData() self.table.close() self.table = QTableWidget() header = self.table.horizontalHeader() header.setResizeMode(QHeaderView.ResizeToContents) header.setStretchLastSection(True) header.setStyleSheet(self.tableHeaderStyle) vheader = self.table.verticalHeader() vheader.setStyleSheet(self.tableHeaderStyle) # Body self.table.setWindowTitle("Expenses") self.table.resize(300, 250) self.table.setFont(self.tableFont) self.table.setSortingEnabled(2) self.table.resizeColumnsToContents() self.table.setRowCount(len(data)) self.table.setColumnCount(len(self.cols)) self.table.setHorizontalHeaderLabels(self.cols) self.table.setContextMenuPolicy(Qt.CustomContextMenu) self.table.customContextMenuRequested.connect(self.handleHeaderMenu) self.table.hideColumn(0) self.table.setSelectionMode(QAbstractItemView.MultiSelection) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) i = 0 for q in data: #row id self.table.setItem(i, 0, QTableWidgetItem(str(q['id']))) self.table.setItem(i, 1, QTableWidgetItem(str(q['expensename']).upper())) self.table.setItem(i, 2, QTableWidgetItem(str(q['accountname']).upper())) zamt = str("{:,}".format(float(q['amount']))) self.table.setItem(i, 3, QTableWidgetItem(zamt)) damz = float(q['datepaid']) damt = datetime.utcfromtimestamp(damz).strftime('%d-%m-%Y') self.table.setItem(i, 4, QTableWidgetItem(str(damt))) i += 1 self.table.itemSelectionChanged.connect(self.confirmSelection) self.table.resizeRowsToContents() self.h1_pull_box.addWidget(self.table) self.table.show() def pullOnes(self, a, b): cn = Db() arr = cn.selectn(a, '', 1, {'id': b}) return arr def confirmSelection(self): item = self.mySelectTable() if len(item) == 1: self.pb1.setEnabled(True) self.pb3.setEnabled(True) self.pb6.setEnabled(True) elif len(item) > 1: self.pb1.setEnabled(False) self.pb3.setEnabled(True) self.pb6.setEnabled(True) else: self.pb1.setEnabled(False) self.pb3.setEnabled(False) self.pb6.setEnabled(False) def button_close(self, b): b.close() def button_editshow(self): item = self.mySelectTable() self.editRow(item[0]) self.pb.hide() self.pb4.show() self.pb5.show() def button_delete(self): item = self.mySelectTable() _session = self.session g = Db() db = 'school_expenses' + str(_session) for j in item: g.delete(db, {'id': j}) self.reloadTable(1) def button_edit(self): _session = self.session _amount = self.amountData.text() _teller = self.tellerData.text() _date = self.dateData.date().toPyDate() _date = time.mktime(_date.timetuple()) _description = self.descriptionData.toPlainText() _account = self.hold_account[self.accountData.currentIndex()] _expense = self.hold_expenses[self.expenseData.currentIndex()] if self.r1.isChecked(): _amount = float(_amount) else: _amount = float(_amount) * -1 arr = {} if _amount and not (_amount == 0) and int(_expense) > 0 and int(_account) > 0: arr['amount'] = _amount arr['datepaid'] = _date arr['description'] = _description arr['accountID'] = _account arr['expenseID'] = _expense arr['teller'] = _teller ups = {} ups['id'] = self.editID if int(self.editID) > 0: db = 'school_expenses' + str(_session) g = Db() g.update(db, arr, ups) if int(self.editID) > 0: self.button_reset() def button_reset(self): self.reloadTable(1) self.amountData.setText('') self.descriptionData.clear() self.tellerData.setText('') self.pb4.hide() self.pb5.hide() self.pb.show() self.editID = 0 self.button_clear() self.confirmSelection() def button_clear(self): self.table.selectionModel().clearSelection() def button_click(self): _session = self.session _amount = self.amountData.text() _teller = self.tellerData.text() _date = self.dateData.date().toPyDate() _date = time.mktime(_date.timetuple()) _description = self.descriptionData.toPlainText() _account = self.hold_account[self.accountData.currentIndex()] _expense = self.hold_expenses[self.expenseData.currentIndex()] if self.r1.isChecked(): _amount = float(_amount) else: _amount = float(_amount) * -1 arr = {} if _amount and not (_amount == 0) and int(_expense) > 0 and int(_account) > 0: arr['amount'] = _amount arr['datepaid'] = _date arr['description'] = _description arr['accountID'] = _account arr['expenseID'] = _expense arr['teller'] = _teller db = 'school_expenses' + str(_session) g = Db() ins = g.insert(db, arr) if int(ins) > 0: self.button_reset()
class MigrationWidget(QWidget): def __init__(self): super(MigrationWidget, self).__init__() self._migration = {} vbox = QVBoxLayout(self) lbl_title = QLabel(self.tr("Current code:")) self.current_list = QListWidget() lbl_suggestion = QLabel(self.tr("Suggested changes:")) self.suggestion = QPlainTextEdit() self.suggestion.setReadOnly(True) self.btn_apply = QPushButton(self.tr("Apply change!")) hbox = QHBoxLayout() hbox.addSpacerItem(QSpacerItem(1, 0, QSizePolicy.Expanding)) hbox.addWidget(self.btn_apply) vbox.addWidget(lbl_title) vbox.addWidget(self.current_list) vbox.addWidget(lbl_suggestion) vbox.addWidget(self.suggestion) vbox.addLayout(hbox) self.connect(self.current_list, SIGNAL("itemClicked(QListWidgetItem*)"), self.load_suggestion) self.connect(self.btn_apply, SIGNAL("clicked()"), self.apply_changes) def apply_changes(self): lineno = int(self.current_list.currentItem().data(Qt.UserRole)) lines = self._migration.migration_data[lineno][0].split('\n') remove = -1 code = '' for line in lines: if line.startswith('-'): remove += 1 elif line.startswith('+'): code += '%s\n' % line[1:] main_container = IDE.get_service('main_container') if main_container: editorWidget = main_container.get_actual_editor() block_start = editorWidget.document().findBlockByLineNumber(lineno) block_end = editorWidget.document().findBlockByLineNumber( lineno + remove) cursor = editorWidget.textCursor() cursor.setPosition(block_start.position()) cursor.setPosition(block_end.position(), QTextCursor.KeepAnchor) cursor.movePosition(QTextCursor.EndOfLine, QTextCursor.KeepAnchor) cursor.insertText(code[:-1]) def load_suggestion(self, item): lineno = int(item.data(Qt.UserRole)) lines = self._migration.migration_data[lineno][0].split('\n') code = '' for line in lines: if line.startswith('+'): code += '%s\n' % line[1:] self.suggestion.setPlainText(code) main_container = IDE.get_service('main_container') if main_container: editorWidget = main_container.get_actual_editor() if editorWidget: editorWidget.jump_to_line(lineno) editorWidget.setFocus() def refresh_lists(self, migration): self._migration = migration self.current_list.clear() base_lineno = -1 for lineno in sorted(migration.migration_data.keys()): linenostr = 'L%s\n' % str(lineno + 1) data = migration.migration_data[lineno] lines = data[0].split('\n') if base_lineno == data[1]: continue base_lineno = data[1] message = '' for line in lines: if line.startswith('-'): message += '%s\n' % line item = QListWidgetItem(linenostr + message) item.setToolTip(linenostr + message) item.setData(Qt.UserRole, lineno) self.current_list.addItem(item) def clear(self): """ Clear the widget """ self.current_list.clear() self.suggestion.clear()
class TagHelpViewer(QWidget): """ The tag help viewer widget """ def __init__(self, parent=None): QWidget.__init__(self, parent) self.__isEmpty = True self.__copyAvailable = False self.__clearButton = None self.__textEdit = None self.__header = None self.__copyButton = None self.__selectAllButton = None self.__createLayout(parent) # create the context menu self.__menu = QMenu(self) self.__selectAllMenuItem = self.__menu.addAction( PixmapCache().getIcon('selectall.png'), 'Select All', self.__textEdit.selectAll) self.__copyMenuItem = self.__menu.addAction( PixmapCache().getIcon('copytoclipboard.png'), 'Copy', self.__textEdit.copy) self.__menu.addSeparator() self.__clearMenuItem = self.__menu.addAction( PixmapCache().getIcon('trash.png'), 'Clear', self.__clear) self.__textEdit.setContextMenuPolicy(Qt.CustomContextMenu) self.__textEdit.customContextMenuRequested.connect( self.__handleShowContextMenu) self.__textEdit.copyAvailable.connect(self.__onCopyAvailable) self.__updateToolbarButtons() return def __createLayout(self, parent): " Helper to create the viewer layout " # __textEdit list area self.__textEdit = QPlainTextEdit(parent) self.__textEdit.setLineWrapMode(QPlainTextEdit.NoWrap) self.__textEdit.setFont(QFont(GlobalData().skin.baseMonoFontFace)) self.__textEdit.setReadOnly(True) # Default font size is good enough for most of the systems. # 12.0 might be good only in case of the XServer on PC (Xming). # self.__textEdit.setFontPointSize( 12.0 ) # Buttons self.__selectAllButton = QAction( PixmapCache().getIcon('selectall.png'), 'Select all', self) self.__selectAllButton.triggered.connect(self.__textEdit.selectAll) self.__copyButton = QAction( PixmapCache().getIcon('copytoclipboard.png'), 'Copy to clipboard', self) self.__copyButton.triggered.connect(self.__textEdit.copy) spacer = QWidget() spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.__clearButton = QAction(PixmapCache().getIcon('trash.png'), 'Clear all', self) self.__clearButton.triggered.connect(self.__clear) # Toolbar toolbar = QToolBar() toolbar.setOrientation(Qt.Vertical) toolbar.setMovable(False) toolbar.setAllowedAreas(Qt.LeftToolBarArea) toolbar.setIconSize(QSize(16, 16)) toolbar.setFixedWidth(28) toolbar.setContentsMargins(0, 0, 0, 0) toolbar.addAction(self.__selectAllButton) toolbar.addAction(self.__copyButton) toolbar.addWidget(spacer) toolbar.addAction(self.__clearButton) self.__header = QLabel("Signature: none") self.__header.setFrameStyle(QFrame.StyledPanel) self.__header.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Fixed) self.__header.setAutoFillBackground(True) headerPalette = self.__header.palette() headerBackground = headerPalette.color(QPalette.Background) headerBackground.setRgb(min(headerBackground.red() + 30, 255), min(headerBackground.green() + 30, 255), min(headerBackground.blue() + 30, 255)) headerPalette.setColor(QPalette.Background, headerBackground) self.__header.setPalette(headerPalette) verticalLayout = QVBoxLayout() verticalLayout.setContentsMargins(2, 2, 2, 2) verticalLayout.setSpacing(2) verticalLayout.addWidget(self.__header) verticalLayout.addWidget(self.__textEdit) # layout layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) layout.addWidget(toolbar) layout.addLayout(verticalLayout) self.setLayout(layout) return def __handleShowContextMenu(self, coord): """ Show the context menu """ self.__selectAllMenuItem.setEnabled(not self.__isEmpty) self.__copyMenuItem.setEnabled(self.__copyAvailable) self.__clearMenuItem.setEnabled(not self.__isEmpty) self.__menu.popup(QCursor.pos()) return def __calltipDisplayable(self, calltip): " True if calltip is displayable " if calltip is None: return False if calltip.strip() == "": return False return True def __docstringDisplayable(self, docstring): " True if docstring is displayable " if docstring is None: return False if isinstance(docstring, dict): if docstring["docstring"].strip() == "": return False return True if docstring.strip() == "": return False return True def display(self, calltip, docstring): " Displays the given help information " calltipDisplayable = self.__calltipDisplayable(calltip) docstringDisplayable = self.__docstringDisplayable(docstring) self.__isEmpty = True if calltipDisplayable or docstringDisplayable: self.__isEmpty = False if calltipDisplayable: if '\n' in calltip: calltip = calltip.split('\n')[0] self.__header.setText("Signature: " + calltip.strip()) else: self.__header.setText("Signature: n/a") self.__textEdit.clear() if docstringDisplayable: if isinstance(docstring, dict): docstring = docstring["docstring"] self.__textEdit.insertPlainText(docstring) self.__updateToolbarButtons() QApplication.processEvents() return def __updateToolbarButtons(self): " Contextually updates toolbar buttons " self.__selectAllButton.setEnabled(not self.__isEmpty) self.__copyButton.setEnabled(self.__copyAvailable) self.__clearButton.setEnabled(not self.__isEmpty) return def __clear(self): " Triggers when the clear function is selected " self.__isEmpty = True self.__copyAvailable = False self.__header.setText("Signature: none") self.__textEdit.clear() self.__updateToolbarButtons() return def __onCopyAvailable(self, isAvailable): " Triggers on the copyAvailable signal " self.__copyAvailable = isAvailable self.__updateToolbarButtons() return