]> Softwares of Agnibho - ddstorm.git/blob - panes.py
Added documentation
[ddstorm.git] / panes.py
1 '''
2 This module provides the application panes containing essential
3 functionalities.
4 '''
5 '''
6 Copyright (c) 2015 Agnibho Mondal
7 All rights reserved
8
9 This file is part of DDStorm.
10
11 DDStorm is free software: you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation, either version 3 of the License, or
14 (at your option) any later version.
15
16 DDStorm is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with DDStorm. If not, see <http://www.gnu.org/licenses/>.
23 '''
24
25 from PyQt5 import QtWidgets, QtCore
26
27 class Symptoms(QtWidgets.QFrame):
28 ''' Provides the widget for symptoms input '''
29
30 # List to hold the symptoms
31 sympList=[]
32
33 # Signal to notify any change in input
34 changed=QtCore.pyqtSignal(list)
35
36 def __init__(self, auto):
37 '''
38 Initiate the symptom input pane. Takes a list of string as
39 argument. The list is used as the auto-complete list during
40 user input.
41
42 Parameter:
43 auto - A list of string containing all available symptoms for
44 autocomplete.
45 '''
46 super(Symptoms, self).__init__()
47 self.auto=auto
48 self.initUI()
49
50 def initUI(self):
51 ''' Initiate the user interface '''
52 self.label=QtWidgets.QLabel("Symptoms")
53 self.label.setStyleSheet("font-size:18px")
54
55 self.listWidget=QtWidgets.QListWidget(self)
56 self.listWidget.setStyleSheet("font-size:14px")
57 self.listWidget.setSelectionMode(4)
58
59 self.rm=QtWidgets.QPushButton("Remove")
60 self.rm.clicked.connect(self.remove)
61
62 self.cl=QtWidgets.QPushButton("Clear All")
63 self.cl.clicked.connect(self.removeAll)
64
65 self.browse=QtWidgets.QPushButton("Browse Symptoms")
66 self.browse.clicked.connect(self.browseSymptoms)
67
68 self.add=QtWidgets.QPushButton("Add")
69 self.add.clicked.connect(self.addItem)
70
71 self.new=QtWidgets.QLineEdit(self)
72 self.new.returnPressed.connect(self.addItem)
73 self.completer=QtWidgets.QCompleter(self.auto)
74 self.completer.setCaseSensitivity(0)
75 self.completer.setCompletionMode(2)
76 self.new.setCompleter(self.completer)
77
78 self.browser=SymptomBrowser(self.auto)
79 self.browser.added.connect(self.addItem)
80
81 hboxt=QtWidgets.QHBoxLayout()
82 hboxt.addWidget(self.new)
83 hboxt.addWidget(self.add)
84 hboxb=QtWidgets.QHBoxLayout()
85 hboxb.addWidget(self.rm)
86 hboxb.addWidget(self.cl)
87 hboxb.addWidget(self.browse)
88 vbox=QtWidgets.QVBoxLayout()
89 vbox.addWidget(self.label)
90 vbox.addLayout(hboxt)
91 vbox.addWidget(self.listWidget)
92 vbox.addLayout(hboxb)
93 self.setLayout(vbox)
94
95 def addItem(self, text=""):
96 ''' Add a new symptom '''
97 if(not text):
98 text=self.new.text()
99 if(len(text)>0):
100 if(text in self.sympList):
101 QtWidgets.QMessageBox.information(self, "Duplicate Symptom", "'"+text+"' has already been added to the symptom list.")
102 elif(text in self.auto):
103 QtWidgets.QListWidgetItem(text, self.listWidget)
104 self.sympList.append(text)
105 self.new.clear()
106 self.changed.emit(list(self.sympList))
107 else:
108 QtWidgets.QMessageBox.warning(self, "Symptom Unvailable", "'"+text+"' is not available in the current Library.")
109
110 def remove(self, all=False):
111 ''' Remove selected symptoms '''
112 if(len(self.listWidget.selectedItems())>0):
113 for item in self.listWidget.selectedItems():
114 self.sympList.remove(item.text())
115 self.listWidget.takeItem(self.listWidget.row(item))
116 self.changed.emit(list(self.sympList))
117
118 def removeAll(self):
119 ''' Clear all symptoms '''
120 self.listWidget.clear()
121 del self.sympList[:]
122 self.changed.emit(list(self.sympList))
123
124 def browseSymptoms(self):
125 ''' Open the symptom browser '''
126 self.browser.exec_()
127
128 def getList(self):
129 ''' Return a list of all symptoms '''
130 return self.sympList
131
132
133 class SymptomBrowser(QtWidgets.QDialog):
134 '''
135 Provides a dialog with a list of symptoms for alternative user
136 input.
137 '''
138 added=QtCore.pyqtSignal(str)
139
140 def __init__(self, items):
141 ''' Initiate the input dialog '''
142 super(SymptomBrowser, self).__init__()
143 self.setWindowTitle("Choose Symptom")
144 self.items=items
145 self.initUI()
146
147 def initUI(self):
148 ''' Initiate the dialog interface '''
149 self.search=QtWidgets.QLineEdit()
150 self.search.textChanged.connect(self.refresh)
151 self.listItems=QtWidgets.QListWidget()
152 self.listItems.activated.connect(self.sendUp)
153
154 layout=QtWidgets.QVBoxLayout(self)
155 layout.addWidget(self.search)
156 layout.addWidget(self.listItems)
157
158 self.listItems.addItems(self.items)
159 self.search.setFocus()
160
161 def refresh(self):
162 ''' Refresh the symptom list based on search term '''
163 term=self.search.text()
164 buff=[]
165 for i in self.items:
166 if(term.lower() in i.lower()):
167 buff.append(i)
168 self.listItems.clear()
169 self.listItems.addItems(buff)
170
171 def sendUp(self):
172 ''' Emit signal and close when a symptom is selected '''
173 self.added.emit(self.listItems.currentItem().text())
174 self.close()
175
176
177 class Differentials(QtWidgets.QFrame):
178 ''' Provides the widget for differential diagnosis output '''
179 data=[]
180
181 def __init__(self):
182 ''' Initiate the diagnosis output pane '''
183 super(Differentials, self).__init__()
184 self.initUI()
185
186 def initUI(self):
187 ''' Initiate the user interface '''
188 self.label=QtWidgets.QLabel("Differential Diagnosis")
189 self.label.setStyleSheet("font-size:18px")
190 self.listWidget=QtWidgets.QListWidget(self)
191 self.listWidget.setStyleSheet("font-size:14px")
192 self.listWidget.setSelectionMode(0)
193 box=QtWidgets.QVBoxLayout()
194 box.addWidget(self.label)
195 box.addWidget(self.listWidget)
196 self.setLayout(box)
197
198 def update(self, data):
199 '''
200 Update the outut pane with updated diagnosis list.
201
202 Parameter:
203 data - List of strings containing new list of differential
204 diagnosis
205 '''
206 self.data=data
207 self.listWidget.clear()
208 if(self.data):
209 for d in self.data:
210 QtWidgets.QListWidgetItem(d, self.listWidget)
211
212 def getList(self):
213 ''' Return a list of current differential diagnosis '''
214 return self.data