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