def open_from_web_page(self): import webpage dialog = webpage.Dialog(self) if dialog.exec_() == QDialog.Rejected: return if not self.close_file(): return self.status = "Loading a level from web page..." try: load_hexcells(dialog.selected_level_file, self.scene, Cell=Cell, Column=Column) except ValueError as e: QMessageBox.critical(None, "Error", str(e)) self.status = "Failed", 1 return for it in self.scene.all(Column): it.cell = min(it.members, key=lambda m: (m.pos() - it.pos()).manhattanLength()) self.view.fitInView( self.scene.itemsBoundingRect().adjusted(-0.5, -0.5, 0.5, 0.5), qt.KeepAspectRatio) self.no_changes() self.status = "Done", 1 return True
def save_file(self, fn=None): if not fn: try: dialog = QFileDialog.getSaveFileNameAndFilter except AttributeError: dialog = QFileDialog.getSaveFileName fn, _ = dialog(self, "Save", self.last_used_folder, "Hexcells level (*.hexcells)") if not fn: return self.status = "Saving..." try: level, status = save(self.scene) with open(fn, 'wb') as f: f.write(level.encode('utf-8')) if isinstance(status, basestring): QMessageBox.warning(None, "Warning", status + '\n' + "Saved anyway.") self.no_changes() self.current_file = fn self.last_used_folder = os.path.dirname(fn) self.status = "Done", 1 self.center_on(*common.level_center) return True except ValueError as e: QMessageBox.critical(None, "Error", str(e)) self.status = "Failed", 1
def about(title): try: import pulp except ImportError: pulp_version = "(missing!)" else: pulp_version = pulp.VERSION QMessageBox.information(None, "About", """ <h1>{}</h1> <h3>Version {}</h3> <p>© 2014 Oleh Prypin <<a href="mailto:[email protected]">[email protected]</a>><br/> © 2014 Stefan Walzer <<a href="mailto:[email protected]">[email protected]</a>></p> <p>License: <a href="http://www.gnu.org/licenses/gpl.txt">GNU General Public License Version 3</a></p> Using: <ul> <li>Python {} <li>Qt {} <li>{} {} <li>PuLP {} </ul> """.format( title, __version__, sys.version.split(' ', 1)[0], qt.version_str, qt.module, qt.module_version_str, pulp_version ))
def about(): import lxml import cssselect QMessageBox.information(None, "About", u""" <h1>Steam Notifier</h1> <h3>Version {}</h3> <p>(C) 2014-2015 Oleh Prypin <<a href="mailto:[email protected]">[email protected]</a>></p> <p>License: <a href="http://www.gnu.org/licenses/gpl.txt">GNU General Public License Version 3</a></p> Using: <ul> <li>Python {} <li>Qt {}, {} {} <li>lxml {} (cssselect {}) </ul> """.format( __version__, sys.version.split(' ', 1)[0], qt.version_str, qt.module, qt.module_version_str, lxml.etree.__version__, cssselect.__version__ ))
def load_file(self, fn=None): if not fn: try: dialog = QFileDialog.getOpenFileNameAndFilter except AttributeError: dialog = QFileDialog.getOpenFileName fn, _ = dialog(self, "Open", self.last_used_folder, "Hexcells/SixCells Level (*.hexcells *sixcells *.sixcellz)") if not fn: return if not self.close_file(): return self.status = "Loading a level..." if fn.endswith('.hexcells'): try: load_hexcells(fn, self.scene, Cell=Cell, Column=Column) except ValueError as e: QMessageBox.critical(None, "Error", str(e)) self.status = "Failed", 1 return else: load_file(fn, self.scene, gz=fn.endswith('.sixcellz'), Cell=Cell, Column=Column) for it in self.scene.all(Column): it.cell = min(it.members, key=lambda m: (m.pos()-it.pos()).manhattanLength()) self.view.fitInView(self.scene.itemsBoundingRect().adjusted(-0.5, -0.5, 0.5, 0.5), qt.KeepAspectRatio) if isinstance(fn, basestring): self.current_file = fn self.last_used_folder = os.path.dirname(fn) self.no_changes() self.status = "Done", 1 return True
def about(title): try: import pulp except ImportError: pulp_version = "(missing!)" else: pulp_version = pulp.VERSION QMessageBox.information( None, "About", """ <h1>{}</h1> <h3>Version {}</h3> <p>© 2014 Oleh Prypin <<a href="mailto:[email protected]">[email protected]</a>><br/> © 2014 Stefan Walzer <<a href="mailto:[email protected]">[email protected]</a>></p> <p>License: <a href="http://www.gnu.org/licenses/gpl.txt">GNU General Public License Version 3</a></p> Using: <ul> <li>Python {} <li>Qt {} <li>{} {} <li>PuLP {} </ul> """.format(title, __version__, sys.version.split(' ', 1)[0], qt.version_str, qt.module, qt.module_version_str, pulp_version))
def information(): with open('README.md') as f: s = f.read() s = s.split('\n\n\n')[2].split('\n\n', 1)[1] s = re.sub(r'<(.+?)>', r'<a href="\1">\1</a>', s) s = re.sub(r'\[(.+?)\]\((.+?)\)', r'<a href="\2">\1</a>', s) s = re.sub(r'\*(.+?)\*', r'<i>\1</i>', s) s = s.replace('\n\n', '<p>') QMessageBox.information(None, "Information", "<p>Welcome to <i>Steam Notifier</i>.<p>"+s)
def show_exception(): from traceback import format_exc from qt.widgets import QMessageBox lines = format_exc().replace(' ', ' ').splitlines() try: index = next(i for i in range(len(lines)) if '"settings/config.py"' in lines[i]) lines = lines[index:] except StopIteration: pass QMessageBox.critical(None, "Steam Notifier", "Error traceback:\n"+'\n'.join(lines))
def load(self, level): if not self.close_file(): return self.status = "Loading a level..." try: load(level, self.scene, Cell=self.Cell, Column=self.Column) except ValueError as e: QMessageBox.critical(None, "Error", str(e)) self.status = "Failed", 1 return self.prepare() self.status = "Done", 1 return True
def load_file(file, scene, Cell=Cell, Column=Column, gz=False): if isinstance(file, basestring): file = (gzip.open if gz else io.open)(file, 'rb') jj = file.read() if not isinstance(jj, unicode): jj = jj.decode('utf-8') try: jj = json.loads(jj) except Exception as e: QMessageBox.warning(None, "Error", "Error while parsing JSON:\n{}".format(e)) return False load(jj, scene, Cell=Cell, Column=Column) return True
def copy(self, padded=True, **kwargs): self.status = "Copying to clipboard..." try: level, status = save(self.scene, **kwargs) except Exception as e: QMessageBox.critical(None, "Error", str(e)) self.status = "Failed", 1 return if status: QMessageBox.warning(None, "Warning", status + '\n' + "Copied anyway.") if padded: level = '\t' + level.replace('\n', '\n\t') app.clipboard().setText(level) self.status = "Done", 1 return True
def copy(self): self.status = "Copying to clipboard..." f = io.BytesIO() try: r = save_hexcells(f, self.scene) if isinstance(r, basestring): QMessageBox.warning(None, "Warning", r+'\n'+"Copied anyway.") except ValueError as e: QMessageBox.critical(None, "Error", str(e)) self.status = "Failed", 1 return f.seek(0) s = f.read().decode('utf-8') s = '\t'+s.replace('\n', '\n\t') app.clipboard().setText(s) self.status = "Done", 1 return True
def open_from_web_page(self): import webpage dialog = webpage.Dialog(self) if dialog.exec_() == QDialog.Rejected: return if not self.close_file(): return self.status = "Loading a level from web page..." try: load_hexcells(dialog.selected_level_file, self.scene, Cell=Cell, Column=Column) except ValueError as e: QMessageBox.critical(None, "Error", str(e)) self.status = "Failed", 1 return for it in self.scene.all(Column): it.cell = min(it.members, key=lambda m: (m.pos()-it.pos()).manhattanLength()) self.view.fitInView(self.scene.itemsBoundingRect().adjusted(-0.5, -0.5, 0.5, 0.5), qt.KeepAspectRatio) self.no_changes() self.status = "Done", 1 return True
def save_file(self, fn=None): if not fn: try: dialog = QFileDialog.getSaveFileNameAndFilter except AttributeError: dialog = QFileDialog.getSaveFileName fn, _ = dialog( self, "Save", self.last_used_folder, "Hexcells level (*.hexcells);;SixCells format (JSON) (*.sixcells);;SixCells format (JSON, gzipped) (*.sixcellz)" ) if not fn: return self.status = "Saving..." if fn.endswith('.hexcells'): try: r = save_hexcells(fn, self.scene) if isinstance(r, basestring): QMessageBox.warning(None, "Warning", r + '\n' + "Saved anyway.") self.no_changes() self.current_file = fn self.last_used_folder = os.path.dirname(fn) self.status = "Done", 1 return True except ValueError as e: QMessageBox.critical(None, "Error", str(e)) self.status = "Failed", 1 return try: gz = fn.endswith('.sixcellz') except AttributeError: gz = False save_file(fn, self.scene, pretty=True, gz=gz) self.no_changes() self.current_file = fn self.last_used_folder = os.path.dirname(fn) self.status = "Done", 1 return True
def save_file(self, fn=None): if not fn: try: dialog = QFileDialog.getSaveFileNameAndFilter except AttributeError: dialog = QFileDialog.getSaveFileName fn, _ = dialog(self, "Save", self.last_used_folder, "Hexcells level (*.hexcells);;SixCells format (JSON) (*.sixcells);;SixCells format (JSON, gzipped) (*.sixcellz)" ) if not fn: return self.status = "Saving..." if fn.endswith('.hexcells'): try: r = save_hexcells(fn, self.scene) if isinstance(r, basestring): QMessageBox.warning(None, "Warning", r+'\n'+"Saved anyway.") self.no_changes() self.current_file = fn self.last_used_folder = os.path.dirname(fn) self.status = "Done", 1 return True except ValueError as e: QMessageBox.critical(None, "Error", str(e)) self.status = "Failed", 1 return try: gz = fn.endswith('.sixcellz') except AttributeError: gz = False save_file(fn, self.scene, pretty=True, gz=gz) self.no_changes() self.current_file = fn self.last_used_folder = os.path.dirname(fn) self.status = "Done", 1 return True
def close_file(self): result = False if not self.any_changes: result = True else: if self.current_file: msg = "The level \"{}\" has been modified. Do you want to save it?".format(self.current_file) else: msg = "Do you want to save this level?" btn = QMessageBox.warning(self, "Unsaved changes", msg, QMessageBox.Save|QMessageBox.Discard|QMessageBox.Cancel, QMessageBox.Save) if btn==QMessageBox.Save: if self.save_file(self.current_file): result = True elif btn==QMessageBox.Discard: result = True if result: self.current_file = None self.scene.reset() self.no_changes() return result
.................................................................. .................................................................. .................................................................. .................................................................. .................................................................. .................................................................. .................................................................. .................................................................. .................................................................. ..................................................................</code>""".replace( "\n", "\r") self.find_levels_in_content() fill_levels_button = QPushButton("Simulate Fill Levels") fill_levels_button.clicked.connect(fill_levels) self.layout().addWidget(fill_levels_button) def fetch_ok(self): super(TestDialog, self).fetch_ok() self.plaintext_content.setPlainText(self.webpage_content) if __name__ == '__main__': app = QApplication(sys.argv) dialog = TestDialog() if dialog.exec_() == QDialog.Accepted: QMessageBox.information(None, "Selected level", dialog.selected_level_file.read()) else: QMessageBox.information(None, "Selected level", "NONE")
def fetch_error(self): self.fetch_in_progress.reset() QMessageBox.critical(self, "Error", "Cannot fetch web page")
.................................................................. .................................................................. .................................................................. .................................................................. .................................................................. .................................................................. .................................................................. .................................................................. .................................................................. .................................................................. ..................................................................</code>""".replace("\n","\r") self.find_levels_in_content() fill_levels_button = QPushButton("Simulate Fill Levels") fill_levels_button.clicked.connect(fill_levels) self.layout().addWidget(fill_levels_button) def fetch_ok(self): super(TestDialog,self).fetch_ok() self.plaintext_content.setPlainText(self.webpage_content) if __name__=='__main__': app = QApplication(sys.argv) dialog = TestDialog() if dialog.exec_() == QDialog.Accepted: QMessageBox.information(None, "Selected level", dialog.selected_level_file.read()) else: QMessageBox.information(None, "Selected level", "NONE")