Screenshot With Options general false false true file_menu.screenshot ruby module MyMacro include RBA # This class implements a dialog with a screenshot display area and a # screenshot button class ScreenshotDialog < QDialog include RBA def initialize(parent = nil) super setWindowTitle("Screenshot Saver") layout = QGridLayout.new(self) setLayout(layout) l = QLabel.new(self) l.text = "Width" layout.addWidget(l, 0, 0, 1, 1) l = QLabel.new(self) l.text = "Height" layout.addWidget(l, 1, 0, 1, 1) width_edit = QLineEdit.new(self) width_edit.text = "1000" layout.addWidget(width_edit, 0, 1, 1, 1) height_edit = QLineEdit.new(self) height_edit.text = "1000" layout.addWidget(height_edit, 1, 1, 1, 1) l = QLabel.new(self) l.text = "or use resolution (um/pixel):" layout.addWidget(l, 0, 2, 1, 1) res_edit = QLineEdit.new(self) res_edit.text = "1.0" layout.addWidget(res_edit, 0, 3, 1, 1) res_compute = QPushButton.new(self) res_compute.text = "Set Size" res_compute.clicked do begin r = res_edit.text.to_f r > 1.0e-6 || raise("Invalid value for resolution") view = Application::instance.main_window.current_view view || raise("No view open") f = 1.0 / (r * view.viewport_trans.mag) width_edit.text = (view.viewport_width * f + 0.5).floor.to_s height_edit.text = (view.viewport_height * f + 0.5).floor.to_s rescue => ex QMessageBox::critical(self, "Error", ex.to_s, QMessageBox::Ok.to_i) end end layout.addWidget(res_compute, 0, 4, 1, 1) l = QLabel.new(self) l.text = "To File" layout.addWidget(l, 2, 0, 1, 1) file_edit = QLineEdit.new(self) file_edit.text = "file.png" layout.addWidget(file_edit, 2, 1, 1, 3) browse = QPushButton.new(self) browse.text = "..." layout.addWidget(browse, 2, 4, 1, 1) browse.clicked do begin file = QFileDialog::getSaveFileName(self, "Choose file to save screenshot") !file.empty? && file_edit.text = file rescue end end do_cancel = QPushButton.new(self) do_cancel.text = "Cancel" layout.addWidget(do_cancel, 4, 4, 1, 1) do_cancel.clicked do self.reject end do_save = QPushButton.new(self) do_save.text = "Save" layout.addWidget(do_save, 4, 0, 1, 1) do_save.clicked do begin w = width_edit.text.to_i h = height_edit.text.to_i f = file_edit.text view = Application::instance.main_window.current_view view || raise("No view open") view.save_image(f, w, h) self.accept rescue => ex QMessageBox::critical(self, "Error", ex.to_s, QMessageBox::Ok.to_i) end end layout.setRowStretch(3, 1) end end # Instantiate the dialog and show it. $dialog || $dialog = ScreenshotDialog.new(Application::instance.main_window) $dialog.exec end