def build_gui(self, container): """ This method is called when the plugin is invoked. It builds the GUI used by the plugin into the widget layout passed as ``container``. This method may be called many times as the plugin is opened and closed for modal operations. The method may be omitted if there is no GUI for the plugin. This specific example uses the GUI widget set agnostic wrappers to build the GUI, but you can also just as easily use explicit toolkit calls here if you only want to support one widget set. """ top = Widgets.VBox() top.set_border_width(4) # this is a little trick for making plugins that work either in # a vertical or horizontal orientation. It returns a box container, # a scroll widget and an orientation ('vertical', 'horizontal') vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) # Take a text widget to show some instructions self.msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msgFont) self.tw = tw # Frame for instructions and add the text widget with another # blank widget to stretch as needed to fill emp fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) # Add a spacer to stretch the rest of the way to the end of the # plugin space spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) # scroll bars will allow lots of content to be accessed top.add_widget(sw, stretch=1) # A button box that is always visible at the bottom btns = Widgets.HBox() btns.set_spacing(3) # Add a close button for the convenience of the user btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) # Add our GUI to the container container.add_widget(top, stretch=1)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) self.msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msgFont) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Blink") captions = (("Interval:", 'label', 'Interval', 'entry', "Start Blink", 'button', "Stop Blink", 'button'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w = b b.interval.set_text(str(self.interval)) b.interval.add_callback('activated', lambda w: self._set_interval_cb()) b.interval.set_tooltip("Interval in seconds between changing images") b.start_blink.add_callback('activated', lambda w: self._start_blink_cb()) b.stop_blink.add_callback('activated', lambda w: self._stop_blink_cb()) fr.set_widget(w) vbox.add_widget(fr, stretch=0) spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(3) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) self.msg_font = self.fv.get_font("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msg_font) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Crosshair") captions = (('Format:', 'label', 'Format', 'combobox'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w = b combobox = b.format for name in self.formats: combobox.append_text(name) index = self.formats.index(self.format) combobox.set_index(index) combobox.add_callback('activated', lambda w, idx: self.set_format()) fr.set_widget(w) vbox.add_widget(fr, stretch=0) spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(3) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) self.msg_font = self.fv.get_font("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msg_font) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("WCS Match") captions = ((' Reference Channel:', 'label', 'ref channel', 'combobox'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w = b b.ref_channel.add_callback('activated', self.set_reference_channel_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(3) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.gui_up = True self._reset_channels_gui()
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container, fill=True) vbox.set_border_width(4) vbox.set_spacing(2) self.msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msgFont) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Pixel Values") # Make the values table as a text widget msgFont = self.fv.getFont('fixedFont', 10) tw = Widgets.TextArea(wrap=False, editable=False) #tw.cfg_expand(1, 1) tw.set_font(msgFont) self.tw = tw ## sw1 = Widgets.ScrollArea() ## sw1.set_widget(tw) vbox2 = Widgets.VBox() vbox2.add_widget(tw) ## vbox2.add_widget(sw1) ## vbox2.add_widget(Widgets.Label(''), stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) cbox1 = Widgets.ComboBox() index = 0 for i in self.sizes: j = 1 + i * 2 name = "%dx%d" % (j, j) cbox1.append_text(name) index += 1 index = self.sizes.index(self.pixtbl_radius) cbox1.set_index(index) cbox1.add_callback('activated', self.set_cutout_size) cbox1.set_tooltip("Select size of pixel table") btns.add_widget(cbox1, stretch=0) # control for selecting a mark cbox2 = Widgets.ComboBox() for tag in self.marks: cbox2.append_text(tag) if self.mark_selected is None: cbox2.set_index(0) else: cbox2.show_text(self.mark_selected) cbox2.add_callback('activated', self.mark_select_cb) self.w.marks = cbox2 cbox2.set_tooltip("Select a mark") #cbox2.setMinimumContentsLength(8) btns.add_widget(cbox2, stretch=0) btn1 = Widgets.Button("Delete") btn1.add_callback('activated', lambda w: self.clear_mark_cb()) btn1.set_tooltip("Delete selected mark") btns.add_widget(btn1, stretch=0) btn2 = Widgets.Button("Delete All") btn2.add_callback('activated', lambda w: self.clear_all()) btn2.set_tooltip("Clear all marks") btns.add_widget(btn2, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) vbox2 = Widgets.VBox() vbox2.add_widget(btns, stretch=0) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn3 = Widgets.CheckBox("Pan to mark") btn3.set_state(self.pan2mark) btn3.add_callback('activated', self.pan2mark_cb) btn3.set_tooltip("Pan follows selected mark") btns.add_widget(btn3) btns.add_widget(Widgets.Label(''), stretch=1) vbox2.add_widget(btns, stretch=0) vbox2.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(vbox2, stretch=1) ## spacer = Widgets.Label('') ## vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container, scrolled=True) self.orientation = orientation vbox.set_border_width(4) vbox.set_spacing(2) self.msg_font = self.fv.get_font("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msg_font) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("HDU") vb1 = Widgets.VBox() captions = [("Num HDUs:", 'label', "Num HDUs", 'llabel'), ] w, b = Widgets.build_info(captions, orientation=orientation) self.w.numhdu = b.num_hdus self.w.update(b) vb1.add_widget(w) captions = [("Choose HDU", 'combobox'), ] w, b = Widgets.build_info(captions, orientation=orientation) vb1.add_widget(w) self.w.hdu = b.choose_hdu self.w.hdu.set_tooltip("Choose which HDU to view") self.w.hdu.add_callback('activated', self.set_hdu_cb) fr.set_widget(vb1) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("NAXIS (data cubes)") self.naxisfr = fr vbox.add_widget(fr, stretch=0) tbar = Widgets.Toolbar(orientation='horizontal') for name, actn, cb in (('first', 'first', lambda w: self.first_slice()), ('last', 'last', lambda w: self.last_slice()), ('reverse', 'prev', lambda w: self.prev_slice()), ('forward', 'next', lambda w: self.next_slice()), ('play', 'play', lambda w: self.play_start()), ('stop', 'stop', lambda w: self.play_stop()), ): iconpath = os.path.join(self.fv.iconpath, "%s_48.png" % name) btn = tbar.add_action(None, iconpath=iconpath) self.w[actn] = btn btn.set_enabled(False) btn.set_tooltip(actn) btn.add_callback('activated', cb) vbox.add_widget(tbar, stretch=0) captions = [("Interval:", 'label', "Interval", 'spinfloat', "fps", 'llabel'), ] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) lower, upper = self.play_min_sec, 8.0 b.interval.set_limits(lower, upper, incr_value=0.01) b.interval.set_value(self.play_int_sec) b.interval.set_decimals(2) b.interval.add_callback('value-changed', self.play_int_cb) b.interval.set_enabled(False) vbox.add_widget(w, stretch=0) captions = [("Slice:", 'label', "Slice", 'llabel',), #"Value:", 'label', "Value", 'llabel'), ("Save Slice", 'button'), ] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.save_slice.add_callback('activated', lambda w: self.save_slice_cb()) b.save_slice.set_enabled(False) b.save_slice.set_tooltip("Save current slice as RGB image") vbox.add_widget(w, stretch=0) fr = Widgets.Frame("Movie") if have_mencoder: captions = [("Start:", 'label', "Start Slice", 'entry', "End:", 'label', "End Slice", 'entry', 'Save Movie', 'button')] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.start_slice.set_tooltip("Starting slice") b.end_slice.set_tooltip("Ending slice") b.start_slice.set_length(6) b.end_slice.set_length(6) b.save_movie.add_callback( 'activated', lambda w: self.save_movie_cb()) b.save_movie.set_enabled(False) fr.set_widget(w) else: infolbl = Widgets.Label() infolbl.set_text("Please install 'mencoder' to save as movie") fr.set_widget(infolbl) vbox.add_widget(fr, stretch=0) #spacer = Widgets.Label('') #vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.gui_up = True
def build_gui(self, container): assert have_pyfits == True, \ Exception("Please install astropy/pyfits to use this plugin") top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container, scrolled=True) self.orientation = orientation vbox.set_border_width(4) vbox.set_spacing(2) self.msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msgFont) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("HDU") vb1 = Widgets.VBox() captions = [ ("Num HDUs:", 'label', "Num HDUs", 'llabel'), ] w, b = Widgets.build_info(captions, orientation=orientation) self.w.numhdu = b.num_hdus self.w.update(b) vb1.add_widget(w) captions = [ ("Choose HDU", 'combobox'), ] w, b = Widgets.build_info(captions, orientation=orientation) vb1.add_widget(w) self.w.hdu = b.choose_hdu self.w.hdu.set_tooltip("Choose which HDU to view") self.w.hdu.add_callback('activated', self.set_hdu_cb) fr.set_widget(vb1) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("NAXIS (data cubes)") self.naxisfr = fr vbox.add_widget(fr, stretch=0) captions = [ ("First", 'button', "Prev", 'button', "Stop", 'button'), ("Last", 'button', "Next", 'button', "Play", 'button'), ("Interval:", 'label', "Interval", 'spinfloat'), ] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.next.add_callback('activated', lambda w: self.next_slice()) b.prev.add_callback('activated', lambda w: self.prev_slice()) b.first.add_callback('activated', lambda w: self.first_slice()) b.last.add_callback('activated', lambda w: self.last_slice()) b.play.add_callback('activated', lambda w: self.play_start()) b.stop.add_callback('activated', lambda w: self.play_stop()) lower, upper = 0.1, 8.0 b.interval.set_limits(lower, upper, incr_value=0.1) b.interval.set_value(lower) b.interval.set_decimals(2) b.interval.add_callback('value-changed', self.play_int_cb) b.next.set_enabled(False) b.prev.set_enabled(False) b.first.set_enabled(False) b.last.set_enabled(False) b.play.set_enabled(False) b.stop.set_enabled(False) b.interval.set_enabled(False) vbox.add_widget(w, stretch=0) captions = [ ( "Slice:", 'label', "Slice", 'llabel', ), #"Value:", 'label', "Value", 'llabel'), ("Save Slice", 'button'), ] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.save_slice.add_callback('activated', lambda w: self.save_slice_cb()) b.save_slice.set_enabled(False) b.save_slice.set_tooltip("Save current slice as RGB image") vbox.add_widget(w, stretch=0) fr = Widgets.Frame("Movie") if have_mencoder: captions = [("Start:", 'label', "Start Slice", 'entry', "End:", 'label', "End Slice", 'entry', 'Save Movie', 'button') ] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.start_slice.set_tooltip("Starting slice") b.end_slice.set_tooltip("Ending slice") b.start_slice.set_length(6) b.end_slice.set_length(6) b.save_movie.add_callback('activated', lambda w: self.save_movie_cb()) b.save_movie.set_enabled(False) fr.set_widget(w) else: infolbl = Widgets.Label() infolbl.set_text("Please install 'mencoder' to save as movie") fr.set_widget(infolbl) vbox.add_widget(fr, stretch=0) #spacer = Widgets.Label('') #vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.gui_up = True
def build_gui(self, container): assert iqcalc.have_scipy == True, \ Exception("Please install python-scipy to use this plugin") self.pickcenter = None vtop = Widgets.VBox() vtop.set_border_width(4) box, sw, orientation = Widgets.get_oriented_box(container, fill=True) box.set_border_width(4) box.set_spacing(2) self.msg_font = self.fv.get_font("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msg_font) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) box.add_widget(fr, stretch=0) vpaned = Widgets.Splitter(orientation=orientation) nb = Widgets.TabWidget(tabpos='bottom') self.w.nb1 = nb vpaned.add_widget(nb) cm, im = self.fv.cm, self.fv.im di = Viewers.CanvasView(logger=self.logger) width, height = 300, 300 di.set_desired_size(width, height) di.enable_autozoom('off') di.enable_autocuts('off') di.zoom_to(3) settings = di.get_settings() settings.getSetting('zoomlevel').add_callback('set', self.zoomset, di) di.set_cmap(cm) di.set_imap(im) di.set_callback('none-move', self.detailxy) di.set_bg(0.4, 0.4, 0.4) # for debugging di.set_name('pickimage') self.pickimage = di bd = di.get_bindings() bd.enable_pan(True) bd.enable_zoom(True) bd.enable_cuts(True) di.configure(width, height) iw = Viewers.GingaViewerWidget(viewer=di) iw.resize(300, 300) nb.add_widget(iw, title="Image") if have_mpl: # Contour plot hbox = Widgets.HBox() self.contour_plot = plots.ContourPlot(logger=self.logger, width=400, height=300) self.contour_plot.add_axis(axisbg='black') pw = Plot.PlotWidget(self.contour_plot) pw.resize(400, 300) hbox.add_widget(pw, stretch=1) zoom = Widgets.Slider(orientation='vertical', track=True) zoom.set_limits(1, 100, incr_value=1) zoom.set_value(self.contour_plot.plot_zoomlevel) def zoom_contour_cb(w, val): self.contour_plot.plot_zoom(val / 10.0) zoom.add_callback('value-changed', zoom_contour_cb) hbox.add_widget(zoom, stretch=0) nb.add_widget(hbox, title="Contour") # FWHM gaussians plot self.fwhm_plot = plots.FWHMPlot(logger=self.logger, width=400, height=300) self.fwhm_plot.add_axis(axisbg='white') pw = Plot.PlotWidget(self.fwhm_plot) pw.resize(400, 300) nb.add_widget(pw, title="FWHM") # Radial profile plot self.radial_plot = plots.RadialPlot(logger=self.logger, width=400, height=300) self.radial_plot.add_axis(axisbg='white') pw = Plot.PlotWidget(self.radial_plot) pw.resize(400, 300) nb.add_widget(pw, title="Radial") fr = Widgets.Frame(self._textlabel) nb = Widgets.TabWidget(tabpos='bottom') self.w.nb2 = nb # Build report panel captions = ( ('Zoom:', 'label', 'Zoom', 'llabel'), ('Object_X', 'label', 'Object_X', 'llabel', 'Object_Y', 'label', 'Object_Y', 'llabel'), ('RA:', 'label', 'RA', 'llabel', 'DEC:', 'label', 'DEC', 'llabel'), ('Equinox:', 'label', 'Equinox', 'llabel', 'Background:', 'label', 'Background', 'llabel'), ('Sky Level:', 'label', 'Sky Level', 'llabel', 'Brightness:', 'label', 'Brightness', 'llabel'), ('FWHM X:', 'label', 'FWHM X', 'llabel', 'FWHM Y:', 'label', 'FWHM Y', 'llabel'), ('FWHM:', 'label', 'FWHM', 'llabel', 'Star Size:', 'label', 'Star Size', 'llabel'), ('Sample Area:', 'label', 'Sample Area', 'llabel', 'Default Region', 'button'), ('Pan to pick', 'button'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.zoom.set_text(self.fv.scale2text(di.get_scale())) self.wdetail = b b.default_region.add_callback('activated', lambda w: self.reset_region()) b.default_region.set_tooltip("Reset region size to default") b.pan_to_pick.add_callback('activated', lambda w: self.pan_to_pick_cb()) b.pan_to_pick.set_tooltip("Pan image to pick center") vbox1 = Widgets.VBox() vbox1.add_widget(w, stretch=0) # spacer vbox1.add_widget(Widgets.Label(''), stretch=0) # Pick field evaluation status hbox = Widgets.HBox() hbox.set_spacing(4) hbox.set_border_width(4) label = Widgets.Label() #label.set_alignment(0.05, 0.5) self.w.eval_status = label hbox.add_widget(self.w.eval_status, stretch=0) hbox.add_widget(Widgets.Label(''), stretch=1) vbox1.add_widget(hbox, stretch=0) # Pick field evaluation progress bar and stop button hbox = Widgets.HBox() hbox.set_spacing(4) hbox.set_border_width(4) btn = Widgets.Button("Stop") btn.add_callback('activated', lambda w: self.eval_intr()) btn.set_enabled(False) self.w.btn_intr_eval = btn hbox.add_widget(btn, stretch=0) self.w.eval_pgs = Widgets.ProgressBar() hbox.add_widget(self.w.eval_pgs, stretch=1) vbox1.add_widget(hbox, stretch=0) nb.add_widget(vbox1, title="Readout") # Build settings panel captions = ( ('Show Candidates', 'checkbutton'), ('Radius:', 'label', 'xlbl_radius', 'label', 'Radius', 'spinbutton'), ('Threshold:', 'label', 'xlbl_threshold', 'label', 'Threshold', 'entry'), ('Min FWHM:', 'label', 'xlbl_min_fwhm', 'label', 'Min FWHM', 'spinbutton'), ('Max FWHM:', 'label', 'xlbl_max_fwhm', 'label', 'Max FWHM', 'spinbutton'), ('Ellipticity:', 'label', 'xlbl_ellipticity', 'label', 'Ellipticity', 'entry'), ('Edge:', 'label', 'xlbl_edge', 'label', 'Edge', 'entry'), ('Max side:', 'label', 'xlbl_max_side', 'label', 'Max side', 'spinbutton'), ('Coordinate Base:', 'label', 'xlbl_coordinate_base', 'label', 'Coordinate Base', 'entry'), ('Redo Pick', 'button'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.radius.set_tooltip("Radius for peak detection") b.threshold.set_tooltip("Threshold for peak detection (blank=default)") b.min_fwhm.set_tooltip("Minimum FWHM for selection") b.max_fwhm.set_tooltip("Maximum FWHM for selection") b.ellipticity.set_tooltip("Minimum ellipticity for selection") b.edge.set_tooltip("Minimum edge distance for selection") b.show_candidates.set_tooltip("Show all peak candidates") b.max_side.set_tooltip("Maximum dimension to search for peaks") b.coordinate_base.set_tooltip("Base of pixel coordinate system") # radius control #b.radius.set_digits(2) #b.radius.set_numeric(True) b.radius.set_limits(5.0, 200.0, incr_value=1.0) def chg_radius(w, val): self.radius = float(val) self.w.xlbl_radius.set_text(str(self.radius)) return True b.xlbl_radius.set_text(str(self.radius)) b.radius.add_callback('value-changed', chg_radius) # threshold control def chg_threshold(w): threshold = None ths = w.get_text().strip() if len(ths) > 0: threshold = float(ths) self.threshold = threshold self.w.xlbl_threshold.set_text(str(self.threshold)) return True b.xlbl_threshold.set_text(str(self.threshold)) b.threshold.add_callback('activated', chg_threshold) # min fwhm #b.min_fwhm.set_digits(2) #b.min_fwhm.set_numeric(True) b.min_fwhm.set_limits(0.1, 200.0, incr_value=0.1) b.min_fwhm.set_value(self.min_fwhm) def chg_min(w, val): self.min_fwhm = float(val) self.w.xlbl_min_fwhm.set_text(str(self.min_fwhm)) return True b.xlbl_min_fwhm.set_text(str(self.min_fwhm)) b.min_fwhm.add_callback('value-changed', chg_min) # max fwhm #b.max_fwhm.set_digits(2) #b.max_fwhm.set_numeric(True) b.max_fwhm.set_limits(0.1, 200.0, incr_value=0.1) b.max_fwhm.set_value(self.max_fwhm) def chg_max(w, val): self.max_fwhm = float(val) self.w.xlbl_max_fwhm.set_text(str(self.max_fwhm)) return True b.xlbl_max_fwhm.set_text(str(self.max_fwhm)) b.max_fwhm.add_callback('value-changed', chg_max) # Ellipticity control def chg_ellipticity(w): minellipse = None val = w.get_text().strip() if len(val) > 0: minellipse = float(val) self.min_ellipse = minellipse self.w.xlbl_ellipticity.set_text(str(self.min_ellipse)) return True b.xlbl_ellipticity.set_text(str(self.min_ellipse)) b.ellipticity.add_callback('activated', chg_ellipticity) # Edge control def chg_edgew(w): edgew = None val = w.get_text().strip() if len(val) > 0: edgew = float(val) self.edgew = edgew self.w.xlbl_edge.set_text(str(self.edgew)) return True b.xlbl_edge.set_text(str(self.edgew)) b.edge.add_callback('activated', chg_edgew) #b.max_side.set_digits(0) #b.max_side.set_numeric(True) b.max_side.set_limits(5, 10000, incr_value=10) b.max_side.set_value(self.max_side) def chg_max_side(w, val): self.max_side = int(val) self.w.xlbl_max_side.set_text(str(self.max_side)) return True b.xlbl_max_side.set_text(str(self.max_side)) b.max_side.add_callback('value-changed', chg_max_side) b.redo_pick.add_callback('activated', lambda w: self.redo()) b.show_candidates.set_state(self.show_candidates) b.show_candidates.add_callback('activated', self.show_candidates_cb) self.w.xlbl_coordinate_base.set_text(str(self.pixel_coords_offset)) b.coordinate_base.set_text(str(self.pixel_coords_offset)) b.coordinate_base.add_callback('activated', self.coordinate_base_cb) vbox3 = Widgets.VBox() vbox3.add_widget(w, stretch=0) vbox3.add_widget(Widgets.Label(''), stretch=1) nb.add_widget(vbox3, title="Settings") # Build controls panel vbox3 = Widgets.VBox() captions = ( ('Sky cut', 'button', 'Delta sky:', 'label', 'xlbl_delta_sky', 'label', 'Delta sky', 'entry'), ('Bright cut', 'button', 'Delta bright:', 'label', 'xlbl_delta_bright', 'label', 'Delta bright', 'entry'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.sky_cut.set_tooltip("Set image low cut to Sky Level") b.delta_sky.set_tooltip("Delta to apply to low cut") b.bright_cut.set_tooltip("Set image high cut to Sky Level+Brightness") b.delta_bright.set_tooltip("Delta to apply to high cut") b.sky_cut.set_enabled(False) self.w.btn_sky_cut = b.sky_cut self.w.btn_sky_cut.add_callback('activated', lambda w: self.sky_cut()) self.w.sky_cut_delta = b.delta_sky b.xlbl_delta_sky.set_text(str(self.delta_sky)) b.delta_sky.set_text(str(self.delta_sky)) def chg_delta_sky(w): delta_sky = 0.0 val = w.get_text().strip() if len(val) > 0: delta_sky = float(val) self.delta_sky = delta_sky self.w.xlbl_delta_sky.set_text(str(self.delta_sky)) return True b.delta_sky.add_callback('activated', chg_delta_sky) b.bright_cut.set_enabled(False) self.w.btn_bright_cut = b.bright_cut self.w.btn_bright_cut.add_callback('activated', lambda w: self.bright_cut()) self.w.bright_cut_delta = b.delta_bright b.xlbl_delta_bright.set_text(str(self.delta_bright)) b.delta_bright.set_text(str(self.delta_bright)) def chg_delta_bright(w): delta_bright = 0.0 val = w.get_text().strip() if len(val) > 0: delta_bright = float(val) self.delta_bright = delta_bright self.w.xlbl_delta_bright.set_text(str(self.delta_bright)) return True b.delta_bright.add_callback('activated', chg_delta_bright) vbox3.add_widget(w, stretch=0) vbox3.add_widget(Widgets.Label(''), stretch=1) nb.add_widget(vbox3, title="Controls") vbox3 = Widgets.VBox() msg_font = self.fv.get_font("fixedFont", 10) tw = Widgets.TextArea(wrap=False, editable=True) tw.set_font(msg_font) self.w.report = tw sw1 = Widgets.ScrollArea() sw1.set_widget(tw) vbox3.add_widget(sw1, stretch=1) tw.append_text(self._make_report_header()) btns = Widgets.HBox() btns.set_spacing(4) btn = Widgets.Button("Add Pick") btn.add_callback('activated', lambda w: self.add_pick_cb()) btns.add_widget(btn) btn = Widgets.CheckBox("Record Picks automatically") btn.set_state(self.do_record) btn.add_callback('activated', self.record_cb) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) vbox3.add_widget(btns, stretch=0) btns = Widgets.HBox() btns.set_spacing(4) btn = Widgets.CheckBox("Log Records") btn.set_state(self.do_report_log) btn.add_callback('activated', self.do_report_log_cb) btns.add_widget(btn) btns.add_widget(Widgets.Label("File:")) ent = Widgets.TextEntry() ent.set_text(self.report_log) ent.add_callback('activated', self.set_report_log_cb) btns.add_widget(ent, stretch=1) vbox3.add_widget(btns, stretch=0) nb.add_widget(vbox3, title="Report") ## sw2 = Widgets.ScrollArea() ## sw2.set_widget(nb) ## fr.set_widget(sw2) fr.set_widget(nb) vpaned.add_widget(fr) mode = self.canvas.get_draw_mode() hbox = Widgets.HBox() btn1 = Widgets.RadioButton("Move") btn1.set_state(mode == 'move') btn1.add_callback('activated', lambda w, val: self.set_mode_cb('move', val)) btn1.set_tooltip("Choose this to position pick") self.w.btn_move = btn1 hbox.add_widget(btn1) btn2 = Widgets.RadioButton("Draw", group=btn1) btn2.set_state(mode == 'draw') btn2.add_callback('activated', lambda w, val: self.set_mode_cb('draw', val)) btn2.set_tooltip("Choose this to draw a replacement pick") self.w.btn_draw = btn2 hbox.add_widget(btn2) btn3 = Widgets.RadioButton("Edit", group=btn1) btn3.set_state(mode == 'edit') btn3.add_callback('activated', lambda w, val: self.set_mode_cb('edit', val)) btn3.set_tooltip("Choose this to edit a pick") self.w.btn_edit = btn3 hbox.add_widget(btn3) hbox.add_widget(Widgets.Label(''), stretch=1) #box.add_widget(hbox, stretch=0) vpaned.add_widget(hbox) box.add_widget(vpaned, stretch=1) vtop.add_widget(sw, stretch=5) ## spacer = Widgets.Label('') ## vtop.add_widget(spacer, stretch=0) btns = Widgets.HBox() btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) vtop.add_widget(btns, stretch=0) container.add_widget(vtop, stretch=5)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, self.orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) fr = Widgets.Frame('Signal Selection') captions = (('Type:', 'label', 'Sig type', 'combobox'), ('Move', 'radiobutton', 'Draw', 'radiobutton')) w, b = Widgets.build_info(captions) self.w.update(b) combobox = b.sig_type for name in self._sigtype_options: combobox.append_text(name) b.sig_type.set_index(self._sigtype_options.index(self.sigtype)) b.sig_type.add_callback('activated', self.set_sigtype_cb) mode = self.canvas.get_draw_mode() b.move.set_state(mode == 'move') b.move.add_callback('activated', lambda w, val: self.set_mode_cb('move', val)) b.move.set_tooltip('Choose this to position region') b.draw.set_state(mode == 'draw') b.draw.add_callback('activated', lambda w, val: self.set_mode_cb('draw', val)) b.draw.set_tooltip('Choose this to draw a new region') fr.set_widget(w) vbox.add_widget(fr, stretch=0) fr = Widgets.Expander('Signal Attributes') vbox2 = Widgets.VBox() self.w.sigtype_attr_vbox = Widgets.VBox() vbox2.add_widget(self.w.sigtype_attr_vbox, stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) fr = Widgets.Expander('Background Annulus') captions = (('BG X:', 'label', 'BG X', 'entry'), ('BG Y:', 'label', 'BG Y', 'entry'), ('Spacer6', 'spacer', 'Align with Centroid', 'button'), ('BG Radius:', 'label', 'BG r', 'entry'), ('BG Annulus Width:', 'label', 'Annulus Width', 'entry'), ('Sigma:', 'label', 'Sigma', 'entry'), ('Number of Iterations:', 'label', 'NIter', 'entry')) w, b = Widgets.build_info(captions, orientation=self.orientation) self.w.update(b) b.bg_x.set_tooltip('X of background annulus') b.bg_x.add_callback('activated', lambda w: self.set_bgxcen()) b.bg_y.set_tooltip('Y of background annulus') b.bg_y.add_callback('activated', lambda w: self.set_bgycen()) b.align_with_centroid.set_tooltip( 'Set background X and Y to be same as centroid') b.align_with_centroid.add_callback('activated', lambda w: self.align_centers()) b.bg_r.set_tooltip('Inner radius of background annulus') b.bg_r.add_callback('activated', lambda w: self.set_bgradius()) b.annulus_width.set_tooltip('Set background annulus width manually') b.annulus_width.add_callback('activated', lambda w: self.set_annulus_width()) b.sigma.set_tooltip('Sigma for clipping') b.sigma.add_callback('activated', lambda w: self.set_sigma()) b.niter.set_tooltip('Number of clipping iterations') b.niter.add_callback('activated', lambda w: self.set_niter()) fr.set_widget(w) vbox.add_widget(fr, stretch=0) captions = (('Ignore bad pixels', 'checkbutton'), ('Min SNR:', 'label', 'Min SNR', 'llabel'), ('Mean SNR:', 'label', 'Mean SNR', 'llabel'), ('Max SNR:', 'label', 'Max SNR', 'llabel'), ('Spacer3', 'spacer'), ('Median signal:', 'label', 'sig med', 'llabel'), ('Background STDEV:', 'label', 'bg std', 'llabel'), ('Background mean:', 'label', 'bg mean', 'llabel'), ('SBR value:', 'label', 'SBR Value', 'llabel'), ('Min SBR:', 'label', 'Min SBR', 'llabel'), ('Spacer4', 'spacer')) w, b = Widgets.build_info(captions, orientation=self.orientation) self.w.update(b) b.ignore_bad_pixels.set_tooltip( 'Only use good pixels (DQ=0) for calculations') b.ignore_bad_pixels.set_state(self.ignore_badpix) b.ignore_bad_pixels.add_callback('activated', self.set_igbadpix) for bitem, tt_text in ( (b.min_snr, 'Min SNR in inner circle'), (b.mean_snr, 'Mean SNR in inner circle'), (b.max_snr, 'Max SNR in inner circle'), (b.sig_med, 'Median signal in inner circle'), (b.bg_std, 'Background std. dev. in annulus'), (b.bg_mean, 'Background mean in annulus'), (b.sbr_value, 'SBR value'), (b.min_sbr, 'Calculated SBR below this value raises red flag')): bitem.set_tooltip(tt_text) vbox.add_widget(w, stretch=0) self.sbr_status_label = Widgets.Label('', halign='center') self.sbr_status_label.set_font(self.fv.font18) vbox2 = Widgets.VBox() vbox2.add_widget(self.sbr_status_label) self.sbr_status_frame = Widgets.Frame('SBR Status') self.sbr_status_frame.set_widget(vbox2) vbox.add_widget(self.sbr_status_frame, stretch=0) self.build_param_gui(vbox) captions = (('Update HDR', 'button', 'spacer1', 'spacer'), ) w, b = Widgets.build_info(captions, orientation=self.orientation) self.w.update(b) b.update_hdr.set_tooltip('Update header with SBR and SNR values') b.update_hdr.add_callback('activated', lambda w: self.update_header()) vbox.add_widget(w, stretch=0) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(3) btn = Widgets.Button('Close') btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btn = Widgets.Button('Help') btn.add_callback('activated', lambda w: self.help()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(sw, stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) # Populate default attributes frame, results, and status self._display_bg_params() self.set_sigtype(self.sigtype) self.gui_up = True
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) self.msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msgFont) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Blink") vbox2 = Widgets.VBox() captions = (("Interval:", 'label', 'Interval', 'entry', "Start Blink", 'button', "Stop Blink", 'button'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w = b b.interval.set_text(str(self.interval)) b.interval.add_callback('activated', lambda w: self._set_interval_cb()) b.interval.set_tooltip("Interval in seconds between changing images") b.start_blink.add_callback('activated', lambda w: self._start_blink_cb()) b.stop_blink.add_callback('activated', lambda w: self._stop_blink_cb()) vbox2.add_widget(w, stretch=0) hbox = Widgets.HBox() btn1 = Widgets.RadioButton("Blink channels") btn1.add_callback('activated', lambda w, tf: self._set_blink_mode_cb(tf == True)) btn1.set_tooltip("Choose this to blink across channels") btn1.set_state(self.blink_channels) self.w.blink_channels = btn1 hbox.add_widget(btn1) btn2 = Widgets.RadioButton("Blink images in channel", group=btn1) btn2.set_state(not self.blink_channels) btn2.add_callback('activated', lambda w, tf: self._set_blink_mode_cb(tf == False)) btn2.set_tooltip("Choose this to blink images within a channel") self.w.blink_within = btn2 hbox.add_widget(btn2) hbox.add_widget(Widgets.Label(''), stretch=1) vbox2.add_widget(hbox, stretch=0) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(3) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) self.msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msgFont) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Compositing") captions = (("Compose Type:", 'label', "Compose Type", 'combobox'), ("New Image", 'button', "Insert Layer", 'button'), ) w, b = Widgets.build_info(captions) self.w.update(b) fr.set_widget(w) vbox.add_widget(fr, stretch=0) combobox = b.compose_type index = 0 for name in ('Alpha', 'RGB'): combobox.append_text(name) index += 1 combobox.set_index(1) #combobox.add_callback('activated', self.set_combine_cb) b.new_image.add_callback('activated', lambda w: self.new_cb()) b.new_image.set_tooltip("Start a new composite image") b.insert_layer.add_callback('activated', lambda w: self.insert_cb()) b.insert_layer.set_tooltip("Insert channel image as layer") fr = Widgets.Frame("Layers") self.w.scales = fr vbox.add_widget(fr, stretch=0) hbox = Widgets.HBox() hbox.set_border_width(4) hbox.set_spacing(4) btn = Widgets.Button("Save Image As") btn.add_callback('activated', lambda w: self.save_as_cb()) hbox.add_widget(btn, stretch=0) self.entry2 = Widgets.TextEntry() hbox.add_widget(self.entry2, stretch=1) self.entry2.add_callback('activated', lambda *args: self.save_as_cb()) vbox.add_widget(hbox, stretch=0) # spacer vbox.add_widget(Widgets.Label(''), stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.gui_up = True
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) self.msg_font = self.fv.get_font("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msg_font) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Glue Interface") captions = [ ('Start Glue', 'button', 'Stop Glue', 'button'), ('Put Data', 'button'), ('Get Data', 'button', 'dataitem', 'combobox'), ] w, b = Widgets.build_info(captions) self.w.update(b) fr.set_widget(w) vbox.add_widget(fr, stretch=0) b.start_glue.add_callback('activated', lambda w: self.start_glue_cb()) b.start_glue.set_tooltip('Start a Glue session') b.stop_glue.add_callback('activated', lambda w: self.stop_glue_cb()) b.stop_glue.set_tooltip('Stop a Glue session') b.stop_glue.set_enabled(False) b.put_data.add_callback('activated', lambda w: self.put_data_cb()) b.put_data.set_tooltip('Send data to Glue') b.put_data.set_enabled(False) b.get_data.add_callback('activated', lambda w: self.get_data_cb()) b.get_data.set_tooltip('Get selected data from Glue') b.get_data.set_enabled(False) b.dataitem.set_tooltip('Select data to get from Glue') # stretch top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(4) btns.set_border_width(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btn.set_tooltip('Close this plugin and Glue') btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.gui_up = True
def build_gui(self, container): vbox, sw, self.orientation = Widgets.get_oriented_box(container) msg_font = self.fv.get_font('sansFont', 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(msg_font) self.tw = tw fr = Widgets.Expander('Instructions') fr.set_widget(tw) container.add_widget(fr, stretch=0) captions = (('Mark:', 'label', 'mark type', 'combobox'), ('Color:', 'label', 'mark color', 'combobox'), ('Size:', 'label', 'mark size', 'entry'), ('Width:', 'label', 'mark width', 'entry')) w, b = Widgets.build_info(captions) self.w.update(b) combobox = b.mark_type for name in self._mark_options: combobox.append_text(name) b.mark_type.set_index(self._mark_options.index(self.marktype)) b.mark_type.add_callback('activated', self.set_marktype_cb) combobox = b.mark_color for name in self._color_options: combobox.append_text(name) b.mark_color.set_index(self._color_options.index(self.markcolor)) b.mark_color.add_callback('activated', self.set_markcolor_cb) b.mark_size.set_tooltip('Size/radius of the marking') b.mark_size.set_text(str(self.marksize)) b.mark_size.add_callback('activated', lambda w: self.set_marksize()) b.mark_width.set_tooltip('Line width of the marking') b.mark_width.set_text(str(self.markwidth)) b.mark_width.add_callback('activated', lambda w: self.set_markwidth()) container.add_widget(w, stretch=0) nb = Widgets.TabWidget() self.w.nb1 = nb container.add_widget(nb, stretch=1) treeview = Widgets.TreeView(auto_expand=True, sortable=True, selection='multiple', use_alt_row_color=True) self.treeview = treeview treeview.setup_table(self.columns, 2, 'MARKID') treeview.add_callback('selected', self.hl_table2canvas) nb.add_widget(treeview, title='Shown') treeview2 = Widgets.TreeView(auto_expand=True, sortable=True, use_alt_row_color=True) self.treeviewsel = treeview2 treeview2.setup_table(self.columns, 2, 'MARKID') nb.add_widget(treeview2, title='Selected') treeview3 = Widgets.TreeView(auto_expand=True, sortable=True, use_alt_row_color=True) self.treeviewbad = treeview3 treeview3.setup_table(self.columns, 2, 'MARKID') nb.add_widget(treeview3, title='Outliers') captions = (('Loaded:', 'llabel', 'ntotal', 'llabel', 'Shown:', 'llabel', 'nshown', 'llabel', 'Selected:', 'llabel', 'nselected', 'llabel'), ) w, b = Widgets.build_info(captions) self.w.update(b) b.ntotal.set_tooltip('Number of objects read from tables') b.ntotal.set_text('0') b.nshown.set_tooltip('Number of objects shown on image') b.nshown.set_text('0') b.nselected.set_tooltip('Number of objects selected') b.nselected.set_text('0') container.add_widget(w, stretch=0) captions = (('Load Coords', 'button', 'Use RADEC', 'checkbutton'), ('Show', 'button', 'Hide', 'button', 'Forget', 'button')) w, b = Widgets.build_info(captions) self.w.update(b) b.load_coords.set_tooltip('Load coordinates file') b.load_coords.add_callback('activated', lambda w: self.load_coords_cb()) b.use_radec.set_tooltip('Use RA/DEC as coordinates instead of X/Y') b.use_radec.set_state(self.use_radec) b.use_radec.add_callback('activated', self.set_coordtype_cb) b.show.set_tooltip('Show markings') b.show.add_callback('activated', lambda w: self.redo()) b.hide.set_tooltip('Hide markings') b.hide.add_callback('activated', lambda w: self.clear_marking()) b.forget.set_tooltip('Forget markings') b.forget.add_callback('activated', lambda w: self.forget_coords()) container.add_widget(w, stretch=0) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(3) btn = Widgets.Button('Close') btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) container.add_widget(btns, stretch=0) self.gui_up = True # Initialize coordinates file selection dialog self.cfilesel = FileSelection(self.fv.w.root.get_widget()) # Populate table self.redo()
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) self.msg_font = self.fv.get_font("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msg_font) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Ruler") captions = (('Units:', 'label', 'Units', 'combobox'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w = b combobox = b.units for name in self.unittypes: combobox.append_text(name) index = self.unittypes.index(self.units) combobox.set_index(index) combobox.add_callback('activated', lambda w, idx: self.set_units()) fr.set_widget(w) vbox.add_widget(fr, stretch=0) mode = self.canvas.get_draw_mode() hbox = Widgets.HBox() btn1 = Widgets.RadioButton("Draw") btn1.set_state(mode == 'draw') btn1.add_callback('activated', lambda w, val: self.set_mode_cb('draw', val)) btn1.set_tooltip("Choose this to draw a ruler") self.w.btn_draw = btn1 hbox.add_widget(btn1) btn2 = Widgets.RadioButton("Edit", group=btn1) btn2.set_state(mode == 'edit') btn2.add_callback('activated', lambda w, val: self.set_mode_cb('edit', val)) btn2.set_tooltip("Choose this to edit a ruler") self.w.btn_edit = btn2 hbox.add_widget(btn2) hbox.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(hbox, stretch=0) spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(3) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) self.msg_font = self.fv.get_font("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msg_font) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Limits") captions = (('Opacity:', 'label', 'Opacity', 'spinfloat'), ('Hi color:', 'label', 'Hi color', 'combobox'), ('Hi limit:', 'label', 'Hi value', 'entry'), ('Lo color:', 'label', 'Lo color', 'combobox'), ('Lo limit:', 'label', 'Lo value', 'entry'), ('Redo', 'button')) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.opacity.set_decimals(2) b.opacity.set_limits(0.0, 1.0, incr_value=0.1) b.opacity.set_value(self.opacity) b.opacity.add_callback('value-changed', lambda *args: self.redo()) combobox = b.hi_color for name in self.colornames: combobox.append_text(name) index = self.colornames.index(self.hi_color) combobox.set_index(index) combobox.add_callback('activated', lambda *args: self.redo()) b.hi_value.set_length(22) if self.hi_value is not None: b.hi_value.set_text(str(self.hi_value)) b.hi_value.add_callback('activated', lambda *args: self.redo()) combobox = b.lo_color for name in self.colornames: combobox.append_text(name) index = self.colornames.index(self.lo_color) combobox.set_index(index) combobox.add_callback('activated', lambda *args: self.redo()) b.lo_value.set_length(22) if self.lo_value is not None: b.lo_value.set_text(str(self.lo_value)) b.lo_value.add_callback('activated', lambda *args: self.redo()) b.redo.add_callback('activated', lambda *args: self.redo()) fr.set_widget(w) vbox.add_widget(fr, stretch=0) spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(3) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) self.orientation = orientation vbox.set_border_width(4) vbox.set_spacing(2) fr = Widgets.Frame("StatDrawing") captions = (("Draw type:", 'label', "Draw type", 'combobox'), ) w, b = Widgets.build_info(captions) self.w.update(b) combobox = b.draw_type for name in self.drawtypes: combobox.append_text(name) index = self.drawtypes.index(default_drawtype) combobox.set_index(index) combobox.add_callback('activated', lambda w, idx: self.set_drawtype_cb()) fr.set_widget(w) vbox.add_widget(fr, stretch=0) mode = self.canvas.get_draw_mode() hbox = Widgets.HBox() btn1 = Widgets.RadioButton("Draw") btn1.set_state(mode == 'draw') btn1.add_callback('activated', lambda w, val: self.set_mode_cb('draw', val)) btn1.set_tooltip("Choose this to draw") self.w.btn_draw = btn1 hbox.add_widget(btn1) btn2 = Widgets.RadioButton("Edit", group=btn1) btn2.set_state(mode == 'edit') btn2.add_callback('activated', lambda w, val: self.set_mode_cb('edit', val)) btn2.set_tooltip("Choose this to edit") self.w.btn_edit = btn2 hbox.add_widget(btn2) hbox.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(hbox, stretch=0) fr = Widgets.Frame("Statistics") vbox.add_widget(fr, stretch=0) captions = ( ('Max:', 'label', 'Max', 'llabel'), ('Min:', 'label', 'Min', 'llabel'), ('Mean:', 'label', 'Mean', 'llabel'), ('Std:', 'label', 'Std', 'llabel'), ('Sum:', 'label', 'Sum', 'llabel'), ('NbPixel:', 'label', 'NbPixel', 'llabel'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) fr.set_widget(w) vbox.add_widget(fr, stretch=0) self.wdetail = b fr = Widgets.Frame("Mask Threshold") vbox.add_widget(fr, stretch=0) captions = ( ('Do Threshold:', 'label', 'Do Threshold', 'checkbutton'), ('Threshold:', 'label', 'Threshold', 'entry'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.threshold.set_text('0') fr.set_widget(w) self.threshold = b b.threshold.add_callback('activated', self.do_thresold) vbox.add_widget(fr, stretch=0) fr = Widgets.Expander("Attributes") vbox2 = Widgets.VBox() self.w.attrlbl = Widgets.Label() vbox2.add_widget(self.w.attrlbl, stretch=0) self.w.drawvbox = Widgets.VBox() vbox2.add_widget(self.w.drawvbox, stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) captions = ( ("Rotate By:", 'label', 'Rotate By', 'entry', "Scale By:", 'label', 'Scale By', 'entry'), ("Delete Obj", 'button', "sp1", 'spacer', "Create mask", 'button', "Clear canvas", 'button'), ) w, b = Widgets.build_info(captions) self.w.update(b) b.delete_obj.add_callback('activated', lambda w: self.delete_object()) b.delete_obj.set_tooltip("Delete selected object in edit mode") b.delete_obj.set_enabled(False) b.scale_by.add_callback('activated', self.scale_object) b.scale_by.set_text('0.9') b.scale_by.set_tooltip("Scale selected object in edit mode") b.scale_by.set_enabled(False) b.rotate_by.add_callback('activated', self.rotate_object) b.rotate_by.set_text('90.0') b.rotate_by.set_tooltip("Rotate selected object in edit mode") b.rotate_by.set_enabled(False) b.create_mask.add_callback('activated', lambda w: self.create_mask()) b.create_mask.set_tooltip("Create boolean mask from drawing") b.clear_canvas.add_callback('activated', lambda w: self.clear_canvas()) b.clear_canvas.set_tooltip("Delete all drawing objects") vbox.add_widget(w, stretch=0) hbox.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(hbox, stretch=0) ## spacer = Widgets.Label('') ## vbox.add_widget(spacer, stretch=1) spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btn = Widgets.Button("Help") btn.add_callback('activated', lambda w: self.help()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.toggle_create_button()
def build_gui(self, container): """Build GUI such that image list area is maximized.""" vbox, sw, orientation = Widgets.get_oriented_box(container) msgFont = self.fv.getFont('sansFont', 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(msgFont) self.tw = tw fr = Widgets.Expander('Instructions') fr.set_widget(tw) container.add_widget(fr, stretch=0) captions = (('Channel:', 'label', 'Channel Name', 'combobox', 'Modified only', 'checkbutton'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.channel_name.set_tooltip('Channel for locating images to save') b.channel_name.add_callback('activated', self.select_channel_cb) mod_only = self.settings.get('modified_only', True) b.modified_only.set_state(mod_only) b.modified_only.add_callback('activated', lambda *args: self.redo()) b.modified_only.set_tooltip("Show only locally modified images") container.add_widget(w, stretch=0) captions = (('Path:', 'llabel', 'OutDir', 'entry', 'Browse', 'button'), ('Suffix:', 'llabel', 'Suffix', 'entry')) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.outdir.set_text(self.outdir) b.outdir.set_tooltip('Output directory') b.outdir.add_callback('activated', lambda w: self.set_outdir()) b.browse.set_tooltip('Browse for output directory') b.browse.add_callback('activated', lambda w: self.browse_outdir()) b.suffix.set_text(self.suffix) b.suffix.set_tooltip('Suffix to append to filename') b.suffix.add_callback('activated', lambda w: self.set_suffix()) container.add_widget(w, stretch=0) self.treeview = Widgets.TreeView(auto_expand=True, sortable=True, selection='multiple', use_alt_row_color=True) self.treeview.setup_table(self.columns, 1, 'IMAGE') self.treeview.add_callback('selected', self.toggle_save_cb) container.add_widget(self.treeview, stretch=1) captions = (('Status', 'llabel'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.status.set_text('') b.status.set_tooltip('Status message') container.add_widget(w, stretch=0) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(3) btn = Widgets.Button('Save') btn.set_tooltip('Save selected image(s)') btn.add_callback('activated', lambda w: self.save_images()) btn.set_enabled(False) btns.add_widget(btn, stretch=0) self.w.save = btn btn = Widgets.Button('Close') btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) container.add_widget(btns, stretch=0) self.gui_up = True # Initialize directory selection dialog self.dirsel = DirectorySelection(self.fv.w.root.get_widget()) # Generate initial listing self.update_channels()
def build_gui(self, container): """Build the Dialog""" self.logger.debug('Called.') # Setup for options vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) # Instructions self.msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msgFont) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) # Mode administration modes = Widgets.Frame('Region Editing') mode = self.canvas.get_draw_mode() hbox = Widgets.HBox() hbox.set_border_width(4) btn1 = Widgets.RadioButton("Move") btn1.set_state(mode == 'move') btn1.add_callback( 'activated', lambda w, val: self.set_mode_cb('move', val) ) btn1.set_tooltip("Choose this to position region") self.w.btn_move = btn1 hbox.add_widget(btn1) btn2 = Widgets.RadioButton("Draw", group=btn1) btn2.set_state(mode == 'draw') btn2.add_callback( 'activated', lambda w, val: self.set_mode_cb('draw', val) ) btn2.set_tooltip("Choose this to draw a replacement region") self.w.btn_draw = btn2 hbox.add_widget(btn2) btn3 = Widgets.RadioButton("Edit", group=btn1) btn3.set_state(mode == 'edit') btn3.add_callback( 'activated', lambda w, val: self.set_mode_cb('edit', val) ) btn3.set_tooltip("Choose this to edit a region") self.w.btn_edit = btn3 hbox.add_widget(btn3) hbox.add_widget(Widgets.Label(''), stretch=1) modes.set_widget(hbox) # Coordinates coords = Widgets.Frame('WCS Reference') hbox = Widgets.HBox() hbox.set_border_width(4) hbox.set_spacing(4) for option, tooltip in _coords_options: btn = Widgets.RadioButton(option) btn.set_state(option == _def_coords) btn.add_callback( 'activated', lambda widget, state, option=option: self.set_coords( option, state) ) btn.set_tooltip(tooltip) hbox.add_widget(btn) hbox.add_widget(Widgets.Label(''), stretch=1) coords.set_widget(hbox) # Basic plugin admin buttons btns = Widgets.HBox() btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) # Layout the options vbox.add_widget(fr, stretch=0) vbox.add_widget(coords, stretch=0) vbox.add_widget(modes, stretch=0) # Layout top level framing vtop = Widgets.VBox() vtop.set_border_width(4) vtop.add_widget(sw, stretch=1) # Magic: sw contains vbox vtop.add_widget(btns, stretch=0) # Options completed. container.add_widget(vtop, stretch=1) # Postage stamps if self.pstamps is not None: return pstamps_frame = self.fv.w['pstamps'] self.pstamps_show = False pstamps = Widgets.HBox() w = pstamps.get_widget() self.logger.debug('layout="{}"'.format( pstamps_frame.get_widget().layout())) self.logger.debug('pstamps.w="{}"'.format(w)) w.setMinimumHeight(100) pstamps_frame.add_widget(pstamps) self.pstamps = pstamps self.pstamps_frame = pstamps_frame
def build_gui(self, container): """ This method is called when the plugin is invoked. It builds the GUI used by the plugin into the widget layout passed as ``container``. This method may be called many times as the plugin is opened and closed for modal operations. The method may be omitted if there is no GUI for the plugin. This specific example uses the GUI widget set agnostic wrappers to build the GUI, but you can also just as easily use explicit toolkit calls here if you only want to support one widget set. """ top = Widgets.VBox() top.set_border_width(4) # this is a little trick for making plugins that work either in # a vertical or horizontal orientation. It returns a box container, # a scroll widget and an orientation ('vertical', 'horizontal') vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) self.msg_font = self.fv.get_font("sansFont", 12) # Instructions tw_inst = Widgets.TextArea(wrap=True, editable=False) tw_inst.set_font(self.msg_font) self.tw_inst = tw_inst # Frame for instructions and add the text widget with another # blank widget to stretch as needed to fill emp fr_inst = Widgets.Expander("Instructions") fr_inst.set_widget(tw_inst) vbox.add_widget(fr_inst, stretch=0) ## ----------------------------------------------------- ## Show Current Settings ## ----------------------------------------------------- fr_show = Widgets.Frame( f"Current XPOSE Settings for {self.INSTR.name}") captions = [ ("Object:", "label", "object", "llabel", 'set_object', 'entry'), ("File Base Name:", "label", "basename", "llabel"), ("Frame No.:", "label", "frameno", "llabel"), ("Next File Name:", "label", "filename", "llabel"), ("ExpTime (s):", "label", "itime", "llabel", 'set_itime', 'entry'), ] if self.INSTR.optical is True: captions.extend([ ('Binning:', 'label', 'binning', 'llabel', 'set_binning', 'combobox'), ]) else: captions.extend([ ("Coadds:", "label", "coadds", "llabel", 'set_coadds', 'entry'), ("Sampling Mode:", "label", "sampmode", "llabel"), ]) w_show, b_show = Widgets.build_info(captions, orientation=orientation) self.w.update(b_show) b_show.object.set_text(f'{self.INSTR.object}') b_show.set_object.set_text(f'{self.INSTR.object}') b_show.set_object.add_callback('activated', self.cb_set_object) b_show.set_object.set_tooltip("Set object name for header") b_show.basename.set_text(f'{self.INSTR.basename}') b_show.frameno.set_text(f'{self.INSTR.frameno:d}') b_show.filename.set_text(f'{self.INSTR.get_filename()}') b_show.itime.set_text(f'{self.INSTR.itime:<.1f}') b_show.set_itime.set_text(f'{self.INSTR.itime:.2f}') b_show.set_itime.add_callback('activated', self.cb_set_itime) b_show.set_itime.set_tooltip("Set exposure time (s)") if self.INSTR.optical is True: b_show.binning.set_text(f'{self.INSTR.binning_as_str()}') combobox = b_show.set_binning for binopt in self.INSTR.binnings: combobox.append_text(binopt) b_show.set_binning.set_index( self.INSTR.binnings.index(self.INSTR.binning_as_str())) b_show.set_binning.add_callback('activated', self.cb_set_binning) if self.INSTR.optical is False: b_show.coadds.set_text(f'{self.INSTR.coadds:d}') b_show.set_coadds.set_text(f'{self.INSTR.coadds:d}') b_show.set_coadds.add_callback('activated', self.cb_set_coadds) b_show.set_coadds.set_tooltip("Set number of Coadds") b_show.sampmode.set_text('{:d} ({})'.format( self.INSTR.sampmode, self.INSTR.sampmode_trans[self.INSTR.sampmode])) fr_show.set_widget(w_show) vbox.add_widget(fr_show, stretch=0) ## ----------------------------------------------------- ## Detector Parameter Controls if self.INSTR.optical is False: btns_params = Widgets.HBox() btns_params.set_spacing(1) btn_set_bright = Widgets.Button("Set Bright Object") btn_set_bright.add_callback('activated', lambda w: self.cb_set_bright(w)) btns_params.add_widget(btn_set_bright, stretch=0) btn_set_faint = Widgets.Button("Set Faint Object") btn_set_faint.add_callback('activated', lambda w: self.cb_set_faint(w)) btns_params.add_widget(btn_set_faint, stretch=0) vbox.add_widget(btns_params, stretch=0) ## ----------------------------------------------------- ## Exposure Buttons btns_exp = Widgets.HBox() btns_exp.set_spacing(1) btn_start_exposure = Widgets.Button("Take Test Exposure") btn_start_exposure.add_callback('activated', lambda w: self.INSTR.start_exposure()) btns_exp.add_widget(btn_start_exposure, stretch=0) if self.INSTR.optical is True: btn_abort_exposure = Widgets.Button("Abort Test Exposure") btn_abort_exposure.add_callback( 'activated', lambda w: self.INSTR.abort_exposure()) btns_exp.add_widget(btn_abort_exposure, stretch=0) vbox.add_widget(btns_exp, stretch=0) ## ----------------------------------------------------- ## Observation Sequence ## ----------------------------------------------------- fr_sequence = Widgets.Frame("Observation Sequence") captions = (('Observation Sequence:', 'label',\ 'sequence', 'llabel',\ 'obsseq', 'combobox'), ("Repeats:", 'label',\ 'nrepeats', 'llabel',\ 'set_repeats', 'entry',), ) w_script, b_script = Widgets.build_info(captions) self.w.update(b_script) combobox = b_script.obsseq for script in self.INSTR.scripts: combobox.append_text(script) b_script.obsseq.set_index(self.INSTR.scripts.index(self.INSTR.script)) b_script.obsseq.add_callback('activated', self.cb_set_script) b_script.sequence.set_text(f'{self.INSTR.script}') b_script.nrepeats.set_text(f'{self.INSTR.repeats:d}') b_script.set_repeats.set_text(f'{self.INSTR.repeats:d}') b_script.set_repeats.add_callback('activated', self.cb_set_repeats) b_script.set_repeats.set_tooltip("Set number of repeats") fr_sequence.set_widget(w_script) vbox.add_widget(fr_sequence, stretch=0) ## ----------------------------------------------------- ## Sequence Buttons btns_seq = Widgets.HBox() btns_seq.set_spacing(1) btn_start_sequence = Widgets.Button(f"Start Observation Sequence") btn_start_sequence.add_callback('activated', lambda w: self.INSTR.start_sequence()) btns_seq.add_widget(btn_start_sequence, stretch=0) vbox.add_widget(btns_seq, stretch=0) btns_abortseq = Widgets.HBox() btns_abortseq.set_spacing(1) btn_abort_immediately = Widgets.Button("Abort Immediately") btn_abort_immediately.add_callback( 'activated', lambda w: self.INSTR.abort_immediately()) btns_abortseq.add_widget(btn_abort_immediately, stretch=0) btn_abort_afterframe = Widgets.Button("Abort After Frame") btn_abort_afterframe.add_callback( 'activated', lambda w: self.INSTR.abort_afterframe()) btns_abortseq.add_widget(btn_abort_afterframe, stretch=0) # btn_abort_afterrepeat = Widgets.Button("Abort After Repeat") # btn_abort_afterrepeat.add_callback('activated', # lambda w: self.INSTR.abort_afterrepeat()) # btns_abortseq.add_widget(btn_abort_afterrepeat, stretch=0) vbox.add_widget(btns_abortseq, stretch=0) ## ----------------------------------------------------- ## Instrument Specific Controls ## ----------------------------------------------------- if self.INSTR.name == 'HIRES': ## HIRES Dewar fr_dwr = Widgets.Frame(f"HIRES Dewar") captions = [ ("Camera Dewar Level:", "label", "dewar_level", "llabel", "Fill Dewar", "button"), ("Reserve Dewar Level:", "label", "reserve_level", "llabel"), ] w_dwr, b_dwr = Widgets.build_info(captions, orientation=orientation) self.w.update(b_dwr) b_dwr.dewar_level.set_text(f'{self.INSTR.get_DWRN2LV():5.1f}') b_dwr.reserve_level.set_text(f'{self.INSTR.get_RESN2LV():5.1f}') b_dwr.fill_dewar.add_callback('activated', lambda w: self.INSTR.fill_dewar()) b_dwr.fill_dewar.set_tooltip( "Fill the camera dewar. Takes roughly 15 minutes.") fr_dwr.set_widget(w_dwr) vbox.add_widget(fr_dwr, stretch=0) ## HIRES Exposure Meter fr_expo = Widgets.Frame(f"HIRES Exposure Meter") captions = [ ("System power:", "label", "PMT0MPOW", "llabel", "Toggle System Power", "button"), ("System armed:", "label", "is_armed", "llabel", "Toggle Arming", "button"), ("Exposure Set Point:", "label", "setpoint", "llabel", 'set_setpoint', 'entry'), ("Current Level:", "label", "currentlevel", "llabel"), ("Time Remaining (s):", "label", "esttime", "llabel"), ] w_expo, b_expo = Widgets.build_info(captions, orientation=orientation) self.w.update(b_expo) # b_expo.PMT0MPOW.set_text(f'{self.INSTR.expo_get_power_on()}') # b_expo.toggle_system_power.add_callback('activated', # lambda w: self.INST.expo_toggle_power()) fr_expo.set_widget(w_expo) vbox.add_widget(fr_expo, stretch=0) ## ----------------------------------------------------- ## Spacer ## ----------------------------------------------------- # Add a spacer to stretch the rest of the way to the end of the # plugin space spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) # scroll bars will allow lots of content to be accessed top.add_widget(sw, stretch=1) ## ----------------------------------------------------- ## Bottom ## ----------------------------------------------------- # A button box that is always visible at the bottom btns_close = Widgets.HBox() btns_close.set_spacing(3) # Add a close button for the convenience of the user # btn = Widgets.Button("Close") # btn.add_callback('activated', lambda w: self.close()) # btns_close.add_widget(btn, stretch=0) btns_close.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns_close, stretch=0) # Add our GUI to the container container.add_widget(top, stretch=1)
def build_gui(self, container): if not have_mpl: raise ImportError('Install matplotlib to use this plugin') top = Widgets.VBox() top.set_border_width(4) # Make the cuts plot box, sw, orientation = Widgets.get_oriented_box(container) box.set_margins(4, 4, 4, 4) box.set_spacing(2) paned = Widgets.Splitter(orientation=orientation) # Add Tab Widget nb = Widgets.TabWidget(tabpos='top') paned.add_widget(Widgets.hadjust(nb, orientation)) self.cuts_plot = plots.CutsPlot(logger=self.logger, width=400, height=400) self.plot = Plot.PlotWidget(self.cuts_plot) self.plot.resize(400, 400) ax = self.cuts_plot.add_axis() ax.grid(True) self.slit_plot = plots.Plot(logger=self.logger, width=400, height=400) if plots.MPL_GE_2_0: kwargs = {'facecolor': 'black'} else: kwargs = {'axisbg': 'black'} self.slit_plot.add_axis(**kwargs) self.plot2 = Plot.PlotWidget(self.slit_plot) self.plot2.resize(400, 400) captions = ( ('Cut:', 'label', 'Cut', 'combobox', 'New Cut Type:', 'label', 'Cut Type', 'combobox'), ('Delete Cut', 'button', 'Delete All', 'button'), ('Save', 'button'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) # control for selecting a cut combobox = b.cut for tag in self.tags: combobox.append_text(tag) combobox.show_text(self.cutstag) combobox.add_callback('activated', self.cut_select_cb) self.w.cuts = combobox combobox.set_tooltip("Select a cut to redraw or delete") # control for selecting cut type combobox = b.cut_type for cuttype in self.cuttypes: combobox.append_text(cuttype) self.w.cuts_type = combobox index = self.cuttypes.index(self.cuttype) combobox.set_index(index) combobox.add_callback('activated', self.set_cutsdrawtype_cb) combobox.set_tooltip("Choose the cut type to draw") self.save_cuts = b.save self.save_cuts.set_tooltip("Save cuts plot and data") self.save_cuts.add_callback('activated', lambda w: self.save_cb(mode='cuts')) self.save_cuts.set_enabled(self.save_enabled) btn = b.delete_cut btn.add_callback('activated', self.delete_cut_cb) btn.set_tooltip("Delete selected cut") btn = b.delete_all btn.add_callback('activated', self.delete_all_cb) btn.set_tooltip("Clear all cuts") fr = Widgets.Frame("Cuts") fr.set_widget(w) box.add_widget(fr, stretch=0) exp = Widgets.Expander("Cut Width") captions = (('Width Type:', 'label', 'Width Type', 'combobox', 'Width radius:', 'label', 'Width radius', 'spinbutton'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) # control for selecting width cut type combobox = b.width_type for atype in self.widthtypes: combobox.append_text(atype) index = self.widthtypes.index(self.widthtype) combobox.set_index(index) combobox.add_callback('activated', self.set_width_type_cb) combobox.set_tooltip("Direction of summation orthogonal to cut") sb = b.width_radius sb.add_callback('value-changed', self.width_radius_changed_cb) sb.set_tooltip("Radius of cut width") sb.set_limits(1, 100) sb.set_value(self.width_radius) fr = Widgets.Frame() fr.set_widget(w) exp.set_widget(fr) box.add_widget(exp, stretch=0) box.add_widget(Widgets.Label(''), stretch=1) paned.add_widget(sw) # hack to set a reasonable starting position for the splitter paned.set_sizes([400, 500]) top.add_widget(paned, stretch=5) mode = self.canvas.get_draw_mode() hbox = Widgets.HBox() btn1 = Widgets.RadioButton("Move") btn1.set_state(mode == 'move') btn1.add_callback('activated', lambda w, val: self.set_mode_cb('move', val)) btn1.set_tooltip("Choose this to position cuts") self.w.btn_move = btn1 hbox.add_widget(btn1) btn2 = Widgets.RadioButton("Draw", group=btn1) btn2.set_state(mode == 'draw') btn2.add_callback('activated', lambda w, val: self.set_mode_cb('draw', val)) btn2.set_tooltip("Choose this to draw a new or replacement cut") self.w.btn_draw = btn2 hbox.add_widget(btn2) btn3 = Widgets.RadioButton("Edit", group=btn1) btn3.set_state(mode == 'edit') btn3.add_callback('activated', lambda w, val: self.set_mode_cb('edit', val)) btn3.set_tooltip("Choose this to edit a cut") self.w.btn_edit = btn3 hbox.add_widget(btn3) hbox.add_widget(Widgets.Label(''), stretch=1) top.add_widget(hbox, stretch=0) # Add Cuts plot to its tab vbox_cuts = Widgets.VBox() vbox_cuts.add_widget(self.plot, stretch=1) nb.add_widget(vbox_cuts, title="Cuts") captions = (("Enable Slit", 'checkbutton', "Transpose Plot", 'checkbutton', "Save", 'button'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) def chg_enable_slit(w, val): self.use_slit = val if val: self.build_axes() return True b.enable_slit.set_state(self.use_slit) b.enable_slit.set_tooltip("Enable the slit function") b.enable_slit.add_callback('activated', chg_enable_slit) self.t_btn = b.transpose_plot self.t_btn.set_tooltip("Flip the plot") self.t_btn.set_state(self.transpose_enabled) self.t_btn.add_callback('activated', self.transpose_plot) self.save_slit = b.save self.save_slit.set_tooltip("Save slit plot and data") self.save_slit.add_callback('activated', lambda w: self.save_cb(mode='slit')) self.save_slit.set_enabled(self.save_enabled) # Add frame to hold the slit controls fr = Widgets.Frame("Axes controls") self.hbox_axes = Widgets.HBox() self.hbox_axes.set_border_width(4) self.hbox_axes.set_spacing(1) fr.set_widget(self.hbox_axes) # Add Slit plot and controls to its tab vbox_slit = Widgets.VBox() vbox_slit.add_widget(self.plot2, stretch=1) vbox_slit.add_widget(w) vbox_slit.add_widget(fr) nb.add_widget(vbox_slit, title="Slit") btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(3) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btn = Widgets.Button("Help") btn.add_callback('activated', lambda w: self.help()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.select_cut(self.cutstag) self.gui_up = True if self.use_slit: self.build_axes()
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) self.msg_font = self.fv.get_font("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msg_font) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Mosaic") captions = [ ("FOV (deg):", 'label', 'Fov', 'llabel', 'set_fov', 'entry'), ("New Mosaic", 'button', "Allow expansion", 'checkbutton'), ("Label images", 'checkbutton', "Match bg", 'checkbutton'), ("Trim Pixels:", 'label', 'Trim Px', 'llabel', 'trim_pixels', 'entry'), ("Num Threads:", 'label', 'Num Threads', 'llabel', 'set_num_threads', 'entry'), ("Merge data", 'checkbutton', "Drop new", 'checkbutton'), ("Mosaic HDUs", 'checkbutton'), ] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) fov_deg = self.settings.get('fov_deg', 1.0) b.fov.set_text(str(fov_deg)) #b.set_fov.set_length(8) b.set_fov.set_text(str(fov_deg)) b.set_fov.add_callback('activated', self.set_fov_cb) b.set_fov.set_tooltip("Set size of mosaic FOV (deg)") b.allow_expansion.set_tooltip("Allow image to expand the FOV") allow_expand = self.settings.get('allow_expand', True) b.allow_expansion.set_state(allow_expand) b.allow_expansion.add_callback('activated', self.allow_expand_cb) b.new_mosaic.add_callback('activated', lambda w: self.new_mosaic_cb()) labelem = self.settings.get('annotate_images', False) b.label_images.set_state(labelem) b.label_images.set_tooltip( "Label tiles with their names (only if allow_expand=False)") b.label_images.add_callback('activated', self.annotate_cb) trim_px = self.settings.get('trim_px', 0) match_bg = self.settings.get('match_bg', False) b.match_bg.set_tooltip("Try to match background levels") b.match_bg.set_state(match_bg) b.match_bg.add_callback('activated', self.match_bg_cb) b.trim_pixels.set_tooltip( "Set number of pixels to trim from each edge") b.trim_px.set_text(str(trim_px)) b.trim_pixels.add_callback('activated', self.trim_pixels_cb) #b.trim_pixels.set_length(8) b.trim_pixels.set_text(str(trim_px)) num_threads = self.settings.get('num_threads', 4) b.num_threads.set_text(str(num_threads)) #b.set_num_threads.set_length(8) b.set_num_threads.set_text(str(num_threads)) b.set_num_threads.set_tooltip("Number of threads to use for mosaicing") b.set_num_threads.add_callback('activated', self.set_num_threads_cb) merge = self.settings.get('merge', False) b.merge_data.set_tooltip("Merge data instead of overlay") b.merge_data.set_state(merge) b.merge_data.add_callback('activated', self.merge_cb) drop_new = self.settings.get('drop_creates_new_mosaic', False) b.drop_new.set_tooltip("Dropping files on image starts a new mosaic") b.drop_new.set_state(drop_new) b.drop_new.add_callback('activated', self.drop_new_cb) mosaic_hdus = self.settings.get('mosaic_hdus', False) b.mosaic_hdus.set_tooltip("Mosaic data HDUs in each file") b.mosaic_hdus.set_state(mosaic_hdus) b.mosaic_hdus.add_callback('activated', self.mosaic_hdus_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) vbox2 = Widgets.VBox() # Mosaic evaluation status hbox = Widgets.HBox() hbox.set_spacing(4) hbox.set_border_width(4) label = Widgets.Label() self.w.eval_status = label hbox.add_widget(self.w.eval_status, stretch=0) hbox.add_widget(Widgets.Label(''), stretch=1) vbox2.add_widget(hbox, stretch=0) # Mosaic evaluation progress bar and stop button hbox = Widgets.HBox() hbox.set_spacing(4) hbox.set_border_width(4) btn = Widgets.Button("Stop") btn.add_callback('activated', lambda w: self.eval_intr()) btn.set_enabled(False) self.w.btn_intr_eval = btn hbox.add_widget(btn, stretch=0) self.w.eval_pgs = Widgets.ProgressBar() hbox.add_widget(self.w.eval_pgs, stretch=1) vbox2.add_widget(hbox, stretch=0) vbox2.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(vbox2, stretch=1) self.w.vbox = Widgets.VBox() vbox.add_widget(self.w.vbox, stretch=0) spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(3) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.gui_up = True
def build_gui(self, container): if not have_imexam: raise Exception("Please install 'imexam' to use this plugin") top = Widgets.VBox() top.set_border_width(4) fontsize = self.settings.get('fontsize', 12) msg_font = self.fv.get_font('sans', fontsize) tw = Widgets.TextArea(wrap=False, editable=False) tw.set_font(msg_font) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) top.add_widget(fr, stretch=0) fr = Widgets.Frame("Imexam output:") if not self._plots_in_ws: splitter = Widgets.Splitter(orientation='vertical') self.nb = Widgets.TabWidget() splitter.add_widget(self.nb) # this holds the messages returned from imexamine tw = Widgets.TextArea(wrap=False, editable=False) font = self.settings.get('font', 'Courier') fixed_font = self.fv.get_font(font, fontsize) tw.set_font(fixed_font) self.msg_res = tw if not self._plots_in_ws: splitter.add_widget(tw) fr.set_widget(splitter) else: fr.set_widget(tw) top.add_widget(fr, stretch=1) hbox = Widgets.HBox() btn = Widgets.Button('Detach Plot') btn.add_callback('activated', self.detach_plot_cb) btn.set_tooltip("Detach current plot and start a new one") hbox.add_widget(btn, stretch=0) btn = Widgets.Button('Clear Text') btn.add_callback('activated', self.clear_text_cb) btn.set_tooltip("Clear the imexam output") hbox.add_widget(btn, stretch=0) hbox.add_widget(Widgets.Label(''), stretch=1) top.add_widget(hbox, stretch=0) top.add_widget(hbox, stretch=0) hbox = Widgets.HBox() lbl = Widgets.Label("Keys active:") hbox.add_widget(lbl) btn1 = Widgets.RadioButton("On") btn1.set_state(self.imexam_active) btn1.add_callback('activated', lambda w, val: self.set_active_cb(True, val)) btn1.set_tooltip("Enable imexam keys") self.w.btn_on = btn1 hbox.add_widget(btn1) btn2 = Widgets.RadioButton("Off", group=btn1) btn2.set_state(not self.imexam_active) btn2.add_callback('activated', lambda w, val: self.set_active_cb(False, val)) btn2.set_tooltip("Disable imexam keys") self.w.btn_off = btn2 hbox.add_widget(btn2) hbox.add_widget(Widgets.Label(''), stretch=1) top.add_widget(hbox, stretch=0) btns = Widgets.HBox() btns.set_spacing(3) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) self._plot = None self._plot_w = None self._plot_idx = 0 self.make_new_figure() container.add_widget(top, stretch=1)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) msgFont = self.fv.getFont('sansFont', 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(msgFont) self.tw = tw fr = Widgets.Expander('Instructions') fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame('Single Pixel') captions = [('X:', 'label', 'X', 'entry'), ('Y:', 'label', 'Y', 'entry'), ('DQ Flag:', 'label', 'DQ', 'llabel')] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.x.set_tooltip('X of pixel') b.x.set_text(str(self.xcen)) b.x.add_callback('activated', lambda w: self.set_xcen()) b.y.set_tooltip('Y of pixel') b.y.set_text(str(self.ycen)) b.y.add_callback('activated', lambda w: self.set_ycen()) b.dq.set_tooltip('DQ value of pixel') b.dq.set_text(self._no_keyword) # Create the Treeview self.pxdqlist = Widgets.TreeView(auto_expand=True, sortable=True, selection='multiple', use_alt_row_color=True) self.pxdqlist.setup_table(self.pxdqcolumns, 1, 'FLAG') splitter = Widgets.Splitter('vertical') splitter.add_widget(w) splitter.add_widget(self.pxdqlist) fr.set_widget(splitter) vbox.add_widget(fr, stretch=1) fr = Widgets.Frame('Whole Image') captions = [('Number of pixels:', 'llabel', 'npix', 'llabel', 'spacer1', 'spacer')] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.npix.set_tooltip('Number of affected pixels') b.npix.set_text(self._no_keyword) # Create the Treeview self.imdqlist = Widgets.TreeView(auto_expand=True, sortable=True, selection='multiple', use_alt_row_color=True) self.imdqlist.setup_table(self.imdqcolumns, 1, 'FLAG') self.imdqlist.add_callback('selected', self.mark_dqs_cb) splitter = Widgets.Splitter('vertical') splitter.add_widget(w) splitter.add_widget(self.imdqlist) fr.set_widget(splitter) vbox.add_widget(fr, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(3) btn = Widgets.Button('Close') btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.gui_up = True # Populate fields based on active image self.redo()
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) # Make the cuts plot vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_margins(4, 4, 4, 4) vbox.set_spacing(2) msg_font = self.fv.get_font('sansFont', 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(msg_font) self.tw = tw fr = Widgets.Expander('Instructions') fr.set_widget(tw) vbox.add_widget(fr, stretch=0) # Add Tab Widget nb = Widgets.TabWidget(tabpos='top') vbox.add_widget(nb, stretch=1) self.tab_plot = plots.Plot(logger=self.logger, width=400, height=400) self.plot = Plot.PlotWidget(self.tab_plot) self.plot.resize(400, 400) ax = self.tab_plot.add_axis() ax.grid(True) # Add plot to its tab vbox_plot = Widgets.VBox() vbox_plot.add_widget(self.plot, stretch=1) nb.add_widget(vbox_plot, title='Plot') captions = (('X:', 'label', 'x_combo', 'combobox'), ('Y:', 'label', 'y_combo', 'combobox'), ('Log X', 'checkbutton', 'Log Y', 'checkbutton', 'Show Marker', 'checkbutton'), ('X Low:', 'label', 'x_lo', 'entry'), ('X High:', 'label', 'x_hi', 'entry'), ('Y Low:', 'label', 'y_lo', 'entry'), ('Y High:', 'label', 'y_hi', 'entry'), ('Save', 'button')) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) # Controls for X-axis column listing combobox = b.x_combo combobox.add_callback('activated', self.x_select_cb) self.w.xcombo = combobox combobox.set_tooltip('Select a column to plot on X-axis') # Controls for Y-axis column listing combobox = b.y_combo combobox.add_callback('activated', self.y_select_cb) self.w.ycombo = combobox combobox.set_tooltip('Select a column to plot on Y-axis') b.log_x.set_state(self.tab_plot.logx) b.log_x.add_callback('activated', self.log_x_cb) b.log_x.set_tooltip('Plot X-axis in log scale') b.log_y.set_state(self.tab_plot.logy) b.log_y.add_callback('activated', self.log_y_cb) b.log_y.set_tooltip('Plot Y-axis in log scale') b.x_lo.add_callback('activated', lambda w: self.set_xlim_cb()) b.x_lo.set_tooltip('Set X lower limit') b.x_hi.add_callback('activated', lambda w: self.set_xlim_cb()) b.x_hi.set_tooltip('Set X upper limit') b.y_lo.add_callback('activated', lambda w: self.set_ylim_cb()) b.y_lo.set_tooltip('Set Y lower limit') b.y_hi.add_callback('activated', lambda w: self.set_ylim_cb()) b.y_hi.set_tooltip('Set Y upper limit') b.show_marker.set_state(self.settings.get('show_marker', True)) b.show_marker.add_callback('activated', self.set_marker_cb) b.show_marker.set_tooltip('Mark data points') # Button to save plot self.save_plot = b.save self.save_plot.set_tooltip('Save table plot') self.save_plot.add_callback('activated', lambda w: self.save_cb()) self.save_plot.set_enabled(False) vbox2 = Widgets.VBox() vbox2.add_widget(w, stretch=0) vbox.add_widget(vbox2, stretch=0) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(3) btn = Widgets.Button('Close') btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.gui_up = True
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) self.orientation = orientation vbox.set_border_width(4) vbox.set_spacing(2) msg_font = self.fv.get_font("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(msg_font) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Drawing") captions = ( ("Draw type:", 'label', "Draw type", 'combobox'), ("Coord type:", 'label', "Coord type", 'combobox'), ) w, b = Widgets.build_info(captions) self.w.update(b) combobox = b.draw_type for name in self.drawtypes: combobox.append_text(name) index = self.drawtypes.index(default_drawtype) combobox.set_index(index) combobox.add_callback('activated', lambda w, idx: self.set_drawparams_cb()) combobox = b.coord_type for name in self.coordtypes: combobox.append_text(name) index = 0 combobox.set_index(index) combobox.add_callback('activated', lambda w, idx: self.set_drawparams_cb()) fr.set_widget(w) vbox.add_widget(fr, stretch=0) mode = self.canvas.get_draw_mode() hbox = Widgets.HBox() btn1 = Widgets.RadioButton("Draw") btn1.set_state(mode == 'draw') btn1.add_callback('activated', lambda w, val: self.set_mode_cb('draw', val)) btn1.set_tooltip("Choose this to draw") self.w.btn_draw = btn1 hbox.add_widget(btn1) btn2 = Widgets.RadioButton("Edit", group=btn1) btn2.set_state(mode == 'edit') btn2.add_callback('activated', lambda w, val: self.set_mode_cb('edit', val)) btn2.set_tooltip("Choose this to edit") self.w.btn_edit = btn2 hbox.add_widget(btn2) hbox.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(hbox, stretch=0) fr = Widgets.Frame("Attributes") vbox2 = Widgets.VBox() self.w.attrlbl = Widgets.Label() vbox2.add_widget(self.w.attrlbl, stretch=0) self.w.drawvbox = Widgets.VBox() vbox2.add_widget(self.w.drawvbox, stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) captions = ( ("Rotate By:", 'label', 'Rotate By', 'entry', "Scale By:", 'label', 'Scale By', 'entry'), ("Delete Obj", 'button', "sp1", 'spacer', "Create mask", 'button', "Clear canvas", 'button'), ) w, b = Widgets.build_info(captions) self.w.update(b) b.delete_obj.add_callback('activated', lambda w: self.delete_object()) b.delete_obj.set_tooltip("Delete selected object in edit mode") b.delete_obj.set_enabled(False) b.scale_by.add_callback('activated', self.scale_object) b.scale_by.set_text('0.9') b.scale_by.set_tooltip("Scale selected object in edit mode") b.scale_by.set_enabled(False) b.rotate_by.add_callback('activated', self.rotate_object) b.rotate_by.set_text('90.0') b.rotate_by.set_tooltip("Rotate selected object in edit mode") b.rotate_by.set_enabled(False) b.create_mask.add_callback('activated', lambda w: self.create_mask()) b.create_mask.set_tooltip("Create boolean mask from drawing") b.clear_canvas.add_callback('activated', lambda w: self.clear_canvas()) b.clear_canvas.set_tooltip("Delete all drawing objects") vbox.add_widget(w, stretch=0) spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.toggle_create_button()
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container, fill=True) vbox.set_border_width(4) vbox.set_spacing(2) self.msg_font = self.fv.get_font("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msg_font) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Pixel Values") # We just use a ginga widget to implement the pixtable pixview = Viewers.CanvasView(logger=self.logger) width, height = 300, 300 pixview.set_desired_size(width, height) bg = colors.lookup_color('#202030') pixview.set_bg(*bg) bd = pixview.get_bindings() self.pixview = pixview self.pix_w = Viewers.ScrolledView(pixview) self.pix_w.resize(width, height) fr.set_widget(self.pix_w) vbox.add_widget(fr, stretch=1) self._rebuild_table() btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) cbox1 = Widgets.ComboBox() index = 0 for i in self.sizes: j = 1 + i * 2 name = "%dx%d" % (j, j) cbox1.append_text(name) index += 1 index = self.sizes.index(self.pixtbl_radius) cbox1.set_index(index) cbox1.add_callback('activated', self.set_cutout_size_cb) cbox1.set_tooltip("Select size of pixel table") btns.add_widget(cbox1, stretch=0) # control for selecting a mark cbox2 = Widgets.ComboBox() for tag in self.marks: cbox2.append_text(tag) if self.mark_selected is None: cbox2.set_index(0) else: cbox2.show_text(self.mark_selected) cbox2.add_callback('activated', self.mark_select_cb) self.w.marks = cbox2 cbox2.set_tooltip("Select a mark") #cbox2.setMinimumContentsLength(8) btns.add_widget(cbox2, stretch=0) btn1 = Widgets.Button("Delete") btn1.add_callback('activated', lambda w: self.clear_mark_cb()) btn1.set_tooltip("Delete selected mark") btns.add_widget(btn1, stretch=0) btn2 = Widgets.Button("Delete All") btn2.add_callback('activated', lambda w: self.clear_all()) btn2.set_tooltip("Clear all marks") btns.add_widget(btn2, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) vbox2 = Widgets.VBox() vbox2.add_widget(btns, stretch=0) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn3 = Widgets.CheckBox("Pan to mark") btn3.set_state(self.pan2mark) btn3.add_callback('activated', self.pan2mark_cb) btn3.set_tooltip("Pan follows selected mark") btns.add_widget(btn3) btns.add_widget(Widgets.Label(''), stretch=1) vbox2.add_widget(btns, stretch=0) captions = [ ('Font size:', 'label', 'Font size', 'combobox'), ] w, b = Widgets.build_info(captions) self.w.update(b) vbox2.add_widget(w, stretch=0) b.font_size.set_tooltip("Set font size for pixel display") for size in (8, 9, 10, 11, 12, 14, 16): b.font_size.append_text(str(size)) b.font_size.show_text(str(self.fontsize)) b.font_size.add_callback('activated', self.set_font_size_cb) vbox2.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(vbox2, stretch=1) ## spacer = Widgets.Label('') ## vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) # Make the cuts plot vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_margins(4, 4, 4, 4) vbox.set_spacing(2) msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(msgFont) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) # Add Tab Widget nb = Widgets.TabWidget(tabpos='top') vbox.add_widget(nb, stretch=1) self.cuts_plot = plots.CutsPlot(logger=self.logger, width=400, height=400) self.plot = Plot.PlotWidget(self.cuts_plot) self.plot.resize(400, 400) ax = self.cuts_plot.add_axis() ax.grid(True) self.slit_plot = plots.Plot(logger=self.logger, width=400, height=400) self.slit_plot.add_axis(axisbg='black') self.plot2 = Plot.PlotWidget(self.slit_plot) self.plot2.resize(400, 400) captions = (('Cut:', 'label', 'Cut', 'combobox', 'New Cut Type:', 'label', 'Cut Type', 'combobox'), ('Delete Cut', 'button', 'Delete All', 'button'), ('Save', 'button'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) # control for selecting a cut combobox = b.cut for tag in self.tags: combobox.append_text(tag) combobox.show_text(self.cutstag) combobox.add_callback('activated', self.cut_select_cb) self.w.cuts = combobox combobox.set_tooltip("Select a cut to redraw or delete") # control for selecting cut type combobox = b.cut_type for cuttype in self.cuttypes: combobox.append_text(cuttype) self.w.cuts_type = combobox index = self.cuttypes.index(self.cuttype) combobox.set_index(index) combobox.add_callback('activated', self.set_cutsdrawtype_cb) combobox.set_tooltip("Choose the cut type to draw") self.save_cuts = b.save self.save_cuts.set_tooltip("Save cuts plot and data") self.save_cuts.add_callback('activated', lambda w: self.save_cb(mode='cuts')) self.save_cuts.set_enabled(self.save_enabled) btn = b.delete_cut btn.add_callback('activated', self.delete_cut_cb) btn.set_tooltip("Delete selected cut") btn = b.delete_all btn.add_callback('activated', self.delete_all_cb) btn.set_tooltip("Clear all cuts") vbox2 = Widgets.VBox() vbox2.add_widget(w, stretch=0) exp = Widgets.Expander("Cut Width") captions = (('Width Type:', 'label', 'Width Type', 'combobox', 'Width radius:', 'label', 'Width radius', 'spinbutton'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) # control for selecting width cut type combobox = b.width_type for atype in self.widthtypes: combobox.append_text(atype) index = self.widthtypes.index(self.widthtype) combobox.set_index(index) combobox.add_callback('activated', self.set_width_type_cb) combobox.set_tooltip("Direction of summation orthogonal to cut") sb = b.width_radius sb.add_callback('value-changed', self.width_radius_changed_cb) sb.set_tooltip("Radius of cut width") sb.set_limits(1, 100) sb.set_value(self.width_radius) fr = Widgets.Frame() fr.set_widget(w) exp.set_widget(fr) vbox2.add_widget(exp, stretch=0) mode = self.canvas.get_draw_mode() hbox = Widgets.HBox() btn1 = Widgets.RadioButton("Move") btn1.set_state(mode == 'move') btn1.add_callback('activated', lambda w, val: self.set_mode_cb('move', val)) btn1.set_tooltip("Choose this to position cuts") self.w.btn_move = btn1 hbox.add_widget(btn1) btn2 = Widgets.RadioButton("Draw", group=btn1) btn2.set_state(mode == 'draw') btn2.add_callback('activated', lambda w, val: self.set_mode_cb('draw', val)) btn2.set_tooltip("Choose this to draw a new or replacement cut") self.w.btn_draw = btn2 hbox.add_widget(btn2) btn3 = Widgets.RadioButton("Edit", group=btn1) btn3.set_state(mode == 'edit') btn3.add_callback('activated', lambda w, val: self.set_mode_cb('edit', val)) btn3.set_tooltip("Choose this to edit a cut") self.w.btn_edit = btn3 hbox.add_widget(btn3) hbox.add_widget(Widgets.Label(''), stretch=1) vbox2.add_widget(hbox, stretch=0) vbox2.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(vbox2, stretch=0) # Add Cuts plot to its tab vbox_cuts = Widgets.VBox() vbox_cuts.add_widget(self.plot, stretch=1) nb.add_widget(vbox_cuts, title="Cuts") if self.use_slit: captions = (("Transpose Plot", 'checkbutton', "Save", 'button'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) self.t_btn = b.transpose_plot self.t_btn.set_tooltip("Flip the plot") self.t_btn.set_state(self.transpose_enabled) self.t_btn.add_callback('activated', self.transpose_plot) self.save_slit = b.save self.save_slit.set_tooltip("Save slit plot and data") self.save_slit.add_callback('activated', lambda w: self.save_cb(mode='slit')) self.save_slit.set_enabled(self.save_enabled) # Add frame to hold the slit controls fr = Widgets.Frame("Axes controls") self.hbox_axes = Widgets.HBox() self.hbox_axes.set_border_width(4) self.hbox_axes.set_spacing(1) fr.set_widget(self.hbox_axes) # Add Slit plot and controls to its tab vbox_slit = Widgets.VBox() vbox_slit.add_widget(self.plot2, stretch=1) vbox_slit.add_widget(w) vbox_slit.add_widget(fr) nb.add_widget(vbox_slit, title="Slit") top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(3) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.select_cut(self.cutstag) self.gui_up = True if self.use_slit: self.build_axes()
review3="Jolly good!")) w.set_tree(tree) vbox.add_widget(w, stretch=1) elif wname == 'webview': w = Widgets.WebView() w.load_url("http://www.google.com/") vbox.add_widget(w) elif wname == 'frame': w = Widgets.Frame(title="Frame Title") w.set_widget(Widgets.Label("Framed content")) vbox.add_widget(w) elif wname == 'expander': w = Widgets.Expander(title="Expander Title") w.set_widget(Widgets.Label("Expander content")) vbox.add_widget(w) elif wname == 'hbox': w = Widgets.HBox() w.add_widget(Widgets.Label("Item 1"), stretch=0) w.add_widget(Widgets.Label("Item 2"), stretch=1) vbox.add_widget(w) elif wname == 'vbox': w = Widgets.VBox() w.add_widget(Widgets.Label("Item 1"), stretch=0) w.add_widget(Widgets.Label("Item 2"), stretch=1) vbox.add_widget(w)
def build_gui(self, container, future=None): vbox1 = Widgets.VBox() msg_font = self.fv.get_font("sansFont", 14) tw = Widgets.TextArea() tw.set_font(msg_font) tw.set_wrap(True) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox1.add_widget(fr, stretch=0) nb = Widgets.TabWidget(tabpos='bottom') self.w.nb = nb vbox1.add_widget(nb, stretch=1) vbox0 = Widgets.VBox() hbox = Widgets.HBox() hbox.set_spacing(4) vbox0.add_widget(hbox, stretch=1) vbox = Widgets.VBox() fr = Widgets.Frame(" Image Server ") fr.set_widget(vbox) hbox.add_widget(fr, stretch=0) captions = (('Server:', 'llabel'), ('Server', 'combobox'), ('Use DSS channel', 'checkbutton'), ('Get Image', 'button')) w, b = Widgets.build_info(captions) self.w.update(b) self.w.get_image.add_callback('activated', lambda w: self.getimage_cb()) self.w.use_dss_channel.set_state(self.use_dss_channel) self.w.use_dss_channel.add_callback('activated', self.use_dss_channel_cb) vbox.add_widget(w, stretch=0) self.w.img_params = Widgets.StackWidget() vbox.add_widget(self.w.img_params, stretch=1) combobox = self.w.server index = 0 self.image_server_options = self.fv.imgsrv.getServerNames(kind='image') for name in self.image_server_options: combobox.append_text(name) index += 1 index = 0 combobox.set_index(index) combobox.add_callback('activated', lambda w, idx: self.setup_params_image(idx)) if len(self.image_server_options) > 0: self.setup_params_image(index, redo=False) vbox = Widgets.VBox() fr = Widgets.Frame(" Catalog Server ") fr.set_widget(vbox) hbox.add_widget(fr, stretch=0) captions = (('Server:', 'llabel'), ('Server', 'combobox'), ('Limit stars to area', 'checkbutton'), ('Search', 'button')) w, self.w2 = Widgets.build_info(captions) self.w2.search.add_callback('activated', lambda w: self.getcatalog_cb()) self.w2.limit_stars_to_area.set_state(self.limit_stars_to_area) self.w2.limit_stars_to_area.add_callback('activated', self.limit_area_cb) vbox.add_widget(w, stretch=0) self.w2.cat_params = Widgets.StackWidget() vbox.add_widget(self.w2.cat_params, stretch=1) combobox = self.w2.server index = 0 self.catalog_server_options = self.fv.imgsrv.getServerNames( kind='catalog') for name in self.catalog_server_options: combobox.append_text(name) index += 1 index = 0 combobox.set_index(index) combobox.add_callback('activated', lambda w, idx: self.setup_params_catalog(idx)) if len(self.catalog_server_options) > 0: self.setup_params_catalog(index, redo=False) # stretch vbox0.add_widget(Widgets.Label(''), stretch=1) btns = Widgets.HBox() btns.set_spacing(5) btn1 = Widgets.RadioButton("Rectangle") btn1.set_state(self.drawtype == 'rectangle') btn1.add_callback('activated', lambda w, tf: self.set_drawtype_cb(tf, 'rectangle')) btns.add_widget(btn1, stretch=0) btn2 = Widgets.RadioButton("Circle", group=btn1) btn2.set_state(self.drawtype == 'circle') btn2.add_callback('activated', lambda w, tf: self.set_drawtype_cb(tf, 'circle')) btns.add_widget(btn2, stretch=0) btn = Widgets.Button("Entire image") btn.add_callback('activated', lambda w: self.setfromimage()) btns.add_widget(btn, stretch=0) vbox0.add_widget(btns, stretch=0) self.w.params = vbox0 sw = Widgets.ScrollArea() sw.set_widget(vbox0) nb.add_widget(sw, title="Params") vbox = Widgets.VBox() self.table = CatalogListing(self.logger, vbox) hbox = Widgets.HBox() adj = Widgets.Slider(orientation='horizontal') adj.set_limits(0, 1000, incr_value=1) adj.set_value(0) #adj.resize(200, -1) adj.set_tracking(True) adj.set_tooltip("Choose subset of stars plotted") self.w.plotgrp = adj adj.add_callback('value-changed', self.plot_pct_cb) hbox.add_widget(adj, stretch=1) sb = Widgets.SpinBox(dtype=int) sb.set_limits(10, self.plot_max, incr_value=10) sb.set_value(self.plot_limit) #sb.set_wrapping(False) self.w.plotnum = sb sb.set_tooltip("Adjust size of subset of stars plotted") sb.add_callback('value-changed', self.plot_limit_cb) hbox.add_widget(sb, stretch=0) vbox.add_widget(hbox, stretch=0) self.w.listing = vbox nb.add_widget(vbox, title="Listing") btns = Widgets.HBox() btns.set_spacing(3) self.w.buttons = btns btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) if future: btn = Widgets.Button('Ok') btn.add_callback('activated', lambda w: self.ok()) btns.add_widget(btn, stretch=0) btn = Widgets.Button('Cancel') btn.add_callback('activated', lambda w: self.cancel()) btns.add_widget(btn, stretch=0) vbox1.add_widget(btns, stretch=0) container.add_widget(vbox1, stretch=1) self.gui_up = True
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) self.orientation = orientation #vbox.set_border_width(4) vbox.set_spacing(2) # COLOR DISTRIBUTION OPTIONS fr = Widgets.Frame("Color Distribution") captions = ( ('Algorithm:', 'label', 'Algorithm', 'combobox'), #('Table Size:', 'label', 'Table Size', 'entryset'), ('Dist Defaults', 'button')) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) self.w.calg_choice = b.algorithm #self.w.table_size = b.table_size b.algorithm.set_tooltip("Choose a color distribution algorithm") #b.table_size.set_tooltip("Set size of the distribution hash table") b.dist_defaults.set_tooltip("Restore color distribution defaults") b.dist_defaults.add_callback('activated', lambda w: self.set_default_distmaps()) combobox = b.algorithm options = [] index = 0 for name in self.calg_names: options.append(name) combobox.append_text(name) index += 1 index = self.calg_names.index(self.t_.get('color_algorithm', "linear")) combobox.set_index(index) combobox.add_callback('activated', self.set_calg_cb) ## entry = b.table_size ## entry.set_text(str(self.t_.get('color_hashsize', 65535))) ## entry.add_callback('activated', self.set_tablesize_cb) fr.set_widget(w) vbox.add_widget(fr) # COLOR MAPPING OPTIONS fr = Widgets.Frame("Color Mapping") captions = (('Colormap:', 'label', 'Colormap', 'combobox'), ('Intensity:', 'label', 'Intensity', 'combobox'), ('Color Defaults', 'button')) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) self.w.cmap_choice = b.colormap self.w.imap_choice = b.intensity b.color_defaults.add_callback('activated', lambda w: self.set_default_cmaps()) b.colormap.set_tooltip("Choose a color map for this image") b.intensity.set_tooltip("Choose an intensity map for this image") b.color_defaults.set_tooltip( "Restore default color and intensity maps") fr.set_widget(w) vbox.add_widget(fr) combobox = b.colormap options = [] index = 0 for name in self.cmap_names: options.append(name) combobox.append_text(name) index += 1 cmap_name = self.t_.get('color_map', "gray") try: index = self.cmap_names.index(cmap_name) except Exception: index = self.cmap_names.index('gray') combobox.set_index(index) combobox.add_callback('activated', self.set_cmap_cb) combobox = b.intensity options = [] index = 0 for name in self.imap_names: options.append(name) combobox.append_text(name) index += 1 imap_name = self.t_.get('intensity_map', "ramp") try: index = self.imap_names.index(imap_name) except Exception: index = self.imap_names.index('ramp') combobox.set_index(index) combobox.add_callback('activated', self.set_imap_cb) # AUTOCUTS OPTIONS fr = Widgets.Frame("Auto Cuts") vbox2 = Widgets.VBox() fr.set_widget(vbox2) captions = (('Auto Method:', 'label', 'Auto Method', 'combobox'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) # Setup auto cuts method choice combobox = b.auto_method index = 0 method = self.t_.get('autocut_method', "histogram") for name in self.autocut_methods: combobox.append_text(name) index += 1 index = self.autocut_methods.index(method) combobox.set_index(index) combobox.add_callback('activated', self.set_autocut_method_cb) b.auto_method.set_tooltip("Choose algorithm for auto levels") vbox2.add_widget(w, stretch=0) self.w.acvbox = Widgets.VBox() vbox2.add_widget(self.w.acvbox, stretch=1) vbox.add_widget(fr, stretch=0) # TRANSFORM OPTIONS fr = Widgets.Frame("Transform") captions = ( ('Flip X', 'checkbutton', 'Flip Y', 'checkbutton', 'Swap XY', 'checkbutton'), ('Rotate:', 'label', 'Rotate', 'spinfloat'), ('Restore', 'button'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) for name in ('flip_x', 'flip_y', 'swap_xy'): btn = b[name] btn.set_state(self.t_.get(name, False)) btn.add_callback('activated', self.set_transforms_cb) b.flip_x.set_tooltip("Flip the image around the X axis") b.flip_y.set_tooltip("Flip the image around the Y axis") b.swap_xy.set_tooltip("Swap the X and Y axes in the image") b.rotate.set_tooltip("Rotate the image around the pan position") b.restore.set_tooltip("Clear any transforms and center image") b.restore.add_callback('activated', self.restore_cb) b.rotate.set_limits(0.00, 359.99999999, incr_value=10.0) b.rotate.set_value(0.00) b.rotate.set_decimals(8) b.rotate.add_callback('value-changed', self.rotate_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) # WCS OPTIONS fr = Widgets.Frame("WCS") captions = ( ('WCS Coords:', 'label', 'WCS Coords', 'combobox'), ('WCS Display:', 'label', 'WCS Display', 'combobox'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.wcs_coords.set_tooltip("Set WCS coordinate system") b.wcs_display.set_tooltip("Set WCS display format") # Setup WCS coords method choice combobox = b.wcs_coords index = 0 for name in wcsmod.coord_types: combobox.append_text(name) index += 1 method = self.t_.get('wcs_coords', "") try: index = wcsmod.coord_types.index(method) combobox.set_index(index) except ValueError: pass combobox.add_callback('activated', self.set_wcs_params_cb) # Setup WCS display format method choice combobox = b.wcs_display index = 0 for name in wcsmod.display_types: combobox.append_text(name) index += 1 method = self.t_.get('wcs_display', "sexagesimal") try: index = wcsmod.display_types.index(method) combobox.set_index(index) except ValueError: pass combobox.add_callback('activated', self.set_wcs_params_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) # ZOOM OPTIONS fr = Widgets.Frame("Zoom") captions = (('Zoom Alg:', 'label', 'Zoom Alg', 'combobox'), ('Zoom Rate:', 'label', 'Zoom Rate', 'spinfloat'), ('Stretch XY:', 'label', 'Stretch XY', 'combobox'), ('Stretch Factor:', 'label', 'Stretch Factor', 'spinfloat'), ('Scale X:', 'label', 'Scale X', 'entryset'), ('Scale Y:', 'label', 'Scale Y', 'entryset'), ('Scale Min:', 'label', 'Scale Min', 'spinfloat'), ('Scale Max:', 'label', 'Scale Max', 'spinfloat'), ('Interpolation:', 'label', 'Interpolation', 'combobox'), ('Zoom Defaults', 'button')) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) index = 0 for name in self.zoomalg_names: b.zoom_alg.append_text(name.capitalize()) index += 1 zoomalg = self.t_.get('zoom_algorithm', "step") index = self.zoomalg_names.index(zoomalg) b.zoom_alg.set_index(index) b.zoom_alg.set_tooltip("Choose Zoom algorithm") b.zoom_alg.add_callback('activated', self.set_zoomalg_cb) index = 0 for name in ('X', 'Y'): b.stretch_xy.append_text(name) index += 1 b.stretch_xy.set_index(0) b.stretch_xy.set_tooltip("Stretch pixels in X or Y") b.stretch_xy.add_callback('activated', self.set_stretch_cb) b.stretch_factor.set_limits(1.0, 10.0, incr_value=0.10) b.stretch_factor.set_value(1.0) b.stretch_factor.set_decimals(8) b.stretch_factor.add_callback('value-changed', self.set_stretch_cb) b.stretch_factor.set_tooltip( "Length of pixel relative to 1 on other side") b.stretch_factor.set_enabled(zoomalg != 'step') zoomrate = self.t_.get('zoom_rate', math.sqrt(2.0)) b.zoom_rate.set_limits(1.1, 3.0, incr_value=0.1) b.zoom_rate.set_value(zoomrate) b.zoom_rate.set_decimals(8) b.zoom_rate.set_enabled(zoomalg != 'step') b.zoom_rate.set_tooltip( "Step rate of increase/decrease per zoom level") b.zoom_rate.add_callback('value-changed', self.set_zoomrate_cb) b.zoom_defaults.add_callback('activated', self.set_zoom_defaults_cb) scale_x, scale_y = self.fitsimage.get_scale_xy() b.scale_x.set_tooltip("Set the scale in X axis") b.scale_x.set_text(str(scale_x)) b.scale_x.add_callback('activated', self.set_scale_cb) b.scale_y.set_tooltip("Set the scale in Y axis") b.scale_y.set_text(str(scale_y)) b.scale_y.add_callback('activated', self.set_scale_cb) scale_min, scale_max = self.t_['scale_min'], self.t_['scale_max'] b.scale_min.set_limits(0.00001, 1.0, incr_value=1.0) b.scale_min.set_value(scale_min) b.scale_min.set_decimals(8) b.scale_min.add_callback('value-changed', self.set_scale_limit_cb) b.scale_min.set_tooltip("Set the minimum allowed scale in any axis") b.scale_max.set_limits(1.0, 10000.0, incr_value=1.0) b.scale_max.set_value(scale_max) b.scale_max.set_decimals(8) b.scale_max.add_callback('value-changed', self.set_scale_limit_cb) b.scale_min.set_tooltip("Set the maximum allowed scale in any axis") index = 0 for name in trcalc.interpolation_methods: b.interpolation.append_text(name) index += 1 interp = self.t_.get('interpolation', "basic") try: index = trcalc.interpolation_methods.index(interp) except ValueError: # previous choice might not be available if preferences # were saved when opencv was being used--if so, default # to "basic" index = trcalc.interpolation_methods.index('basic') b.interpolation.set_index(index) b.interpolation.set_tooltip("Choose interpolation method") b.interpolation.add_callback('activated', self.set_interp_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) # PAN OPTIONS fr = Widgets.Frame("Panning") captions = ( ('Pan X:', 'label', 'Pan X', 'entry', 'WCS sexagesimal', 'checkbutton'), ('Pan Y:', 'label', 'Pan Y', 'entry', 'Apply Pan', 'button'), ('Pan Coord:', 'label', 'Pan Coord', 'combobox'), ('Center Image', 'button', 'Mark Center', 'checkbutton'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) pan_x, pan_y = self.fitsimage.get_pan() coord_offset = self.fv.settings.get('pixel_coords_offset', 0.0) b.pan_x.set_tooltip("Coordinate for the pan position in X axis") b.pan_x.set_text(str(pan_x + coord_offset)) #b.pan_x.add_callback('activated', self.set_pan_cb) b.pan_y.set_tooltip("Coordinate for the pan position in Y axis") b.pan_y.set_text(str(pan_y + coord_offset)) #b.pan_y.add_callback('activated', self.set_pan_cb) b.apply_pan.add_callback('activated', self.set_pan_cb) b.apply_pan.set_tooltip("Set the pan position") b.wcs_sexagesimal.set_tooltip("Display pan position in sexagesimal") index = 0 for name in self.pancoord_options: b.pan_coord.append_text(name) index += 1 pan_coord = self.t_.get('pan_coord', "data") index = self.pancoord_options.index(pan_coord) b.pan_coord.set_index(index) b.pan_coord.set_tooltip("Pan coordinates type") b.pan_coord.add_callback('activated', self.set_pan_coord_cb) b.center_image.set_tooltip( "Set the pan position to center of the image") b.center_image.add_callback('activated', self.center_image_cb) b.mark_center.set_tooltip("Mark the center (pan locator)") b.mark_center.add_callback('activated', self.set_misc_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("New Images") captions = ( ('Cut New:', 'label', 'Cut New', 'combobox'), ('Zoom New:', 'label', 'Zoom New', 'combobox'), ('Center New:', 'label', 'Center New', 'combobox'), ('Follow New', 'checkbutton', 'Raise New', 'checkbutton'), ('Create thumbnail', 'checkbutton'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) combobox = b.cut_new index = 0 for name in self.autocut_options: combobox.append_text(name) index += 1 option = self.t_.get('autocuts', "off") index = self.autocut_options.index(option) combobox.set_index(index) combobox.add_callback('activated', self.set_autocuts_cb) b.cut_new.set_tooltip("Automatically set cut levels for new images") combobox = b.zoom_new index = 0 for name in self.autozoom_options: combobox.append_text(name) index += 1 option = self.t_.get('autozoom', "off") index = self.autozoom_options.index(option) combobox.set_index(index) combobox.add_callback('activated', self.set_autozoom_cb) b.zoom_new.set_tooltip("Automatically fit new images to window") combobox = b.center_new index = 0 for name in self.autocenter_options: combobox.append_text(name) index += 1 option = self.t_.get('autocenter', "off") # Hack to convert old values that used to be T/F if isinstance(option, bool): choice = {True: 'on', False: 'off'} option = choice[option] index = self.autocenter_options.index(option) combobox.set_index(index) combobox.add_callback('activated', self.set_autocenter_cb) b.center_new.set_tooltip("Automatically center new images in window") b.follow_new.set_tooltip("View new images as they arrive") b.raise_new.set_tooltip("Raise and focus tab for new images") b.create_thumbnail.set_tooltip("Create thumbnail for new images") self.w.follow_new.set_state(True) self.w.follow_new.add_callback('activated', self.set_chprefs_cb) self.w.raise_new.set_state(True) self.w.raise_new.add_callback('activated', self.set_chprefs_cb) self.w.create_thumbnail.set_state(True) self.w.create_thumbnail.add_callback('activated', self.set_chprefs_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) exp = Widgets.Expander("General") captions = ( ('Num Images:', 'label', 'Num Images', 'entryset'), ('Sort Order:', 'label', 'Sort Order', 'combobox'), ('Preload Images', 'checkbutton'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.num_images.set_tooltip( "Maximum number of in memory images in channel (0==unlimited)") num_images = self.t_.get('numImages', 0) self.w.num_images.set_text(str(num_images)) self.w.num_images.add_callback('activated', self.set_buffer_cb) combobox = b.sort_order index = 0 for name in self.sort_options: combobox.append_text(name) index += 1 option = self.t_.get('sort_order', 'loadtime') index = self.sort_options.index(option) combobox.set_index(index) combobox.add_callback('activated', self.set_sort_cb) b.sort_order.set_tooltip("Sort order for images in channel") preload_images = self.t_.get('preload_images', False) self.w.preload_images.set_state(preload_images) self.w.preload_images.add_callback('activated', self.set_preload_cb) b.preload_images.set_tooltip( "Preload adjacent images to speed up access") fr = Widgets.Frame() fr.set_widget(w) exp.set_widget(fr) vbox.add_widget(exp, stretch=0) exp = Widgets.Expander("Remember") captions = ( ('Save Scale', 'checkbutton', 'Save Pan', 'checkbutton'), ('Save Transform', 'checkbutton', 'Save Rotation', 'checkbutton'), ('Save Cuts', 'checkbutton'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) self.w.save_scale.set_state(self.t_.get('profile_use_scale', False)) self.w.save_scale.add_callback('activated', self.set_profile_cb) self.w.save_scale.set_tooltip("Remember scale with image") self.w.save_pan.set_state(self.t_.get('profile_use_pan', False)) self.w.save_pan.add_callback('activated', self.set_profile_cb) self.w.save_pan.set_tooltip("Remember pan position with image") self.w.save_transform.set_state( self.t_.get('profile_use_transform', False)) self.w.save_transform.add_callback('activated', self.set_profile_cb) self.w.save_transform.set_tooltip("Remember transform with image") self.w.save_rotation.set_state( self.t_.get('profile_use_rotation', False)) self.w.save_rotation.add_callback('activated', self.set_profile_cb) self.w.save_rotation.set_tooltip("Remember rotation with image") self.w.save_cuts.set_state(self.t_.get('profile_use_cuts', False)) self.w.save_cuts.add_callback('activated', self.set_profile_cb) self.w.save_cuts.set_tooltip("Remember cut levels with image") fr = Widgets.Frame() fr.set_widget(w) exp.set_widget(fr) vbox.add_widget(exp, stretch=0) exp = Widgets.Expander("ICC Profiles") captions = ( ('Output ICC profile:', 'label', 'Output ICC profile', 'combobox'), ('Rendering intent:', 'label', 'Rendering intent', 'combobox'), ('Proof ICC profile:', 'label', 'Proof ICC profile', 'combobox'), ('Proof intent:', 'label', 'Proof intent', 'combobox'), ('__x', 'spacer', 'Black point compensation', 'checkbutton'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) value = self.t_.get('icc_output_profile', None) combobox = b.output_icc_profile index = 0 for name in self.icc_profiles: combobox.append_text(str(name)) index += 1 index = self.icc_profiles.index(value) combobox.set_index(index) combobox.add_callback('activated', self.set_icc_profile_cb) combobox.set_tooltip("ICC profile for the viewer display") value = self.t_.get('icc_output_intent', 'perceptual') combobox = b.rendering_intent index = 0 for name in self.icc_intents: combobox.append_text(name) index += 1 index = self.icc_intents.index(value) combobox.set_index(index) combobox.add_callback('activated', self.set_icc_profile_cb) combobox.set_tooltip("Rendering intent for the viewer display") value = self.t_.get('icc_proof_profile', None) combobox = b.proof_icc_profile index = 0 for name in self.icc_profiles: combobox.append_text(str(name)) index += 1 index = self.icc_profiles.index(value) combobox.set_index(index) combobox.add_callback('activated', self.set_icc_profile_cb) combobox.set_tooltip("ICC profile for soft proofing") value = self.t_.get('icc_proof_intent', None) combobox = b.proof_intent index = 0 for name in self.icc_intents: combobox.append_text(name) index += 1 index = self.icc_intents.index(value) combobox.set_index(index) combobox.add_callback('activated', self.set_icc_profile_cb) combobox.set_tooltip("Rendering intent for soft proofing") value = self.t_.get('icc_black_point_compensation', False) b.black_point_compensation.set_state(value) b.black_point_compensation.add_callback('activated', self.set_icc_profile_cb) b.black_point_compensation.set_tooltip("Use black point compensation") fr = Widgets.Frame() fr.set_widget(w) exp.set_widget(fr) vbox.add_widget(exp, stretch=0) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(4) btns.set_border_width(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btn = Widgets.Button("Help") btn.add_callback('activated', lambda w: self.help()) btns.add_widget(btn, stretch=0) btn = Widgets.Button("Save Settings") btn.add_callback('activated', lambda w: self.save_preferences()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.gui_up = True