class PluginsManagerWidget(QDialog): """Plugin Manager widget""" def __init__(self, parent): QDialog.__init__(self, parent, Qt.Dialog) self.setWindowTitle(translations.TR_PLUGIN_MANAGER) self.resize(700, 600) vbox = QVBoxLayout(self) self._tabs = QTabWidget() vbox.addWidget(self._tabs) self._txt_data = QTextBrowser() self._txt_data.setOpenLinks(False) vbox.addWidget(QLabel(translations.TR_PROJECT_DESCRIPTION)) vbox.addWidget(self._txt_data) # Footer hbox = QHBoxLayout() btn_close = QPushButton(translations.TR_CLOSE) btnReload = QPushButton(translations.TR_RELOAD) hbox.addWidget(btn_close) hbox.addSpacerItem(QSpacerItem(1, 0, QSizePolicy.Expanding)) hbox.addWidget(btnReload) vbox.addLayout(hbox) self.overlay = ui_tools.Overlay(self) self.overlay.hide() self._oficial_available = [] self._community_available = [] self._locals = [] self._updates = [] self._loading = True self._requirements = {} self.connect(btnReload, SIGNAL("clicked()"), self._reload_plugins) self.thread = ThreadLoadPlugins(self) self.connect(self.thread, SIGNAL("finished()"), self._load_plugins_data) self.connect(self.thread, SIGNAL("plugin_downloaded(PyQt_PyObject)"), self._after_download_plugin) self.connect(self.thread, SIGNAL("plugin_manually_installed(PyQt_PyObject)"), self._after_manual_install_plugin) self.connect(self.thread, SIGNAL("plugin_uninstalled(PyQt_PyObject)"), self._after_uninstall_plugin) self.connect(self._txt_data, SIGNAL("anchorClicked(const QUrl&)"), self._open_link) self.connect(btn_close, SIGNAL('clicked()'), self.close) self.overlay.show() self._reload_plugins() def show_plugin_info(self, data): """Takes data argument, format for HTML and display it""" plugin_description = data[2].replace('\n', '<br>') html = HTML_STYLE.format(name=data[0], version=data[1], description=plugin_description, author=data[3], link=data[4]) self._txt_data.setHtml(html) def _open_link(self, url): """Takes an url argument and open the link on web browser""" link = url.toString() if link.startswith('/plugins/'): link = 'http://ninja-ide.org' + link webbrowser.open(link) def _reload_plugins(self): """Reload all plugins""" self.overlay.show() self._loading = True self.thread.runnable = self.thread.collect_data_thread self.thread.start() def _after_manual_install_plugin(self, plugin): """After installing, take plugin and add it to installedWidget items""" data = {} data['name'] = plugin[0] data['version'] = plugin[1] data['description'] = '' data['authors'] = '' data['home'] = '' self._installedWidget.add_table_items([data]) def _after_download_plugin(self, plugin): """After installing, take plugin and add it to installedWidget items""" oficial_plugin = _get_plugin(plugin[0], self._oficial_available) community_plugin = _get_plugin(plugin[0], self._community_available) if oficial_plugin: self._installedWidget.add_table_items([oficial_plugin]) self._availableOficialWidget.remove_item(plugin[0]) elif community_plugin: self._installedWidget.add_table_items([community_plugin]) self._availableCommunityWidget.remove_item(plugin[0]) def _after_uninstall_plugin(self, plugin): """After uninstall plugin,make available plugin corresponding to type""" oficial_plugin = _get_plugin(plugin[0], self._oficial_available) community_plugin = _get_plugin(plugin[0], self._community_available) if oficial_plugin: self._availableOficialWidget.add_table_items([oficial_plugin]) self._installedWidget.remove_item(plugin[0]) elif community_plugin: self._availableCommunityWidget.add_table_items([community_plugin]) self._installedWidget.remove_item(plugin[0]) def _load_plugins_data(self): """Load all the plugins data""" if self._loading: self._tabs.clear() self._updatesWidget = UpdatesWidget(self, copy(self._updates)) self._availableOficialWidget = AvailableWidget( self, copy(self._oficial_available)) self._availableCommunityWidget = AvailableWidget( self, copy(self._community_available)) self._installedWidget = InstalledWidget(self, copy(self._locals)) self._tabs.addTab(self._availableOficialWidget, translations.TR_OFFICIAL_AVAILABLE) self._tabs.addTab(self._availableCommunityWidget, translations.TR_COMMUNITY_AVAILABLE) self._tabs.addTab(self._updatesWidget, translations.TR_UPDATE) self._tabs.addTab(self._installedWidget, translations.TR_INSTALLED) self._manualWidget = ManualInstallWidget(self) self._tabs.addTab(self._manualWidget, translations.TR_MANUAL_INSTALL) self._loading = False self.overlay.hide() self.thread.wait() def download_plugins(self, plugs): """ Install """ self.overlay.show() self.thread.plug = plugs # set the function to run in the thread self.thread.runnable = self.thread.download_plugins_thread self.thread.start() def install_plugins_manually(self, plug): """Install plugin from local zip.""" self.overlay.show() self.thread.plug = plug # set the function to run in the thread self.thread.runnable = self.thread.manual_install_plugins_thread self.thread.start() def mark_as_available(self, plugs): """ Uninstall """ self.overlay.show() self.thread.plug = plugs # set the function to run in the thread self.thread.runnable = self.thread.uninstall_plugins_thread self.thread.start() def update_plugin(self, plugs): """ Update """ self.overlay.show() self.thread.plug = plugs # set the function to run in the thread self.thread.runnable = self.thread.update_plugin_thread self.thread.start() def reset_installed_plugins(self): """Reset all the installed plugins""" local_plugins = plugin_manager.local_plugins() plugins = _format_for_table(local_plugins) self._installedWidget.reset_table(plugins) def resizeEvent(self, event): """Handle Resize events""" self.overlay.resize(event.size()) event.accept()
class ThemesManagerWidget(QDialog): def __init__(self, parent): QDialog.__init__(self, parent, Qt.Dialog) self.setWindowTitle(self.tr("Themes Manager")) self.setModal(True) self.resize(700, 500) vbox = QVBoxLayout(self) self._tabs = QTabWidget() vbox.addWidget(self._tabs) btnReload = QPushButton(self.tr("Reload")) btnReload.setMaximumWidth(100) vbox.addWidget(btnReload) self.overlay = ui_tools.Overlay(self) self.overlay.show() self._schemes = [] self._loading = True self.downloadItems = [] #Load Themes with Thread self.connect(btnReload, SIGNAL("clicked()"), self._reload_themes) self._thread = ui_tools.ThreadCallback(self.execute_thread) self.connect(self._thread, SIGNAL("finished()"), self.load_skins_data) self._reload_themes() def _reload_themes(self): self.overlay.show() self._loading = True self._thread.execute = self.execute_thread self._thread.start() def load_skins_data(self): if self._loading: self._tabs.clear() self._schemeWidget = SchemeWidget(self, self._schemes) self._tabs.addTab(self._schemeWidget, self.tr("Editor Schemes")) self._loading = False self.overlay.hide() def download_scheme(self, scheme): self.overlay.show() self.downloadItems = scheme self._thread.execute = self._download_scheme_thread self._thread.start() def resizeEvent(self, event): self.overlay.resize(event.size()) event.accept() def execute_thread(self): try: descriptor_schemes = urllib2.urlopen(resources.SCHEMES_URL) schemes = json_manager.parse(descriptor_schemes) schemes = [[name, schemes[name]] for name in schemes] local_schemes = self.get_local_schemes() schemes = [schemes[i] for i in range(len(schemes)) if \ os.path.basename(schemes[i][1]) not in local_schemes] self._schemes = schemes except urllib2.URLError: self._schemes = [] def get_local_schemes(self): if not file_manager.folder_exists(resources.EDITOR_SKINS): file_manager.create_tree_folders(resources.EDITOR_SKINS) schemes = os.listdir(resources.EDITOR_SKINS) schemes = [s for s in schemes if s.endswith('.color')] return schemes def _download_scheme_thread(self): for d in self.downloadItems: self.download(d[1], resources.EDITOR_SKINS) def download(self, url, folder): fileName = os.path.join(folder, os.path.basename(url)) try: content = urllib2.urlopen(url) f = open(fileName, 'w') f.write(content.read()) f.close() except urllib2.URLError: return
class PluginsManagerWidget(QDialog): def __init__(self, parent): QDialog.__init__(self, parent, Qt.Dialog) self.setWindowTitle(self.tr("Plugins Manager")) self.resize(700, 600) vbox = QVBoxLayout(self) self._tabs = QTabWidget() vbox.addWidget(self._tabs) self._txt_data = QTextBrowser() self._txt_data.setOpenLinks(False) vbox.addWidget(QLabel(self.tr("Description:"))) vbox.addWidget(self._txt_data) # Footer hbox = QHBoxLayout() btn_close = QPushButton(self.tr('Close')) btnReload = QPushButton(self.tr("Reload")) hbox.addWidget(btn_close) hbox.addSpacerItem(QSpacerItem(1, 0, QSizePolicy.Expanding)) hbox.addWidget(btnReload) vbox.addLayout(hbox) self.overlay = ui_tools.Overlay(self) self.overlay.hide() self._oficial_available = [] self._community_available = [] self._locals = [] self._updates = [] self._loading = True self._requirements = {} self.connect(btnReload, SIGNAL("clicked()"), self._reload_plugins) self.thread = ThreadLoadPlugins(self) self.connect(self.thread, SIGNAL("finished()"), self._load_plugins_data) self.connect(self.thread, SIGNAL("plugin_downloaded(PyQt_PyObject)"), self._after_download_plugin) self.connect(self.thread, SIGNAL("plugin_uninstalled(PyQt_PyObject)"), self._after_uninstall_plugin) self.connect(self._txt_data, SIGNAL("anchorClicked(const QUrl&)"), self._open_link) self.connect(btn_close, SIGNAL('clicked()'), self.close) self.overlay.show() self._reload_plugins() def show_plugin_info(self, data): plugin_description = data[2].replace('\n', '<br>') html = HTML_STYLE.format(name=data[0], version=data[1], description=plugin_description, author=data[3], link=data[4]) self._txt_data.setHtml(html) def _open_link(self, url): link = url.toString() if link.startswith('/plugins/'): link = 'http://ninja-ide.org' + link webbrowser.open(link) def _reload_plugins(self): self.overlay.show() self._loading = True self.thread.runnable = self.thread.collect_data_thread self.thread.start() def _after_download_plugin(self, plugin): oficial_plugin = _get_plugin(plugin[0], self._oficial_available) community_plugin = _get_plugin(plugin[0], self._community_available) if oficial_plugin: self._installedWidget.add_table_items([oficial_plugin]) self._availableOficialWidget.remove_item(plugin[0]) elif community_plugin: self._installedWidget.add_table_items([community_plugin]) self._availableCommunityWidget.remove_item(plugin[0]) def _after_uninstall_plugin(self, plugin): #make available the plugin corresponding to the type oficial_plugin = _get_plugin(plugin[0], self._oficial_available) community_plugin = _get_plugin(plugin[0], self._community_available) if oficial_plugin: self._availableOficialWidget.add_table_items([oficial_plugin]) self._installedWidget.remove_item(plugin[0]) elif community_plugin: self._availableCommunityWidget.add_table_items([community_plugin]) self._installedWidget.remove_item(plugin[0]) def _load_plugins_data(self): if self._loading: self._tabs.clear() self._updatesWidget = UpdatesWidget(self, copy(self._updates)) self._availableOficialWidget = AvailableWidget(self, copy(self._oficial_available)) self._availableCommunityWidget = AvailableWidget(self, copy(self._community_available)) self._installedWidget = InstalledWidget(self, copy(self._locals)) self._tabs.addTab(self._availableOficialWidget, self.tr("Official Available")) self._tabs.addTab(self._availableCommunityWidget, self.tr("Community Available")) self._tabs.addTab(self._updatesWidget, self.tr("Updates")) self._tabs.addTab(self._installedWidget, self.tr("Installed")) self._loading = False self.overlay.hide() def download_plugins(self, plugs): """ Install """ self.overlay.show() self.thread.plug = plugs #set the function to run in the thread self.thread.runnable = self.thread.download_plugins_thread self.thread.start() def mark_as_available(self, plugs): """ Uninstall """ self.overlay.show() self.thread.plug = plugs #set the function to run in the thread self.thread.runnable = self.thread.uninstall_plugins_thread self.thread.start() def update_plugin(self, plugs): """ Update """ self.overlay.show() self.thread.plug = plugs #set the function to run in the thread self.thread.runnable = self.thread.update_plugin_thread self.thread.start() def reset_installed_plugins(self): local_plugins = plugin_manager.local_plugins() plugins = _format_for_table(local_plugins) self._installedWidget.reset_table(plugins) def resizeEvent(self, event): self.overlay.resize(event.size()) event.accept()
class NewSessionPageExamAnswers(QWizardPage): def __init__(self): super(NewSessionPageExamAnswers, self).__init__() self.setTitle(_('Selection of correct answers')) self.setSubTitle(_('Select the correct answers for each exam model')) layout = QFormLayout() self.setLayout(layout) self.tabs = QTabWidget() layout.addRow(self.tabs) self.paramNAlts = None self.paramNCols = None self.paramNPerm = None def initializePage(self): new_paramNAlts = self.field("paramNAlts") new_paramNCols = self.field("paramNCols") new_paramNPerm = self.field("paramNPerm") if (new_paramNAlts != self.paramNAlts or new_paramNCols != self.paramNCols or new_paramNPerm != self.paramNPerm): self.paramNAlts = new_paramNAlts self.paramNCols = new_paramNCols self.paramNPerm = new_paramNPerm self._initialize() def _initialize(self): ## self.paramTPerm = self.field("paramTPerm") self.tabs.clear() self.total_answers = 0 self.radioGroups = {} filas = int(self.paramNPerm.toString()) for x in range(filas): mygroupbox = QScrollArea() mygroupbox.setWidget(QWidget()) mygroupbox.setWidgetResizable(True) myform = QHBoxLayout(mygroupbox.widget()) cols = self.paramNCols.toString().split(',') ansID = 0 radioGroupList = {} for col in cols: mygroupboxCol = QGroupBox() myformCol = QFormLayout() mygroupboxCol.setLayout(myformCol) for y in range(int(col)): ansID += 1 radioGroupList[ansID] = QButtonGroup() layoutRow = QHBoxLayout() for j in range(int(self.paramNAlts.toString())): myradio = QRadioButton(chr(97 + j).upper()) layoutRow.addWidget(myradio) radioGroupList[ansID].addButton(myradio) self.total_answers += 1 myformCol.addRow(str(ansID), layoutRow) myform.addWidget(mygroupboxCol) self.radioGroups[chr(97 + x).upper()] = radioGroupList self.tabs.addTab(mygroupbox, _('Model ') + chr(97 + x).upper()) def _get_values(self, formated=False): response = dict() for k, v in self.radioGroups.iteritems(): answer = dict() for ak, av in v.iteritems(): answer[ak] = abs(int(av.checkedId())) - 1 if formated: answer = answer.values() response[k] = answer return response def _check_count_answers(self): local_radioGroups = self._get_values(formated=True) local_total_answers = sum(len(filter(lambda a: a != 0, v)) \ for v in local_radioGroups.itervalues()) return (self.total_answers == local_total_answers) def validatePage(self): valid = True msg = '' if not self._check_count_answers(): valid = False msg = _('You haven\'t entered the correct answer ' 'for some questions.') else: try: self.wizard().exam_config = utils.ExamConfig() # dimentions generation: dimensions = [] for c in self.paramNCols.toString().split(','): dimensions.append("%s,%s" % (self.paramNAlts.toString(), c)) self.wizard().exam_config.set_dimensions(';'.join(dimensions)) # solutions generation: current_solutions = self._get_values(formated=True) for k, v in current_solutions.iteritems(): self.wizard().exam_config.set_solutions(k, v) # students ids generation: self.wizard().exam_config.id_num_digits = \ int(self.field("paramNEIDs").toString()) except IOError: valid = False msg = _('The exam configuration file cannot be read.') except Exception as e: valid = False msg = _('The exam configuration file contains errors') if str(e): msg += ':<br><br>' + str(e) else: msg += '.' if not valid: QMessageBox.critical(self, _('Error'), msg) return valid def nextId(self): return WizardNewSession.PageIdFiles
class LanguagesManagerWidget(QDialog): def __init__(self, parent): QDialog.__init__(self, parent, Qt.Dialog) self.setWindowTitle(self.tr("Language Manager")) self.resize(700, 500) vbox = QVBoxLayout(self) self._tabs = QTabWidget() vbox.addWidget(self._tabs) btnReload = QPushButton(self.tr("Reload")) btnReload.setMaximumWidth(100) vbox.addWidget(btnReload) self.overlay = ui_tools.Overlay(self) self.overlay.show() self._languages = [] self._loading = True self.downloadItems = [] #Load Themes with Thread self.connect(btnReload, SIGNAL("clicked()"), self._reload_languages) self._thread = ui_tools.ThreadCallback(self.execute_thread) self.connect(self._thread, SIGNAL("finished()"), self.load_languages_data) self._reload_languages() def _reload_languages(self): self.overlay.show() self._loading = True self._thread.execute = self.execute_thread self._thread.start() def load_languages_data(self): if self._loading: self._tabs.clear() self._languageWidget = languageWidget(self, self._languages) self._tabs.addTab(self._languageWidget, self.tr("Languages")) self._loading = False self.overlay.hide() def download_language(self, language): self.overlay.show() self.downloadItems = language self._thread.execute = self._download_language_thread self._thread.start() def resizeEvent(self, event): self.overlay.resize(event.size()) event.accept() def execute_thread(self): try: descriptor_languages = urllib2.urlopen(resources.LANGUAGES_URL) languages = json_manager.parse(descriptor_languages) languages = [[name, languages[name]] for name in languages] local_languages = self.get_local_languages() languages = [languages[i] for i in range(len(languages)) if \ os.path.basename(languages[i][1]) not in local_languages] self._languages = languages except urllib2.URLError: self._languages = [] def get_local_languages(self): if not file_manager.folder_exists(resources.LANGS_DOWNLOAD): file_manager.create_tree_folders(resources.LANGS_DOWNLOAD) languages = os.listdir(resources.LANGS_DOWNLOAD) + \ os.listdir(resources.LANGS) languages = [s for s in languages if s.endswith('.qm')] return languages def _download_language_thread(self): for d in self.downloadItems: self.download(d[1], resources.LANGS_DOWNLOAD) def download(self, url, folder): fileName = os.path.join(folder, os.path.basename(url)) try: content = urllib2.urlopen(url) f = open(fileName, 'wb') f.write(content.read()) f.close() except urllib2.URLError: return
class ThemesManagerWidget(QDialog): def __init__(self, parent): QDialog.__init__(self, parent, Qt.Dialog) self.setWindowTitle(self.tr("Themes Manager")) self.resize(700, 500) vbox = QVBoxLayout(self) self._tabs = QTabWidget() vbox.addWidget(self._tabs) # Footer hbox = QHBoxLayout() btn_close = QPushButton(self.tr('Close')) btnReload = QPushButton(self.tr("Reload")) hbox.addWidget(btn_close) hbox.addSpacerItem(QSpacerItem(1, 0, QSizePolicy.Expanding)) hbox.addWidget(btnReload) vbox.addLayout(hbox) self.overlay = ui_tools.Overlay(self) self.overlay.show() self._schemes = [] self._loading = True self.downloadItems = [] #Load Themes with Thread self.connect(btnReload, SIGNAL("clicked()"), self._reload_themes) self._thread = ui_tools.ThreadExecution(self.execute_thread) self.connect(self._thread, SIGNAL("finished()"), self.load_skins_data) self.connect(btn_close, SIGNAL('clicked()'), self.close) self._reload_themes() def _reload_themes(self): self.overlay.show() self._loading = True self._thread.execute = self.execute_thread self._thread.start() def load_skins_data(self): if self._loading: self._tabs.clear() self._schemeWidget = SchemeWidget(self, self._schemes) self._tabs.addTab(self._schemeWidget, self.tr("Editor Schemes")) self._loading = False self.overlay.hide() self._thread.wait() def download_scheme(self, scheme): self.overlay.show() self.downloadItems = scheme self._thread.execute = self._download_scheme_thread self._thread.start() def resizeEvent(self, event): self.overlay.resize(event.size()) event.accept() def execute_thread(self): try: descriptor_schemes = urlopen(resources.SCHEMES_URL) schemes = json_manager.parse(descriptor_schemes) schemes = [(d['name'], d['download']) for d in schemes] local_schemes = self.get_local_schemes() schemes = [ schemes[i] for i in range(len(schemes)) if os.path.basename(schemes[i][1]) not in local_schemes ] self._schemes = schemes except URLError: self._schemes = [] def get_local_schemes(self): if not file_manager.folder_exists(resources.EDITOR_SKINS): file_manager.create_tree_folders(resources.EDITOR_SKINS) schemes = os.listdir(resources.EDITOR_SKINS) schemes = [s for s in schemes if s.lower().endswith('.color')] return schemes def _download_scheme_thread(self): for d in self.downloadItems: self.download(d[1], resources.EDITOR_SKINS) def download(self, url, folder): fileName = os.path.join(folder, os.path.basename(url)) try: content = urlopen(url) with open(fileName, 'w') as f: f.write(content.read()) except URLError: return
class ThemesManagerWidget(QDialog): def __init__(self, parent): QDialog.__init__(self, parent, Qt.Dialog) self.setWindowTitle(self.tr("Themes Manager")) self.resize(700, 500) vbox = QVBoxLayout(self) self._tabs = QTabWidget() vbox.addWidget(self._tabs) # Footer hbox = QHBoxLayout() btn_close = QPushButton(self.tr('Close')) btnReload = QPushButton(self.tr("Reload")) hbox.addWidget(btn_close) hbox.addSpacerItem(QSpacerItem(1, 0, QSizePolicy.Expanding)) hbox.addWidget(btnReload) vbox.addLayout(hbox) self.overlay = ui_tools.Overlay(self) self.overlay.show() self._schemes = [] self._loading = True self.downloadItems = [] #Load Themes with Thread self.connect(btnReload, SIGNAL("clicked()"), self._reload_themes) self._thread = ui_tools.ThreadExecution(self.execute_thread) self.connect(self._thread, SIGNAL("finished()"), self.load_skins_data) self.connect(btn_close, SIGNAL('clicked()'), self.close) self._reload_themes() def _reload_themes(self): self.overlay.show() self._loading = True self._thread.execute = self.execute_thread self._thread.start() def load_skins_data(self): if self._loading: self._tabs.clear() self._schemeWidget = SchemeWidget(self, self._schemes) self._tabs.addTab(self._schemeWidget, self.tr("Editor Schemes")) self._loading = False self.overlay.hide() def download_scheme(self, scheme): self.overlay.show() self.downloadItems = scheme self._thread.execute = self._download_scheme_thread self._thread.start() def resizeEvent(self, event): self.overlay.resize(event.size()) event.accept() def execute_thread(self): try: descriptor_schemes = urlopen(resources.SCHEMES_URL) schemes = json_manager.parse(descriptor_schemes) schemes = [(d['name'], d['download']) for d in schemes] local_schemes = self.get_local_schemes() schemes = [schemes[i] for i in range(len(schemes)) if os.path.basename(schemes[i][1]) not in local_schemes] self._schemes = schemes except URLError: self._schemes = [] def get_local_schemes(self): if not file_manager.folder_exists(resources.EDITOR_SKINS): file_manager.create_tree_folders(resources.EDITOR_SKINS) schemes = os.listdir(resources.EDITOR_SKINS) schemes = [s for s in schemes if s.endswith('.color')] return schemes def _download_scheme_thread(self): for d in self.downloadItems: self.download(d[1], resources.EDITOR_SKINS) def download(self, url, folder): fileName = os.path.join(folder, os.path.basename(url)) try: content = urlopen(url) f = open(fileName, 'w') f.write(content.read()) f.close() except URLError: return
class PluginsManagerWidget(QDialog): def __init__(self, parent): QDialog.__init__(self, parent, Qt.Dialog) self.setWindowTitle(self.tr("Plugins Manager")) self.setModal(True) self.resize(700, 500) vbox = QVBoxLayout(self) self._tabs = QTabWidget() vbox.addWidget(self._tabs) btnReload = QPushButton(self.tr("Reload")) btnReload.setMaximumWidth(100) vbox.addWidget(btnReload) self.overlay = ui_tools.Overlay(self) self.overlay.hide() self._oficial_available = [] self._community_available = [] self._locals = [] self._updates = [] self._loading = True self.connect(btnReload, SIGNAL("clicked()"), self._reload_plugins) self.thread = ThreadLoadPlugins(self) self.connect(self.thread, SIGNAL("finished()"), self._load_plugins_data) self.connect(self.thread, SIGNAL("plugin_downloaded(PyQt_PyObject)"), self._after_download_plugin) self.connect(self.thread, SIGNAL("plugin_uninstalled(PyQt_PyObject)"), self._after_uninstall_plugin) self.overlay.show() self._reload_plugins() def _reload_plugins(self): self.overlay.show() self._loading = True self.thread.runnable = self.thread.collect_data_thread self.thread.start() def _after_download_plugin(self, plugin): oficial_plugin = _get_plugin(plugin[0], self._oficial_available) community_plugin = _get_plugin(plugin[0], self._community_available) if oficial_plugin: self._installedWidget.add_table_items([oficial_plugin]) self._availableOficialWidget.remove_item(plugin[0]) elif community_plugin: self._installedWidget.add_table_items([community_plugin]) self._availableCommunityWidget.remove_item(plugin[0]) def _after_uninstall_plugin(self, plugin): #make available the plugin corresponding to the type oficial_plugin = _get_plugin(plugin[0], self._oficial_available) community_plugin = _get_plugin(plugin[0], self._community_available) if oficial_plugin: self._availableOficialWidget.add_table_items([oficial_plugin]) self._installedWidget.remove_item(plugin[0]) elif community_plugin: self._availableCommunityWidget.add_table_items([community_plugin]) self._installedWidget.remove_item(plugin[0]) def _load_plugins_data(self): if self._loading: self._tabs.clear() self._updatesWidget = UpdatesWidget(self, copy(self._updates)) self._availableOficialWidget = AvailableWidget(self, copy(self._oficial_available)) self._availableCommunityWidget = AvailableWidget(self, copy(self._community_available)) self._installedWidget = InstalledWidget(self, copy(self._locals)) self._tabs.addTab(self._availableOficialWidget, self.tr("Official Available")) self._tabs.addTab(self._availableCommunityWidget, self.tr("Community Available")) self._tabs.addTab(self._updatesWidget, self.tr("Updates")) self._tabs.addTab(self._installedWidget, self.tr("Installed")) self._loading = False self.overlay.hide() def download_plugins(self, plugs): """ Install """ self.overlay.show() self.thread.plug = plugs #set the function to run in the thread self.thread.runnable = self.thread.download_plugins_thread self.thread.start() def mark_as_available(self, plugs): """ Uninstall """ self.overlay.show() self.thread.plug = plugs #set the function to run in the thread self.thread.runnable = self.thread.uninstall_plugins_thread self.thread.start() def update_plugin(self, plugs): """ Update """ self.overlay.show() self.thread.plug = plugs #set the function to run in the thread self.thread.runnable = self.thread.update_plugin_thread self.thread.start() def reset_installed_plugins(self): local_plugins = plugin_manager.local_plugins() plugins = _format_for_table(local_plugins) self._installedWidget.reset_table(plugins) def resizeEvent(self, event): self.overlay.resize(event.size()) event.accept()
class Panel(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.clean_up_queue = [] self.summoner = SummonerData() self.summoner.getStaticData() ### Search Bar ### ################## #label self.search_label = QLabel(self) self.search_label.move(20, 15) self.search_label.resize(220, 25) self.search_label.setText('Enter summoner name(s):') self.search_label.setStyleSheet("QLabel {font:14pt}") #text field self.search_field = QLineEdit(self) self.search_field.move(260, 15) self.search_field.resize(250, 25) self.search_field.setPlaceholderText("ex: mcnuggets, teltor, ...") self.search_field.setFocusPolicy(Qt.ClickFocus) #search button self.search_button = QPushButton(self) self.search_button.move(520, 15) self.search_button.resize(150, 25) self.search_button.setText('Search Summoner') #region combobox self.region_list = QComboBox(self) self.region_list.move(680, 15) self.region_list.resize(75, 25) regions = ['NA', 'LAN', 'BR', 'LAS', 'EUW', 'EUNE', 'TR', 'RU', 'OCE'] self.region_list.addItems(regions) #error label self.error_label = QLabel(self) self.error_label.move(775, 15) self.error_label.resize(160, 25) self.error_label.setStyleSheet("QLabel {font:14pt}") ### Summoner Information ### ############################ #summoner Icon label self.icon_label = QLabel(self) self.icon_label.setScaledContents(True) self.icon_label.move(260, 50) self.icon_label.resize(110, 110) #name label self.name_label = QLabel(self) self.name_label.move(380, 50) self.name_label.resize(620, 50) self.name_label.setText('SUMMONER NAME') self.name_label.setStyleSheet("QLabel {font:32pt}") #rank label self.rank_label = QLabel(self) self.rank_label.move(380, 100) self.rank_label.resize(200, 60) self.rank_label.setText('summoner rank') self.rank_label.setStyleSheet("QLabel {font:18pt}") #miniseries labels self.series_labels = {} self.pixmap_win = QPixmap() self.pixmap_loss = QPixmap() self.pixmap_n = QPixmap() self.pixmap_win.load("./images/win.png") self.pixmap_loss.load("./images/loss.png") self.pixmap_n.load("./images/n.png") xPos = 600 for x in range(5): match_label = QLabel(self) match_label.move(xPos, 120) match_label.resize(35, 35) match_label.setScaledContents(True) match_label.hide() self.series_labels[x] = match_label xPos += 40 #mastery image labels print 'loading mastery images ...' self.ferocity_tree_images = self.getMasteryImages( self.summoner.ferocityMasteryTree()) self.cunning_tree_images = self.getMasteryImages( self.summoner.cunningMasteryTree()) self.resolve_tree_images = self.getMasteryImages( self.summoner.resolveMasteryTree()) print 'Done' #champion icon image labels print 'loading champion icon images ...' self.championIcons = self.getChampionIconImages( self.summoner.championList()) print 'Done' #overview widget self.overview_widget = QWidget() self.overview_menu = QTabWidget(self.overview_widget) self.overview_menu.resize(720, 270) #runes widget self.runes_widget = QWidget() self.runes_menu = QTabWidget(self.runes_widget) self.runes_menu.resize(720, 270) #masteries widget self.masteries_widget = QWidget() self.masteries_menu = QTabWidget(self.masteries_widget) self.masteries_menu.resize(720, 270) #summoner menu self.menu = QTabWidget(self) self.menu.move(260, 180) self.menu.resize(720, 300) self.menu.addTab(self.overview_widget, "Overview") self.menu.addTab(self.runes_widget, "Runes") self.menu.addTab(self.masteries_widget, "Masteries") self.menu.hide() #summoners buttons self.button_list = {} yPos = 150 for x in range(10): sum_button = QPushButton(self) sum_button.move(50, yPos) sum_button.resize(150, 25) sum_button.hide() self.button_list[x] = sum_button yPos += 25 ### Connecting Widgets ### ########################## self.connect(self.search_button, QtCore.SIGNAL("clicked()"), self.getData) self.connect(self.search_button, QtCore.SIGNAL("clicked()"), self.getRankedData) self.connect(self.button_list[0], QtCore.SIGNAL("clicked()"), lambda: self.displayData(str(self.button_list[0].text()))) self.connect(self.button_list[1], QtCore.SIGNAL("clicked()"), lambda: self.displayData(str(self.button_list[1].text()))) self.connect(self.button_list[2], QtCore.SIGNAL("clicked()"), lambda: self.displayData(str(self.button_list[2].text()))) self.connect(self.button_list[3], QtCore.SIGNAL("clicked()"), lambda: self.displayData(str(self.button_list[3].text()))) self.connect(self.button_list[4], QtCore.SIGNAL("clicked()"), lambda: self.displayData(str(self.button_list[4].text()))) self.connect(self.button_list[5], QtCore.SIGNAL("clicked()"), lambda: self.displayData(str(self.button_list[5].text()))) self.connect(self.button_list[6], QtCore.SIGNAL("clicked()"), lambda: self.displayData(str(self.button_list[6].text()))) self.connect(self.button_list[7], QtCore.SIGNAL("clicked()"), lambda: self.displayData(str(self.button_list[7].text()))) self.connect(self.button_list[8], QtCore.SIGNAL("clicked()"), lambda: self.displayData(str(self.button_list[8].text()))) self.connect(self.button_list[9], QtCore.SIGNAL("clicked()"), lambda: self.displayData(str(self.button_list[9].text()))) ### Window Configuration ### ############################ #window settings self.setGeometry(200, 150, 1000, 500) self.setMaximumSize(1000, 500) self.setWindowTitle('summoner App') self.show() ### GUI methods ### ################### ############### GUI get methods ############### #get data related to given summoner names def getData(self): self.cleanUp() name_list = str(self.search_field.text()).replace( ' ', '').lower().split(',') region = str(self.region_list.currentText()).lower() if name_list != ['']: try: self.summoner.getSummonerData(name_list, region) for x in range(len(name_list)): sum_name = self.summoner.getName(name_list[x]) if sum_name != None: self.button_list[x].setText(sum_name) self.clean_up_queue.append(self.button_list[x]) else: self.button_list[x].setText(name_list[x]) self.clean_up_queue.append(self.button_list[x]) self.button_list[x].setEnabled(False) self.button_list[x].show() except RiotError as e: response = e.message print response if response == 'ServiceUnavailable': self.error_label.setText(response) elif response == '429': self.error_label.setText('Rate limit reached') elif response == 'InternalServerError': self.error_label.setText(response) elif response == 'Unauthorized': self.error_label.setText('Invalid Input') elif response == 'ServerError': self.error_label.setText(response) else: self.error_label.setText('Not Found') except KeyError as k: self.error_label.setText('Invalid Input') #get summoner ranked data def getRankedData(self): if str(self.search_field.text()) != '': region = str(self.region_list.currentText()).lower() try: self.summoner.getRankedData(region) except RiotError: print 'Rank info not found' #get mastery images def getMasteryImages(self, masteryList): pixmap_list = collections.OrderedDict() empty_spaces = 0 for row in masteryList: if len(row['masteryTreeItems']) == 2: #if len(row) == 3: row['masteryTreeItems'].append(None) #row.append(None) for element in row['masteryTreeItems']: #for element in row: if element != None: pixmap = QPixmap() pixmap.loadFromData( self.summoner.getImage( 'mastery', str(element['masteryId']) + '.png')) pixmap_list[element['masteryId']] = pixmap else: pixmap_list['null' + str(empty_spaces)] = None empty_spaces += 1 return pixmap_list #get champion icon images def getChampionIconImages(self, clist): pixmap_list = {} for champ in clist.values(): pixmap = QPixmap() pixmap.loadFromData( self.summoner.getImage('champion', champ['key'] + '.png')) pixmap_list[champ['name']] = pixmap return pixmap_list ############### GUI update methods ############### #removes previous data from GUI def cleanUp(self): self.error_label.setText("") #clears summoner info self.icon_label.setPixmap(QPixmap()) self.icon_label.setStyleSheet("QLabel {}") self.name_label.setText("") self.rank_label.setText("") #hides elements in clean up queue for x in self.clean_up_queue: x.hide() x.setEnabled(True) #display data def displayData(self, buttonName): sum_ID = self.summoner.getID(buttonName) self.displayIcon(buttonName.replace(' ', '').lower()) self.name_label.setText(buttonName) self.displayRank(sum_ID) self.displayMenu(sum_ID) #display summoner icon def displayIcon(self, summoner_name): iconName = self.summoner.getIcon(summoner_name) iconPixmap = QPixmap() self.icon_label.setStyleSheet( "QLabel {border-style: outset; border-width: 3px; border-color: gold}" ) try: iconPixmap.loadFromData( self.summoner.getImage('profileicon', iconName)) self.icon_label.setPixmap(iconPixmap) except RiotError: iconPixmap.load("./images/no_image.png") self.icon_label.setPixmap(iconPixmap) #display summoner rank def displayRank(self, sumID): for x in range(len(self.series_labels)): self.series_labels[x].setPixmap(QPixmap()) try: tier = self.summoner.getTier(sumID) division = self.summoner.getDivision(sumID) points = self.summoner.getLeaguePoints(sumID) self.rank_label.setText(tier + ': ' + division + '\n' + str(points) + ' league points') if points == 100: self.displayMiniseries(sumID) except KeyError: self.rank_label.setText('UNRANKED') #display promotion series def displayMiniseries(self, sumID): progress = self.summoner.getRankSeries(sumID) i = 0 for x in progress: if x == 'W': self.series_labels[i].setPixmap(self.pixmap_win) elif x == 'L': self.series_labels[i].setPixmap(self.pixmap_loss) else: self.series_labels[i].setPixmap(self.pixmap_n) self.clean_up_queue.append(self.series_labels[i]) self.series_labels[i].show() i += 1 #display summoner menu def displayMenu(self, sumID): self.displayOverviewMenu(sumID) self.displayRuneMenu(sumID) self.displayMasteryMenu(sumID) self.clean_up_queue.append(self.menu) self.menu.show() #display overview menu def displayOverviewMenu(self, sumID): self.overview_menu.clear() overview_normal = OverviewWidget() overview_ranked_solo = OverviewWidget() overview_ranked_team = OverviewWidget() overview_champions = ChampionsWidget() overview_normal.showStats(self.summoner.getStats(sumID, 'Normal')) overview_ranked_solo.showStats( self.summoner.getStats(sumID, 'Ranked Solo')) overview_ranked_team.showStats( self.summoner.getStats(sumID, 'Ranked Team')) overview_champions.showStats(self.summoner.getChampionStats(sumID), self.championIcons) self.overview_menu.addTab(overview_normal, 'Normal') self.overview_menu.addTab(overview_ranked_solo, 'Ranked Solo') self.overview_menu.addTab(overview_ranked_team, 'Ranked Team') self.overview_menu.addTab(overview_champions, 'Champions') #display rune menu def displayRuneMenu(self, sumID): self.runes_menu.clear() for x in range(self.summoner.getNumOfRunePages(sumID)): rune_page = RuneWidget() rune_page.setSize(700, 225) rune_page.setName(self.summoner.getRunePageName(sumID, x)) rune_data = self.summoner.getRunes(sumID, x) if rune_data != None: for y in rune_data: rid = self.summoner.getRuneID(y) desc = self.summoner.runeDescription(rid) rname = self.summoner.runeName(rid) rune_page.addRune(rid, desc, rname) rune_page.showRunes() self.runes_menu.addTab(rune_page, str(x + 1)) #display mastery menu def displayMasteryMenu(self, sumID): self.masteries_menu.clear() for x in range(self.summoner.getNumOfMasteryPages(sumID)): mastery_page = MasteryWidget() mastery_page.setMasteryLabels(self.ferocity_tree_images, self.cunning_tree_images, self.resolve_tree_images) mastery_page.setName(self.summoner.getMasteryPageName(sumID, x)) mastery_data = self.summoner.getMasteries(sumID, x) if mastery_data != None: for y in mastery_data: mid = self.summoner.getMasteryID(y) rank = self.summoner.getMasteryRank(y) mastery_page.setMasteryRank(mid, rank) mastery_page.setTotalPoints() self.masteries_menu.addTab(mastery_page, str(x + 1))
class LanguagesManagerWidget(QDialog): def __init__(self, parent): QDialog.__init__(self, parent, Qt.Dialog) self.setWindowTitle(self.tr("Language Manager")) self.resize(700, 500) vbox = QVBoxLayout(self) self._tabs = QTabWidget() vbox.addWidget(self._tabs) # Footer hbox = QHBoxLayout() btn_close = QPushButton(self.tr('Close')) btnReload = QPushButton(self.tr("Reload")) hbox.addWidget(btn_close) hbox.addSpacerItem(QSpacerItem(1, 0, QSizePolicy.Expanding)) hbox.addWidget(btnReload) vbox.addLayout(hbox) self.overlay = ui_tools.Overlay(self) self.overlay.show() self._languages = [] self._loading = True self.downloadItems = [] #Load Themes with Thread self.connect(btnReload, SIGNAL("clicked()"), self._reload_languages) self._thread = ui_tools.ThreadExecution(self.execute_thread) self.connect(self._thread, SIGNAL("finished()"), self.load_languages_data) self.connect(btn_close, SIGNAL('clicked()'), self.close) self._reload_languages() def _reload_languages(self): self.overlay.show() self._loading = True self._thread.execute = self.execute_thread self._thread.start() def load_languages_data(self): if self._loading: self._tabs.clear() self._languageWidget = languageWidget(self, self._languages) self._tabs.addTab(self._languageWidget, self.tr("Languages")) self._loading = False self.overlay.hide() def download_language(self, language): self.overlay.show() self.downloadItems = language self._thread.execute = self._download_language_thread self._thread.start() def resizeEvent(self, event): self.overlay.resize(event.size()) event.accept() def execute_thread(self): try: descriptor_languages = urlopen(resources.LANGUAGES_URL) languages = json_manager.parse(descriptor_languages) languages = [[name, languages[name]] for name in languages] local_languages = self.get_local_languages() languages = [ languages[i] for i in range(len(languages)) if os.path.basename(languages[i][1]) not in local_languages ] self._languages = languages except URLError: self._languages = [] def get_local_languages(self): if not file_manager.folder_exists(resources.LANGS_DOWNLOAD): file_manager.create_tree_folders(resources.LANGS_DOWNLOAD) languages = os.listdir(resources.LANGS_DOWNLOAD) + \ os.listdir(resources.LANGS) languages = [s for s in languages if s.endswith('.qm')] return languages def _download_language_thread(self): for d in self.downloadItems: self.download(d[1], resources.LANGS_DOWNLOAD) def download(self, url, folder): fileName = os.path.join(folder, os.path.basename(url)) try: content = urlopen(url) f = open(fileName, 'wb') f.write(content.read()) f.close() except URLError: return
class Metadata(QWidget): def __init__(self): QWidget.__init__(self) self.tabs = QTabWidget() self.nometa = QLabel("No EXIF metadata found") self.nometa.setAlignment(Qt.AlignCenter) self.box = QHBoxLayout() self.setLayout(self.box) self.box.addWidget(self.tabs) self.box.addWidget(self.nometa) self.nometa.hide() self.tabs.show() self.tabs.setTabPosition(QTabWidget.East) def process(self, node): for idx in xrange(0, self.tabs.count()): widget = self.tabs.widget(idx) del widget self.tabs.clear() self.node = node file = self.node.open() tags = EXIF.process_file(file) if len(tags) == 0: self.nometa.setSizePolicy(self.tabs.sizePolicy()) self.tabs.hide() self.nometa.show() else: self.tabs.show() self.nometa.hide() sortedTags = {} for tag in tags.keys(): if tag not in ('JPEGThumbnail', 'TIFFThumbnail', 'Filename', 'EXIF MakerNote'): spaceidx = tag.find(" ") ifd = tag[:spaceidx].strip() if ifd == "Image": ifd = "IFD 0 (Image)" if ifd == "Thumbnail": ifd = "IFD 1 (Thumbnail)" key = tag[spaceidx:].strip() try: val = str(tags[tag]) except: val = "cannot be decoded" if ifd not in sortedTags.keys(): sortedTags[ifd] = [] sortedTags[ifd].append((key, val)) for ifd in sortedTags.keys(): table = QTableWidget(len(sortedTags[ifd]), 2) table.setShowGrid(False) table.setAlternatingRowColors(True) table.verticalHeader().hide() table.horizontalHeader().setClickable(False) table.horizontalHeader().setStretchLastSection(True) table.setHorizontalHeaderLabels(["Tag", "Value"]) table.setSelectionBehavior(QAbstractItemView.SelectRows) self.tabs.addTab(table, ifd) row = 0 for res in sortedTags[ifd]: key = QTableWidgetItem(res[0]) key.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled) val = QTableWidgetItem(res[1]) val.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled) table.setItem(row, 0, key) table.setItem(row, 1, val) row += 1 if 'JPEGThumbnail' in tags.keys(): label = QLabel() img = QImage() img.loadFromData(tags['JPEGThumbnail']) label.setPixmap(QPixmap.fromImage(img)) label.setAlignment(Qt.AlignCenter) self.tabs.addTab(label, "Embedded Thumbnail") if 'TIFFThumbnail' in tags.keys(): label = QLabel() img = QImage() img.loadFromData(tags['TIFFThumbnail']) label.setPixmap(QPixmap.fromImage(img)) label.setAlignment(Qt.AlignCenter) self.tabs.addTab(label, "Embedded Thumbnail") file.close()
class PluginsManagerWidget(QDialog): """Plugin Manager widget""" def __init__(self, parent): QDialog.__init__(self, parent, Qt.Dialog) self.setWindowTitle(translations.TR_PLUGIN_MANAGER) self.resize(700, 600) vbox = QVBoxLayout(self) self._tabs = QTabWidget() vbox.addWidget(self._tabs) self._txt_data = QTextBrowser() self._txt_data.setOpenLinks(False) vbox.addWidget(QLabel(translations.TR_PROJECT_DESCRIPTION)) vbox.addWidget(self._txt_data) # Footer hbox = QHBoxLayout() btn_close = QPushButton(translations.TR_CLOSE) btnReload = QPushButton(translations.TR_RELOAD) hbox.addWidget(btn_close) hbox.addSpacerItem(QSpacerItem(1, 0, QSizePolicy.Expanding)) hbox.addWidget(btnReload) vbox.addLayout(hbox) self.overlay = ui_tools.Overlay(self) self.overlay.hide() self._oficial_available = [] self._community_available = [] self._locals = [] self._updates = [] self._loading = True self._requirements = {} self.connect(btnReload, SIGNAL("clicked()"), self._reload_plugins) self.thread = ThreadLoadPlugins(self) self.connect(self.thread, SIGNAL("finished()"), self._load_plugins_data) self.connect(self.thread, SIGNAL("plugin_downloaded(PyQt_PyObject)"), self._after_download_plugin) self.connect(self.thread, SIGNAL("plugin_manually_installed(PyQt_PyObject)"), self._after_manual_install_plugin) self.connect(self.thread, SIGNAL("plugin_uninstalled(PyQt_PyObject)"), self._after_uninstall_plugin) self.connect(self._txt_data, SIGNAL("anchorClicked(const QUrl&)"), self._open_link) self.connect(btn_close, SIGNAL('clicked()'), self.close) self.overlay.show() self._reload_plugins() def show_plugin_info(self, data): """Takes data argument, format for HTML and display it""" plugin_description = data[2].replace('\n', '<br>') html = HTML_STYLE.format(name=data[0], version=data[1], description=plugin_description, author=data[3], link=data[4]) self._txt_data.setHtml(html) def _open_link(self, url): """Takes an url argument and open the link on web browser""" link = url.toString() if link.startswith('/plugins/'): link = 'http://ninja-ide.org' + link webbrowser.open(link) def _reload_plugins(self): """Reload all plugins""" self.overlay.show() self._loading = True self.thread.runnable = self.thread.collect_data_thread self.thread.start() def _after_manual_install_plugin(self, plugin): """After installing, take plugin and add it to installedWidget items""" data = {} data['name'] = plugin[0] data['version'] = plugin[1] data['description'] = '' data['authors'] = '' data['home'] = '' self._installedWidget.add_table_items([data]) def _after_download_plugin(self, plugin): """After installing, take plugin and add it to installedWidget items""" oficial_plugin = _get_plugin(plugin[0], self._oficial_available) community_plugin = _get_plugin(plugin[0], self._community_available) if oficial_plugin: self._installedWidget.add_table_items([oficial_plugin]) self._availableOficialWidget.remove_item(plugin[0]) elif community_plugin: self._installedWidget.add_table_items([community_plugin]) self._availableCommunityWidget.remove_item(plugin[0]) def _after_uninstall_plugin(self, plugin): """After uninstall plugin,make available plugin corresponding to type""" oficial_plugin = _get_plugin(plugin[0], self._oficial_available) community_plugin = _get_plugin(plugin[0], self._community_available) if oficial_plugin: self._availableOficialWidget.add_table_items([oficial_plugin]) self._installedWidget.remove_item(plugin[0]) elif community_plugin: self._availableCommunityWidget.add_table_items([community_plugin]) self._installedWidget.remove_item(plugin[0]) def _load_plugins_data(self): """Load all the plugins data""" if self._loading: self._tabs.clear() self._updatesWidget = UpdatesWidget(self, copy(self._updates)) self._availableOficialWidget = AvailableWidget(self, copy(self._oficial_available)) self._availableCommunityWidget = AvailableWidget(self, copy(self._community_available)) self._installedWidget = InstalledWidget(self, copy(self._locals)) self._tabs.addTab(self._availableOficialWidget, translations.TR_OFFICIAL_AVAILABLE) self._tabs.addTab(self._availableCommunityWidget, translations.TR_COMMUNITY_AVAILABLE) self._tabs.addTab(self._updatesWidget, translations.TR_UPDATE) self._tabs.addTab(self._installedWidget, translations.TR_INSTALLED) self._manualWidget = ManualInstallWidget(self) self._tabs.addTab(self._manualWidget, translations.TR_MANUAL_INSTALL) self._loading = False self.overlay.hide() self.thread.wait() def download_plugins(self, plugs): """ Install """ self.overlay.show() self.thread.plug = plugs #set the function to run in the thread self.thread.runnable = self.thread.download_plugins_thread self.thread.start() def install_plugins_manually(self, plug): """Install plugin from local zip.""" self.overlay.show() self.thread.plug = plug #set the function to run in the thread self.thread.runnable = self.thread.manual_install_plugins_thread self.thread.start() def mark_as_available(self, plugs): """ Uninstall """ self.overlay.show() self.thread.plug = plugs #set the function to run in the thread self.thread.runnable = self.thread.uninstall_plugins_thread self.thread.start() def update_plugin(self, plugs): """ Update """ self.overlay.show() self.thread.plug = plugs #set the function to run in the thread self.thread.runnable = self.thread.update_plugin_thread self.thread.start() def reset_installed_plugins(self): """Reset all the installed plugins""" local_plugins = plugin_manager.local_plugins() plugins = _format_for_table(local_plugins) self._installedWidget.reset_table(plugins) def resizeEvent(self, event): """Handle Resize events""" self.overlay.resize(event.size()) event.accept()
class Metadata(QWidget): def __init__(self): QWidget.__init__(self) self.tabs = QTabWidget() self.nometa = QLabel("No EXIF metadata found") self.nometa.setAlignment(Qt.AlignCenter) self.box = QHBoxLayout() self.setLayout(self.box) self.box.addWidget(self.tabs) self.box.addWidget(self.nometa) self.nometa.hide() self.tabs.show() self.tabs.setTabPosition(QTabWidget.East) def process(self, node): for idx in xrange(0, self.tabs.count()): widget = self.tabs.widget(idx) del widget self.tabs.clear() self.node = node file = self.node.open() tags = EXIF.process_file(file) if len(tags) == 0: self.nometa.setSizePolicy(self.tabs.sizePolicy()) self.tabs.hide() self.nometa.show() else: self.tabs.show() self.nometa.hide() sortedTags = {} for tag in tags.keys(): if tag not in ('JPEGThumbnail', 'TIFFThumbnail', 'Filename', 'EXIF MakerNote'): spaceidx = tag.find(" ") ifd = tag[:spaceidx].strip() if ifd == "Image": ifd = "IFD 0 (Image)" if ifd == "Thumbnail": ifd = "IFD 1 (Thumbnail)" key = tag[spaceidx:].strip() try: val = str(tags[tag]) except: val = "cannot be decoded" if ifd not in sortedTags.keys(): sortedTags[ifd] = [] sortedTags[ifd].append((key, val)) for ifd in sortedTags.keys(): table = QTableWidget(len(sortedTags[ifd]), 2) table.setShowGrid(False) table.setAlternatingRowColors(True) table.verticalHeader().hide() table.horizontalHeader().setClickable(False) table.horizontalHeader().setStretchLastSection(True) table.setHorizontalHeaderLabels(["Tag", "Value"]) table.setSelectionBehavior(QAbstractItemView.SelectRows) self.tabs.addTab(table, ifd) row = 0 for res in sortedTags[ifd]: key = QTableWidgetItem(res[0]) key.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) val = QTableWidgetItem(res[1]) val.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) table.setItem(row, 0, key) table.setItem(row, 1, val) row += 1 if 'JPEGThumbnail' in tags.keys(): label = QLabel() img = QImage() img.loadFromData(tags['JPEGThumbnail']) label.setPixmap(QPixmap.fromImage(img)) label.setAlignment(Qt.AlignCenter) self.tabs.addTab(label, "Embedded Thumbnail") if 'TIFFThumbnail' in tags.keys(): label = QLabel() img = QImage() img.loadFromData(tags['TIFFThumbnail']) label.setPixmap(QPixmap.fromImage(img)) label.setAlignment(Qt.AlignCenter) self.tabs.addTab(label, "Embedded Thumbnail") file.close()
class StudentForm(QDialog): def __init__(self, parent=None): super(StudentForm, self).__init__(parent) #self.setGeometry(50, 50, 820, 530) self.resize(530, 430) self.tabz = QTabWidget(self) self.tab1 = QWidget(self) self.tab2 = QWidget(self) self.tab3 = QWidget(self) self.tab4 = QWidget(self) #main form self.schno = QLabel("School Number") self.schnoData = QLineEdit() self.schnoData.setObjectName("schno") self.schnoData.setPlaceholderText("00000000") self.surname = QLabel("Surname") self.surnameData = QLineEdit() self.surnameData.setObjectName("surname") self.surnameData.setPlaceholderText("Surname") self.firstname = QLabel("Firstname") self.firstnameData = QLineEdit() self.firstnameData.setObjectName("firstname") self.firstnameData.setPlaceholderText("Firstname") self.middlename = QLabel("Middlename") self.middlenameData = QLineEdit() self.middlenameData.setObjectName("middlename") self.middlenameData.setPlaceholderText("middlename") self.soo = QLabel("State/Region of Origin") self.sooData = QLineEdit() self.sooData.setObjectName("soo") self.sooData.setPlaceholderText("Lagos") self.lga = QLabel("LGA/District") self.lgaData = QLineEdit() self.lgaData.setObjectName("lga") self.lgaData.setPlaceholderText("Ikeja") self.addr = QLabel("House Address") self.addrData = QTextEdit() self.addrData.setObjectName("addr") #self.addrData.setPlaceholderText("No. 12 Harrrison For Str., Ney York") self.dob = QLabel("Date of Birth") self.dobData = QDateEdit() self.dobData.setObjectName("dob") self.admit = QLabel("Date Admitted") self.admitData = QDateEdit() self.admitData.setObjectName("admit") self.pb = QPushButton() self.pb.setObjectName("Submit") self.pb.setText("Submit") self.pb1 = QPushButton() self.pb1.setObjectName("Cancel") self.pb1.setText("Cancel") hbo = QHBoxLayout() self.gender = QLabel('Gender') self.r1 = QRadioButton('Male') self.r2 = QRadioButton('Female') hbo.addWidget(self.r1) hbo.addWidget(self.r2) Formlayout = QFormLayout() Formlayout.addRow(self.schno, self.schnoData) Formlayout.addRow(self.surname, self.surnameData) Formlayout.addRow(self.firstname, self.firstnameData) Formlayout.addRow(self.middlename, self.middlenameData) Formlayout.addRow(self.gender, hbo) Formlayout.addRow(self.dob, self.dobData) Formlayout.addRow(self.admit, self.admitData) Formlayout.addRow(self.soo, self.sooData) Formlayout.addRow(self.lga, self.lgaData) Formlayout.addRow(self.addr, self.addrData) grid = QGridLayout() grid.addWidget(self.pb1, 0, 1) grid.addWidget(self.pb, 0, 0) groupBox = QGroupBox('BIODATA') groupBox.setLayout(Formlayout) vbox = QVBoxLayout() vbox.addWidget(groupBox) vbox.addStretch() vbox.addLayout(grid) #self.setLayout(vbox) self.connect(self.pb, SIGNAL("clicked()"), lambda: self.button_click(1)) self.connect(self.pb1, SIGNAL("clicked()"), self.close) self.setWindowTitle("Student Data") #self.setTabText(0, 'BioData') self.tab1.setLayout(vbox) #guardian data relations = [ 'Father', 'Mother', 'Aunt', 'Uncle', 'Grand Parent', 'Guardian', 'Others' ] #first guardian details self.g1name = QLabel("First Guardian") self.g1Data = QLineEdit() self.g1Data.setObjectName("g1name") self.g1Data.setPlaceholderText("Fullname") self.g1rel = QLabel('Relationship') self.g1relData = QComboBox() self.g1relData.addItems(relations) self.g1p1 = QLabel("Phone Number") self.g1p1Data = QLineEdit() self.g1p1Data.setObjectName("g1p1") self.g1p1Data.setPlaceholderText("08000000000") self.g1p2 = QLabel("Alt. Phone Number") self.g1p2Data = QLineEdit() self.g1p2Data.setObjectName("g1p2") self.g1p2Data.setPlaceholderText("08000000000") self.g1email = QLabel("Email") self.g1emailData = QLineEdit() self.g1emailData.setObjectName("g1email") self.g1emailData.setPlaceholderText("*****@*****.**") self.g1addr = QLabel("Address") self.g1addrData = QTextEdit() self.g1addrData.setObjectName("g1add") #self.g1addrData.setPlaceholderText("No. 12 Harrrison For Str., Ney York") #second guardian details self.g2name = QLabel("Second Guardian") self.g2Data = QLineEdit() self.g2Data.setObjectName("g2name") self.g2Data.setPlaceholderText("Mr. Surname Lastname") self.g2rel = QLabel('Relationship') self.g2relData = QComboBox() self.g2relData.addItems(relations) self.g2p1 = QLabel("Phone Number") self.g2p1Data = QLineEdit() self.g2p1Data.setObjectName("g2p1") self.g2p1Data.setPlaceholderText("08000000000") self.g2p2 = QLabel("Alt. Phone Number") self.g2p2Data = QLineEdit() self.g2p2Data.setObjectName("g2p2") self.g2p2Data.setPlaceholderText("08000000000") self.g2email = QLabel("Email") self.g2emailData = QLineEdit() self.g2emailData.setObjectName("g2email") self.g2emailData.setPlaceholderText("*****@*****.**") self.g2addr = QLabel("Address") self.g2addrData = QTextEdit() self.g2addrData.setObjectName("g2add") #self.g2addrData.setPlaceholderText("No. 12 Harrrison For Str., Ney York") self.pb = QPushButton() self.pb.setObjectName("Submit") self.pb.setText("Submit") self.pb1 = QPushButton() self.pb1.setObjectName("Cancel") self.pb1.setText("Cancel") hbo = QHBoxLayout() self.gender = QLabel('Gender') self.r1 = QRadioButton('Male') self.r2 = QRadioButton('Female') hbo.addWidget(self.r1) hbo.addWidget(self.r2) Formlayout1 = QFormLayout() Formlayout1.addRow(self.g1name, self.g1Data) Formlayout1.addRow(self.g1rel, self.g1relData) Formlayout1.addRow(self.g1p1, self.g1p1Data) Formlayout1.addRow(self.g1p2, self.g1p2Data) Formlayout1.addRow(self.g1email, self.g1emailData) Formlayout1.addRow(self.g1addr, self.g1addrData) Formlayout2 = QFormLayout() Formlayout2.addRow(self.g2name, self.g2Data) Formlayout2.addRow(self.g2rel, self.g2relData) Formlayout2.addRow(self.g2p1, self.g2p1Data) Formlayout2.addRow(self.g2p2, self.g2p2Data) Formlayout2.addRow(self.g2email, self.g2emailData) Formlayout2.addRow(self.g2addr, self.g2addrData) grid1 = QGridLayout() grid1.addWidget(self.pb, 0, 0) grid1.addWidget(self.pb1, 0, 1) hbox1 = QHBoxLayout() hbox1.addLayout(Formlayout1) hbox1.addLayout(Formlayout2) groupBox2 = QGroupBox('GUARDIAN') groupBox2.setLayout(hbox1) vbox1 = QVBoxLayout() vbox1.addWidget(groupBox2) vbox1.addStretch() vbox1.addLayout(grid1) #photo self.pic1 = QLabel() image1 = Image.open('img/studentz.png') self.pic1.resize(100, 150) self.pic1.setLabel(image1) self.pic2 = QLabel() image2 = Image.open('img/studentz.png') self.pic2.resize(100, 150) self.pic2.setPixmap(image2) self.pic3 = QLabel() image3 = Image.open('img/studentz.png') self.pic3.resize(100, 150) self.pic3.setPixmap(image3) self.picBtn1 = QPushButton('Select Image') self.picBtn1.clicked.connect(self.getFilez) self.picBtn2 = QPushButton('Select Image') self.picBtn2.clicked.connect(self.getFilez) self.picBtn3 = QPushButton('Select Image') self.picBtn3.clicked.connect(self.getFilez) picGrid = QGridLayout() picGrid.addWidget(self.pic1, 0, 1) picGrid.addWidget(self.pic2, 0, 2) picGrid.addWidget(self.pic3, 0, 3) picGrid.addWidget(self.picBtn1, 1, 1) picGrid.addWidget(self.picBtn2, 2, 2) picGrid.addWidget(self.picBtn3, 3, 3) self.tabz.addTab(self.tab1, 'Bio-Data') self.tabz.addTab(self.tab2, 'Contact Details') self.tabz.addTab(self.tab3, 'Passports') #self.tabz.setTabEnabled(1, False) #self.tabz.setTabEnabled(2, False) self.setWindowTitle("Add Student Data") self.show() def getFile(self, a): fname = QFileDialog.getOpenFileName(self, 'Open', 'c:\\', "Image File (*.jpg *.png)") if a == 1: self.pic1.setPixmap(QPixmap(fname)) elif a == 2: self.pic2.setPixmap(QPixmap(fname)) elif a == 2: self.pic3.setPixmap(QPixmap(fname)) def getFilez(self): fname = QFileDialog.getOpenFileName(self, 'Open', 'c:\\', "Image File (*.jpg *.png)") self.pic1.setPixmap(QPixmap(fname)) def contFill(self, a): sid = a data = self.pullStudents(a) self.resize(430, 530) #self.tabz = QTabWidget(self) self.tabz.clear() self.tab1 = QWidget(self) self.tab2 = QWidget(self) self.tab3 = QWidget(self) self.schno = QLabel("School Number") self.schnoData = QLineEdit() self.schnoData.setObjectName("schno") if (data['schno'] and len(data['schno']) > 1): self.schnoData.setText(data['schno']) else: self.schnoData.setPlaceholderText("00000000") self.surname = QLabel("Surname") self.surnameData = QLineEdit() self.surnameData.setObjectName("surname") if (data['surname'] and len(data['surname']) > 1): tx = data['surname'] self.surnameData.setText(tx.title()) else: self.surnameData.setPlaceholderText("Surname") self.firstname = QLabel("Firstname") self.firstnameData = QLineEdit() self.firstnameData.setObjectName("firstname") if (data['firstname'] and len(data['firstname'])): tx = data['firstname'] self.firstnameData.setText(tx.title()) else: self.firstnameData.setPlaceholderText("Firstname") self.middlename = QLabel("Middlename") self.middlenameData = QLineEdit() self.middlenameData.setObjectName("middlename") if (data['othername'] and len(data['othername']) > 1): tx = data['othername'] self.middlenameData.setText(tx.title()) else: self.middlenameData.setPlaceholderText("othername") self.soo = QLabel("State/Region of Origin") self.sooData = QLineEdit() self.sooData.setObjectName("soo") if (data['soo'] and len(data['soo']) > 1): tx = data['soo'] self.sooData.setText(tx.title()) else: self.sooData.setPlaceholderText("Lagos") self.lga = QLabel("LGA/District") self.lgaData = QLineEdit() self.lgaData.setObjectName("lga") if (data['lga'] and len(data['lga'])): tx = data['lga'] self.lgaData.setText(tx.title()) else: self.lgaData.setPlaceholderText("Ikeja") self.addr = QLabel("House Address") self.addrData = QTextEdit() self.addrData.setObjectName("addr") if (data['addr'] and len(data['addr'])): tx = data['addr'] self.addrData.setText(tx) else: pass self.dob = QLabel("Date of Birth") self.dobData = QDateEdit() self.dobData.setObjectName("dob") tx = QDate.fromString(data['dob'], 'yyyy-MM-dd') self.dobData.setDate(QDate(tx.year(), tx.month(), tx.day())) self.admit = QLabel("Date Admitted") self.admitData = QDateEdit() self.admitData.setObjectName("admit") tx = QDate.fromString(data['admit'], 'yyyy-MM-dd') self.admitData.setDate(QDate(tx.year(), tx.month(), tx.day())) self.pb4 = QPushButton() self.pb4.setObjectName("Submit") self.pb4.setText("Submit") self.pb5 = QPushButton() self.pb5.setObjectName("Cancel") self.pb5.setText("Cancel") hbo = QHBoxLayout() self.gender = QLabel('Gender') self.r1 = QRadioButton('Male') self.r2 = QRadioButton('Female') if (data['gender'] == 'Male'): self.r1.setChecked(True) elif (data['gender'] == 'Female'): self.r2.setChecked(True) hbo.addWidget(self.r1) hbo.addWidget(self.r2) Formlayout = QFormLayout() Formlayout.addRow(self.schno, self.schnoData) Formlayout.addRow(self.surname, self.surnameData) Formlayout.addRow(self.firstname, self.firstnameData) Formlayout.addRow(self.middlename, self.middlenameData) Formlayout.addRow(self.gender, hbo) Formlayout.addRow(self.dob, self.dobData) Formlayout.addRow(self.admit, self.admitData) Formlayout.addRow(self.soo, self.sooData) Formlayout.addRow(self.lga, self.lgaData) Formlayout.addRow(self.addr, self.addrData) grid = QGridLayout() grid.addWidget(self.pb1, 0, 1) grid.addWidget(self.pb, 0, 0) groupBox = QGroupBox('BIODATA') groupBox.setLayout(Formlayout) vbox = QVBoxLayout() vbox.addWidget(groupBox) vbox.addStretch() vbox.addLayout(grid) #self.setLayout(vbox) self.connect(self.pb4, SIGNAL("clicked()"), lambda: self.button1_click(sid)) self.connect(self.pb5, SIGNAL("clicked()"), self.close) self.tab1.setLayout(vbox) relations = [ 'Father', 'Mother', 'Aunt', 'Uncle', 'Grand Parent', 'Guardian', 'Others' ] #first guardian details self.g1name = QLabel("First Guardian") self.g1Data = QLineEdit() self.g1Data.setObjectName("g1name") if (data['g1'] and len(data['g1']) > 1): tx = data['g1'] self.g1Data.setText(tx.title()) else: self.g1Data.setPlaceholderText("Mr. Surname Lastname") self.g1rel = QLabel('Relationship') self.g1relData = QComboBox() self.g1relData.addItems(relations) if data['g1rel'] and len(data['g1rel']) > 0: index1 = self.g1relData.findText(data['g1rel'], Qt.QtMatchFixedString) if index1 >= 0: self.g1relData.setCurrentIndex(index1) self.g1p1 = QLabel("Phone Number") self.g1p1Data = QLineEdit() self.g1p1Data.setObjectName("g1p1") if (data['g1p1'] and len(data['g1p1']) > 1): tx = data['g1p1'] self.g1p1Data.setText(tx.title()) else: self.g1p1Data.setPlaceholderText("08000000000") self.g1p2 = QLabel("Alt. Phone Number") self.g1p2Data = QLineEdit() self.g1p2Data.setObjectName("g1p2") if (data['g1p2'] and len(data['g1p2']) > 1): tx = data['g1p2'] self.g1p2Data.setText(tx.title()) else: self.g1p2Data.setPlaceholderText("08000000000") self.g1email = QLabel("Email") self.g1emailData = QLineEdit() self.g1emailData.setObjectName("g1email") if (data['g1email'] and len(data['g1email']) > 1): tx = data['g1email'] self.g1Data.setText(tx.title()) else: self.g1Data.setPlaceholderText("*****@*****.**") self.g1addr = QLabel("Address") self.g1addrData = QTextEdit() self.g1addrData.setObjectName("g1add") if (data['g1addr'] and len(data['g1addr']) > 1): tx = data['g1addr'] self.g1Data.setText(tx.title()) else: pass #second guardian details self.g2name = QLabel("Second Guardian") self.g2Data = QLineEdit() self.g2Data.setObjectName("g2name") if (data['g2'] and len(data['g2']) > 1): tx = data['g2'] self.g2Data.setText(tx.title()) else: self.g2Data.setPlaceholderText("Title. Surname Lastname") self.g2rel = QLabel('Relationship') self.g2relData = QComboBox() self.g2relData.addItems(relations) if data['g2rel'] and len(data['g2rel']) > 0: index2 = self.g2relData.findText(data['g2rel'], Qt.QtMatchFixedString) if index2 >= 0: self.g2relData.setCurrentIndex(index2) self.g2p1 = QLabel("Phone Number") self.g2p1Data = QLineEdit() self.g2p1Data.setObjectName("g2p1") if (data['g2p1'] and len(data['g2p1']) > 1): tx = data['g2p1'] self.g2p1Data.setText(tx.title()) else: self.g2p1Data.setPlaceholderText("08000000000") self.g2p2 = QLabel("Alt. Phone Number") self.g2p2Data = QLineEdit() self.g2p2Data.setObjectName("g2p2") if (data['g2p2'] and len(data['g2p2']) > 1): tx = data['g2p2'] self.g2p2Data.setText(tx.title()) else: self.g2p2Data.setPlaceholderText("0800000000") self.g2email = QLabel("Email") self.g2emailData = QLineEdit() self.g2emailData.setObjectName("g2email") if (data['g2email'] and len(data['g2email']) > 1): tx = data['g2email'] self.g2emailData.setText(tx.title()) else: self.g2emailData.setPlaceholderText("*****@*****.**") self.g2addr = QLabel("Address") self.g2addrData = QTextEdit() self.g2addrData.setObjectName("g2add") if (data['g2addr'] and len(data['g2addr']) > 1): tx = data['g2addr'] self.g2Data.setText(tx.title()) else: pass self.pb = QPushButton() self.pb.setObjectName("Submit") self.pb.setText("Submit") self.pb1 = QPushButton() self.pb1.setObjectName("Cancel") self.pb1.setText("Cancel") hbo = QHBoxLayout() self.gender = QLabel('Gender') self.r1 = QRadioButton('Male') self.r2 = QRadioButton('Female') hbo.addWidget(self.r1) hbo.addWidget(self.r2) Formlayout1 = QFormLayout() Formlayout1.addRow(self.g1name, self.g1Data) Formlayout1.addRow(self.g1rel, self.g1relData) Formlayout1.addRow(self.g1p1, self.g1p1Data) Formlayout1.addRow(self.g1p2, self.g1p2Data) Formlayout1.addRow(self.g1email, self.g1emailData) Formlayout1.addRow(self.g1addr, self.g1addrData) Formlayout2 = QFormLayout() Formlayout2.addRow(self.g2name, self.g2Data) Formlayout2.addRow(self.g2rel, self.g2relData) Formlayout2.addRow(self.g2p1, self.g2p1Data) Formlayout2.addRow(self.g2p2, self.g2p2Data) Formlayout2.addRow(self.g2email, self.g2emailData) Formlayout2.addRow(self.g2addr, self.g2addrData) grid1 = QGridLayout() grid1.addWidget(self.pb, 0, 0) grid1.addWidget(self.pb1, 0, 1) hbox1 = QHBoxLayout() hbox1.addLayout(Formlayout1) hbox1.addStretch() hbox1.addLayout(Formlayout2) groupBox2 = QGroupBox('GUARDIAN') groupBox2.setLayout(hbox1) vbox1 = QVBoxLayout() vbox1.addWidget(groupBox2) vbox1.addStretch() vbox1.addLayout(grid1) self.tab2.setLayout(vbox1) #photo picstyle = QSize(120, 180) picstyle1 = Qt.KeepAspectRatio self.pic1Lbl = QLabel('YEAR 1 & 2') self.pic2Lbl = QLabel('YEAR 3 & 4') self.pic3Lbl = QLabel('YEAR 5 & 6') self.pic1 = QLabel() pixmap1 = QPixmap('img/studentz.png').scaled(picstyle, picstyle1) self.pic1.setPixmap(pixmap1) self.pic2 = QLabel() pixmap2 = QPixmap('img/studentz.png').scaled(picstyle, picstyle1) self.pic2.setPixmap(pixmap2) self.pic3 = QLabel() pixmap3 = QPixmap('img/studentz.png').scaled(picstyle, picstyle1) self.pic3.setPixmap(pixmap3) self.picBtn1 = QPushButton('Select Image') self.picBtn1.clicked.connect(self.getFilez) self.picBtn2 = QPushButton('Select Image') self.picBtn2.clicked.connect(self.getFilez) self.picBtn3 = QPushButton('Select Image') self.picBtn3.clicked.connect(self.getFilez) self.pic1Lbl.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.pic2Lbl.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.pic3Lbl.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.picBtn1.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.picBtn2.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.picBtn3.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) h1pic = QVBoxLayout() h2pic = QVBoxLayout() h3pic = QVBoxLayout() vpic = QHBoxLayout() h1pic.addWidget(self.pic1Lbl) h1pic.addStretch(0) h1pic.addWidget(self.pic1) h1pic.addStretch(0) h1pic.addWidget(self.picBtn1) h1pic.setContentsMargins(0, 0, 0, 0) h1pic.setSpacing(0) h1pic.setMargin(0) h2pic.addWidget(self.pic2Lbl) h2pic.addStretch(0) h2pic.addWidget(self.pic2) h2pic.addStretch(0) h2pic.addWidget(self.picBtn2) h2pic.setContentsMargins(0, 0, 0, 0) h2pic.setSpacing(0) h2pic.setMargin(0) h3pic.addWidget(self.pic3Lbl) h3pic.addStretch(0) h3pic.addWidget(self.pic3) h3pic.addStretch(0) h3pic.addWidget(self.picBtn3) h3pic.setContentsMargins(0, 0, 0, 0) h3pic.setSpacing(0) h3pic.setMargin(0) vpic.addLayout(h1pic) vpic.addStretch(0) vpic.addLayout(h2pic) vpic.addStretch(0) vpic.addLayout(h3pic) vpic.setSpacing(0) vpic.setMargin(0) vpic.setContentsMargins(0, 0, 0, 0) self.tab3.setLayout(vpic) self.tab3.resize(100, 100) #self.tab3.setStyleSheet("background-color: red; margin:5px; border:1px solid red;") self.tabz.addTab(self.tab1, 'Bio-Data') self.tabz.addTab(self.tab2, 'Contact Details') self.tabz.addTab(self.tab3, 'Passports') self.setWindowTitle("Add Student Data") self.show() def eContFill(self, a): sid = 23 data = self.pullStudents(a) self.resize(430, 530) #self.tabz = QTabWidget(self) self.tabz.clear() self.tab1 = QWidget(self) self.tab2 = QWidget(self) self.tab3 = QWidget(self) self.schno = QLabel("School Number") self.schnoData = QLineEdit() self.schnoData.setObjectName("schno") if (data['schno'] and len(data['schno']) > 1): self.schnoData.setText(data['schno']) else: self.schnoData.setPlaceholderText("00000000") self.surname = QLabel("Surname") self.surnameData = QLineEdit() self.surnameData.setObjectName("surname") if (data['surname'] and len(data['surname']) > 1): tx = data['surname'] self.surnameData.setText(tx.title()) else: self.surnameData.setPlaceholderText("Surname") self.firstname = QLabel("Firstname") self.firstnameData = QLineEdit() self.firstnameData.setObjectName("firstname") if (data['firstname'] and len(data['firstname'])): tx = data['firstname'] self.firstnameData.setText(tx.title()) else: self.firstnameData.setPlaceholderText("Firstname") self.middlename = QLabel("Middlename") self.middlenameData = QLineEdit() self.middlenameData.setObjectName("middlename") if (data['othername'] and len(data['othername']) > 1): tx = data['othername'] self.middlenameData.setText(tx.title()) else: self.middlenameData.setPlaceholderText("othername") self.soo = QLabel("State/Region of Origin") self.sooData = QLineEdit() self.sooData.setObjectName("soo") if (data['soo'] and len(data['soo']) > 1): tx = data['soo'] self.sooData.setText(tx.title()) else: self.sooData.setPlaceholderText("Lagos") self.lga = QLabel("LGA/District") self.lgaData = QLineEdit() self.lgaData.setObjectName("lga") if (data['lga'] and len(data['lga'])): tx = data['lga'] self.lgaData.setText(tx.title()) else: self.lgaData.setPlaceholderText("Ikeja") self.addr = QLabel("House Address") self.addrData = QTextEdit() self.addrData.setObjectName("addr") if (data['addr'] and len(data['addr'])): tx = data['addr'] self.addrData.setText(tx) else: pass self.dob = QLabel("Date of Birth") self.dobData = QDateEdit() self.dobData.setObjectName("dob") tx = QDate.fromString(data['dob'], 'yyyy-MM-dd') self.dobData.setDate(QDate(tx.year(), tx.month(), tx.day())) self.admit = QLabel("Date Admitted") self.admitData = QDateEdit() self.admitData.setObjectName("admit") tx = QDate.fromString(data['admit'], 'yyyy-MM-dd') self.admitData.setDate(QDate(tx.year(), tx.month(), tx.day())) self.pb4 = QPushButton() self.pb4.setObjectName("Submit") self.pb4.setText("Submit") self.pb5 = QPushButton() self.pb5.setObjectName("Cancel") self.pb5.setText("Cancel") hbo = QHBoxLayout() self.gender = QLabel('Gender') self.r1 = QRadioButton('Male') self.r2 = QRadioButton('Female') if (data['gender'] == 'Male'): self.r1.setChecked(True) elif (data['gender'] == 'Female'): self.r2.setChecked(True) hbo.addWidget(self.r1) hbo.addWidget(self.r2) Formlayout = QFormLayout() Formlayout.addRow(self.schno, self.schnoData) Formlayout.addRow(self.surname, self.surnameData) Formlayout.addRow(self.firstname, self.firstnameData) Formlayout.addRow(self.middlename, self.middlenameData) Formlayout.addRow(self.gender, hbo) Formlayout.addRow(self.dob, self.dobData) Formlayout.addRow(self.admit, self.admitData) Formlayout.addRow(self.soo, self.sooData) Formlayout.addRow(self.lga, self.lgaData) Formlayout.addRow(self.addr, self.addrData) grid = QGridLayout() grid.addWidget(self.pb1, 0, 1) grid.addWidget(self.pb, 0, 0) groupBox = QGroupBox('BIODATA') groupBox.setLayout(Formlayout) vbox = QVBoxLayout() vbox.addWidget(groupBox) vbox.addStretch() vbox.addLayout(grid) #self.setLayout(vbox) self.connect(self.pb4, SIGNAL("clicked()"), lambda: self.button1_click(sid)) self.connect(self.pb5, SIGNAL("clicked()"), self.close) self.tab1.setLayout(vbox) relations = [ 'Father', 'Mother', 'Aunt', 'Uncle', 'Grand Parent', 'Guardian', 'Others' ] #first guardian details self.g1name = QLabel("First Guardian") self.g1Data = QLineEdit() self.g1Data.setObjectName("g1name") if (data['g1'] and len(data['g1']) > 1): tx = data['g1'] self.g1Data.setText(tx.title()) else: self.g1Data.setPlaceholderText("Mr. Surname Lastname") self.g1rel = QLabel('Relationship') self.g1relData = QComboBox() self.g1relData.addItems(relations) if data['g1rel'] and len(data['g1rel']) > 0: index1 = self.g1relData.findText(data['g1rel'], Qt.QtMatchFixedString) if index1 >= 0: self.g1relData.setCurrentIndex(index1) self.g1p1 = QLabel("Phone Number") self.g1p1Data = QLineEdit() self.g1p1Data.setObjectName("g1p1") if (data['g1p1'] and len(data['g1p1']) > 1): tx = data['g1p1'] self.g1p1Data.setText(tx.title()) else: self.g1p1Data.setPlaceholderText("08000000000") self.g1p2 = QLabel("Alt. Phone Number") self.g1p2Data = QLineEdit() self.g1p2Data.setObjectName("g1p2") if (data['g1p2'] and len(data['g1p2']) > 1): tx = data['g1p2'] self.g1p2Data.setText(tx.title()) else: self.g1p2Data.setPlaceholderText("08000000000") self.g1email = QLabel("Email") self.g1emailData = QLineEdit() self.g1emailData.setObjectName("g1email") if (data['g1email'] and len(data['g1email']) > 1): tx = data['g1email'] self.g1Data.setText(tx.title()) else: self.g1Data.setPlaceholderText("*****@*****.**") self.g1addr = QLabel("Address") self.g1addrData = QTextEdit() self.g1addrData.setObjectName("g1add") if (data['g1addr'] and len(data['g1addr']) > 1): tx = data['g1addr'] self.g1Data.setText(tx.title()) else: pass #second guardian details self.g2name = QLabel("Second Guardian") self.g2Data = QLineEdit() self.g2Data.setObjectName("g2name") if (data['g2'] and len(data['g2']) > 1): tx = data['g2'] self.g2Data.setText(tx.title()) else: self.g2Data.setPlaceholderText("Title. Surname Lastname") self.g2rel = QLabel('Relationship') self.g2relData = QComboBox() self.g2relData.addItems(relations) if data['g2rel'] and len(data['g2rel']) > 0: index2 = self.g2relData.findText(data['g2rel'], Qt.QtMatchFixedString) if index2 >= 0: self.g2relData.setCurrentIndex(index2) self.g2p1 = QLabel("Phone Number") self.g2p1Data = QLineEdit() self.g2p1Data.setObjectName("g2p1") if (data['g2p1'] and len(data['g2p1']) > 1): tx = data['g2p1'] self.g2p1Data.setText(tx.title()) else: self.g2p1Data.setPlaceholderText("08000000000") self.g2p2 = QLabel("Alt. Phone Number") self.g2p2Data = QLineEdit() self.g2p2Data.setObjectName("g2p2") if (data['g2p2'] and len(data['g2p2']) > 1): tx = data['g2p2'] self.g2p2Data.setText(tx.title()) else: self.g2p2Data.setPlaceholderText("0800000000") self.g2email = QLabel("Email") self.g2emailData = QLineEdit() self.g2emailData.setObjectName("g2email") if (data['g2email'] and len(data['g2email']) > 1): tx = data['g2email'] self.g2emailData.setText(tx.title()) else: self.g2emailData.setPlaceholderText("*****@*****.**") self.g2addr = QLabel("Address") self.g2addrData = QTextEdit() self.g2addrData.setObjectName("g2add") if (data['g2addr'] and len(data['g2addr']) > 1): tx = data['g2addr'] self.g2Data.setText(tx.title()) else: pass self.pb = QPushButton() self.pb.setObjectName("Submit") self.pb.setText("Submit") self.pb1 = QPushButton() self.pb1.setObjectName("Cancel") self.pb1.setText("Cancel") hbo = QHBoxLayout() self.gender = QLabel('Gender') self.r1 = QRadioButton('Male') self.r2 = QRadioButton('Female') hbo.addWidget(self.r1) hbo.addWidget(self.r2) Formlayout1 = QFormLayout() Formlayout1.addRow(self.g1name, self.g1Data) Formlayout1.addRow(self.g1rel, self.g1relData) Formlayout1.addRow(self.g1p1, self.g1p1Data) Formlayout1.addRow(self.g1p2, self.g1p2Data) Formlayout1.addRow(self.g1email, self.g1emailData) Formlayout1.addRow(self.g1addr, self.g1addrData) Formlayout2 = QFormLayout() Formlayout2.addRow(self.g2name, self.g2Data) Formlayout2.addRow(self.g2rel, self.g2relData) Formlayout2.addRow(self.g2p1, self.g2p1Data) Formlayout2.addRow(self.g2p2, self.g2p2Data) Formlayout2.addRow(self.g2email, self.g2emailData) Formlayout2.addRow(self.g2addr, self.g2addrData) grid1 = QGridLayout() grid1.addWidget(self.pb, 0, 0) grid1.addWidget(self.pb1, 0, 1) hbox1 = QHBoxLayout() hbox1.addLayout(Formlayout1) hbox1.addStretch() hbox1.addLayout(Formlayout2) groupBox2 = QGroupBox('GUARDIAN') groupBox2.setLayout(hbox1) vbox1 = QVBoxLayout() vbox1.addWidget(groupBox2) vbox1.addStretch() vbox1.addLayout(grid1) self.tab2.setLayout(vbox1) #photo picstyle = QSize(120, 180) picstyle1 = Qt.KeepAspectRatio self.pic1Lbl = QLabel('YEAR 1 & 2') self.pic2Lbl = QLabel('YEAR 3 & 4') self.pic3Lbl = QLabel('YEAR 5 & 6') self.pic1 = QLabel() pixmap1 = QPixmap('img/studentz.png').scaled(picstyle, picstyle1) self.pic1.setPixmap(pixmap1) self.pic2 = QLabel() pixmap2 = QPixmap('img/studentz.png').scaled(picstyle, picstyle1) self.pic2.setPixmap(pixmap2) self.pic3 = QLabel() pixmap3 = QPixmap('img/studentz.png').scaled(picstyle, picstyle1) self.pic3.setPixmap(pixmap3) self.picBtn1 = QPushButton('Select Image') self.picBtn1.clicked.connect(self.getFilez) self.picBtn2 = QPushButton('Select Image') self.picBtn2.clicked.connect(self.getFilez) self.picBtn3 = QPushButton('Select Image') self.picBtn3.clicked.connect(self.getFilez) self.pic1Lbl.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.pic2Lbl.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.pic3Lbl.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.picBtn1.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.picBtn2.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.picBtn3.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) h1pic = QVBoxLayout() h2pic = QVBoxLayout() h3pic = QVBoxLayout() vpic = QHBoxLayout() h1pic.addWidget(self.pic1Lbl) h1pic.addStretch(0) h1pic.addWidget(self.pic1) h1pic.addStretch(0) h1pic.addWidget(self.picBtn1) h1pic.setContentsMargins(0, 0, 0, 0) h1pic.setSpacing(0) h1pic.setMargin(0) h2pic.addWidget(self.pic2Lbl) h2pic.addStretch(0) h2pic.addWidget(self.pic2) h2pic.addStretch(0) h2pic.addWidget(self.picBtn2) h2pic.setContentsMargins(0, 0, 0, 0) h2pic.setSpacing(0) h2pic.setMargin(0) h3pic.addWidget(self.pic3Lbl) h3pic.addStretch(0) h3pic.addWidget(self.pic3) h3pic.addStretch(0) h3pic.addWidget(self.picBtn3) h3pic.setContentsMargins(0, 0, 0, 0) h3pic.setSpacing(0) h3pic.setMargin(0) vpic.addLayout(h1pic) vpic.addStretch(0) vpic.addLayout(h2pic) vpic.addStretch(0) vpic.addLayout(h3pic) vpic.setSpacing(0) vpic.setMargin(0) vpic.setContentsMargins(0, 0, 0, 0) self.tab3.setLayout(vpic) self.tab3.resize(100, 100) self.tab3.setStyleSheet( "background-color: red; margin:5px; border:1px solid red;") self.tabz.addTab(self.tab1, 'Bio-Data') self.tabz.addTab(self.tab2, 'Contact Details') self.tabz.addTab(self.tab3, 'Passports') self.setWindowTitle("Add Student Data") self.show() def button_click(self, a): # shost is a QString object arr = {} arr['schno'] = self.schnoData.text() arr['surname'] = self.surnameData.text() arr['firstname'] = self.firstnameData.text() arr['othername'] = self.middlenameData.text() arr['soo'] = self.sooData.text() arr['lga'] = self.lgaData.text() arr['addr'] = self.addrData.toPlainText() dob = self.dobData.date() arr['dob'] = dob.toPyDate() admit = self.admitData.date() arr['admit'] = admit.toPyDate() arr['active'] = 0 if self.r1.isChecked(): arr['gender'] = 0 else: arr['gender'] = 1 self.a = a g = Db() if ((arr['surname']) and (arr['firstname']) and (arr['schno'])): h = g.insert('students', arr) self.contFill(h) def button1_click(self, a): # shost is a QString object arr = {} arr['schno'] = self.schnoData.text() arr['surname'] = self.surnameData.text() arr['firstname'] = self.firstnameData.text() arr['othername'] = self.middlenameData.text() arr['soo'] = self.sooData.text() arr['lga'] = self.lgaData.text() arr['addr'] = self.addrData.toPlainText() dob = self.dobData.date() arr['dob'] = dob.toPyDate() admit = self.admitData.date() arr['admit'] = admit.toPyDate() arr['active'] = 0 arr['g1'] = self.g1Data.text() arr['g1rel'] = self.g1relData.itemData(self.g1relData.currentIndex()) arr['g1p1'] = self.g1p1Data.text() arr['g1p2'] = self.g1p2Data.text() arr['g1email'] = self.g1emailData.text() arr['g1addr'] = self.g1addData.text() arr['g2'] = self.g2Data.text() arr['g2rel'] = self.g2relData.itemData(self.g2relData.currentIndex()) arr['g2p1'] = self.g2p1Data.text() arr['g2p2'] = self.g2p2Data.text() arr['g2email'] = self.g2emailData.text() arr['g2addr'] = self.g2addData.text() self.a = a print(arr) g = Db() if ((arr['surname']) and (arr['firstname']) and (arr['schno'])): r = g.update('students', arr, {'id': self.a}) print(r) self.close() def button_click1(self, a): # shost is a QString object s1 = self.le.text() s2 = self.le2.text() self.a = a g = Db() if (len(s1) > 0): y = {'name': s1, 'subID': self.a, 'abbrv': s2} j = g.insert('datas', y) return j def pullClass(self, a): self.a = a cn = Db() students = cn.select('datas', '', '', {'subID': self.a}) arr = {} for j in students: arr[j[0]] = j[2] return arr def pullStudents(self, a): self.a = a cn = Db() students = cn.selectn('students', '', 1, {'id': self.a}) return students def lunchUnitForm(self, a): self.a = a self.form = UnitForm(self.a) self.form.show()
class PluginsManagerWidget(QDialog): def __init__(self, parent): QDialog.__init__(self, parent, Qt.Dialog) self.setWindowTitle(self.tr("Plugins Manager")) self.setModal(True) self.resize(700, 500) vbox = QVBoxLayout(self) self._tabs = QTabWidget() vbox.addWidget(self._tabs) btnReload = QPushButton(self.tr("Reload")) btnReload.setMaximumWidth(100) vbox.addWidget(btnReload) self.overlay = ui_tools.Overlay(self) self.overlay.hide() self._oficial_available = [] self._community_available = [] self._locals = [] self._updates = [] self._loading = True self.connect(btnReload, SIGNAL("clicked()"), self._reload_plugins) self.thread = ThreadLoadPlugins(self) self.connect(self.thread, SIGNAL("finished()"), self._load_plugins_data) self.connect(self.thread, SIGNAL("plugin_downloaded(PyQt_PyObject)"), self._after_download_plugin) self.connect(self.thread, SIGNAL("plugin_uninstalled(PyQt_PyObject)"), self._after_uninstall_plugin) self.overlay.show() self._reload_plugins() def _reload_plugins(self): self.overlay.show() self._loading = True self.thread.runnable = self.thread.collect_data_thread self.thread.start() def _after_download_plugin(self, plugin): oficial_plugin = _get_plugin(plugin[0], self._oficial_available) community_plugin = _get_plugin(plugin[0], self._community_available) if oficial_plugin: self._installedWidget.add_table_items([oficial_plugin]) self._availableOficialWidget.remove_item(plugin[0]) elif community_plugin: self._installedWidget.add_table_items([community_plugin]) self._availableCommunityWidget.remove_item(plugin[0]) def _after_uninstall_plugin(self, plugin): #make available the plugin corresponding to the type oficial_plugin = _get_plugin(plugin[0], self._oficial_available) community_plugin = _get_plugin(plugin[0], self._community_available) if oficial_plugin: self._availableOficialWidget.add_table_items([oficial_plugin]) self._installedWidget.remove_item(plugin[0]) elif community_plugin: self._availableCommunityWidget.add_table_items([community_plugin]) self._installedWidget.remove_item(plugin[0]) def _load_plugins_data(self): if self._loading: self._tabs.clear() self._updatesWidget = UpdatesWidget(self, copy(self._updates)) self._availableOficialWidget = AvailableWidget( self, copy(self._oficial_available)) self._availableCommunityWidget = AvailableWidget( self, copy(self._community_available)) self._installedWidget = InstalledWidget(self, copy(self._locals)) self._tabs.addTab(self._availableOficialWidget, self.tr("Official Available")) self._tabs.addTab(self._availableCommunityWidget, self.tr("Community Available")) self._tabs.addTab(self._updatesWidget, self.tr("Updates")) self._tabs.addTab(self._installedWidget, self.tr("Installed")) self._loading = False self.overlay.hide() def download_plugins(self, plugs): """ Install """ self.overlay.show() self.thread.plug = plugs #set the function to run in the thread self.thread.runnable = self.thread.download_plugins_thread self.thread.start() def mark_as_available(self, plugs): """ Uninstall """ self.overlay.show() self.thread.plug = plugs #set the function to run in the thread self.thread.runnable = self.thread.uninstall_plugins_thread self.thread.start() def update_plugin(self, plugs): """ Update """ self.overlay.show() self.thread.plug = plugs #set the function to run in the thread self.thread.runnable = self.thread.update_plugin_thread self.thread.start() def reset_installed_plugins(self): local_plugins = plugin_manager.local_plugins() plugins = _format_for_table(local_plugins) self._installedWidget.reset_table(plugins) def resizeEvent(self, event): self.overlay.resize(event.size()) event.accept()
class NewSessionPageExamAnswers(QWizardPage): def __init__(self): super(NewSessionPageExamAnswers, self).__init__() self.setTitle(_('Selection of correct answers')) self.setSubTitle(_('Select the correct answers for each exam model')) layout = QFormLayout() self.setLayout(layout) self.tabs = QTabWidget() layout.addRow(self.tabs) self.paramNAlts = None self.paramNCols = None self.paramNPerm = None def initializePage(self): new_paramNAlts = self.field("paramNAlts") new_paramNCols = self.field("paramNCols") new_paramNPerm = self.field("paramNPerm") if (new_paramNAlts != self.paramNAlts or new_paramNCols != self.paramNCols or new_paramNPerm != self.paramNPerm): self.paramNAlts = new_paramNAlts self.paramNCols = new_paramNCols self.paramNPerm = new_paramNPerm self._initialize() def _initialize(self): ## self.paramTPerm = self.field("paramTPerm") self.tabs.clear() self.total_answers = 0 self.radioGroups = {} filas = int(self.paramNPerm.toString()) for x in range(filas): mygroupbox = QScrollArea() mygroupbox.setWidget(QWidget()) mygroupbox.setWidgetResizable(True) myform = QHBoxLayout(mygroupbox.widget()) cols = self.paramNCols.toString().split(',') ansID = 0 radioGroupList = {} for col in cols: mygroupboxCol = QGroupBox() myformCol = QFormLayout() mygroupboxCol.setLayout(myformCol) for y in range(int(col)): ansID += 1 radioGroupList[ansID] = QButtonGroup() layoutRow = QHBoxLayout() for j in range(int(self.paramNAlts.toString())): myradio = QRadioButton(chr(97+j).upper()) layoutRow.addWidget(myradio) radioGroupList[ansID].addButton(myradio) self.total_answers += 1 myformCol.addRow(str(ansID), layoutRow) myform.addWidget(mygroupboxCol) self.radioGroups[chr(97+x).upper()] = radioGroupList self.tabs.addTab(mygroupbox, _('Model ') + chr(97+x).upper()) def _get_values(self, formated=False): response = dict() for k, v in self.radioGroups.iteritems(): answer = dict() for ak, av in v.iteritems(): answer[ak] = abs(int(av.checkedId())) - 1 if formated: answer = answer.values() response[k] = answer return response def _check_count_answers(self): local_radioGroups = self._get_values(formated=True) local_total_answers = sum(len(filter(lambda a: a != 0, v)) \ for v in local_radioGroups.itervalues()) return (self.total_answers == local_total_answers) def validatePage(self): valid = True msg = '' if not self._check_count_answers(): valid = False msg = _('You haven\'t entered the correct answer ' 'for some questions.') else: try: self.wizard().exam_config = utils.ExamConfig() # dimentions generation: dimensions = [] for c in self.paramNCols.toString().split(','): dimensions.append("%s,%s" % (self.paramNAlts.toString(),c)) self.wizard().exam_config.set_dimensions(';'.join(dimensions)) # solutions generation: current_solutions = self._get_values(formated=True) for k, v in current_solutions.iteritems(): self.wizard().exam_config.set_solutions(k, v) # students ids generation: self.wizard().exam_config.id_num_digits = \ int(self.field("paramNEIDs").toString()) except IOError: valid = False msg = _('The exam configuration file cannot be read.') except Exception as e: valid = False msg = _('The exam configuration file contains errors') if str(e): msg += ':<br><br>' + str(e) else: msg += '.' if not valid: QMessageBox.critical(self, _('Error'), msg) return valid def nextId(self): return WizardNewSession.PageIdFiles