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.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("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 _gui_config_layers(self): # remove all old scales self.logger.debug("removing layer alpha controls") self.w.scales.remove_all() self.logger.debug("building layer alpha controls") # construct a new vbox of alpha controls captions = [] num_layers = self.limage.num_layers() for i in range(num_layers): layer = self.limage.get_layer(i) captions.append((layer.name + ":", "label", "layer_%d" % i, "hscale")) w, b = Widgets.build_info(captions) self.w.update(b) for i in range(num_layers): layer = self.limage.get_layer(i) adj = b["layer_%d" % (i)] lower, upper = 0, 100 adj.set_limits(lower, upper, incr_value=1) # adj.set_decimals(2) adj.set_value(int(layer.alpha * 100.0)) # adj.set_tracking(True) adj.add_callback("value-changed", self.set_opacity_cb, i) self.logger.debug("adding layer alpha controls") self.w.scales.set_widget(w)
def gui_add_channel(self, chname=None): if not chname: chname = self.make_channel_name("Image") captions = (('New channel name:', 'label', 'channel_name', 'entry'), ('In workspace:', 'label', 'workspace', 'combobox'), ) w, b = Widgets.build_info(captions, orientation='vertical') # populate values b.channel_name.set_text(chname) names = self.ds.get_wsnames() try: idx = names.index(self._lastwsname) except: idx = 0 for name in names: b.workspace.append_text(name) b.workspace.set_index(idx) # build dialog dialog = Dialog("Add Channel", 0, [['Cancel', 0], ['Ok', 1]], lambda w, rsp: self.add_channel_cb(w, rsp, b, names)) box = dialog.get_content_area() box.add_widget(w, stretch=0) dialog.show() # save a handle so widgets aren't garbage collected self._cur_dialogs.append(dialog)
def gui_add_channels(self): captions = (('Prefix:', 'label', 'Prefix', 'entry'), ('Number:', 'label', 'Number', 'spinbutton'), ('In workspace:', 'label', 'workspace', 'combobox'), ) w, b = Widgets.build_info(captions) b.prefix.set_text("Image") b.number.set_limits(1, 12, incr_value=1) b.number.set_value(1) cbox = b.workspace names = self.ds.get_wsnames() try: idx = names.index('channels') except: idx = 0 for name in names: b.workspace.append_text(name) b.workspace.set_index(idx) dialog = Dialog("Add Channels", 0, [['Cancel', 0], ['Ok', 1]], lambda w, rsp: self.add_channels_cb(w, rsp, b, names)) box = dialog.get_content_area() box.add_widget(w, stretch=0) dialog.show() # save a handle so widgets aren't garbage collected self._cur_dialogs.append(dialog)
def build_params(self, paramlst, orientation='vertical'): # construct a set of widgets for the parameters captions = [] for param in paramlst: title = param.get('title', param.name) wtype = param.get('widget', None) if wtype is None: # set default widget type if none specified wtype = 'entry' if 'valid' in param: wtype = 'combobox' captions.append((title + ':', 'label', param.name, wtype)) w, b = Widgets.build_info(captions, orientation=orientation) # fill with default values and tool tips for param in paramlst: name = param.name widget = b[name] valid = param.get('valid', None) if hasattr(widget, 'set_index') and valid is not None: # configure combobox for value in valid: widget.append_text(str(value)) elif hasattr(widget, 'set_limits') and 'incr' in param: # configure spinbox/slider widget.set_limits(param.min, param.max, incr_value=param.incr) wtype = param.get('widget', None) if wtype == 'spinfloat': widget.set_decimals(param.get('decimals', 4)) # if we have a cached value for the parameter, use it try: value = getattr(self.obj, name) self.set_widget_value(widget, param, value) except (AttributeError, KeyError): # otherwise initialize to the default value, if available if 'default' in param: value = param.default self.set_widget_value(widget, param, value) setattr(self.obj, name, value) if 'description' in param: widget.set_tooltip(param.description) if widget.has_callback('activated'): widget.add_callback('activated', self._value_changed_cb) elif widget.has_callback('value-changed'): widget.add_callback('value-changed', self._value_changed_cb) self.paramlst = paramlst self.widgets = b return w
def build_gui(self, container): container.set_margins(4, 4, 4, 4) container.set_spacing(4) # create the table # TODO: replace with Widgets.TreeView table = QtGui.QTableView() self.table = table table.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) table.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) #table.setShowGrid(False) vh = table.verticalHeader() # Hack to make the rows in a TableView all have a # reasonable height for the data ## if QtHelp.have_pyqt5: ## vh.setSectionResizeMode(QtGui.QHeaderView.ResizeToContents) ## else: #vh.setResizeMode(QtGui.QHeaderView.ResizeToContents) # Hide vertical header #vh.setVisible(False) vh.setVisible(True) table.resizeColumnsToContents() w = Widgets.wrap(table) container.add_widget(w, stretch=1)
def build_gui(self, container): """ Called when the plugin is invoked; sets up all the components of the GUI One of the required LocalPlugin methods @param container: The widget.Box this GUI must be added into """ # create the outer Box that will hold the GUI and the close button out = Widgets.VBox() out.set_border_width(4) container.add_widget(out, stretch=True) # create the inner box that will contain the stack of GUIs box, box_wrapper, orientation = Widgets.get_oriented_box(container, fill=True) box.set_border_width(4) box.set_spacing(3) out.add_widget(box_wrapper, stretch=True) # the rest is a stack of GUIs for each step, as decided by the subclass stk = Widgets.StackWidget() self.stack_guis(stk, orientation) box.add_widget(stk, stretch=True) self.stack = stk # end is an HBox that comes at the very end, after the rest of the GUIs end = Widgets.HBox() end.set_spacing(2) out.add_widget(end) # throw in a close button at the very end, just in case btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) end.add_widget(btn) end.add_widget(Widgets.Label(''), stretch=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) # Take a text widget to show version info msgFont = self.fv.getFont('sansFont', 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(msgFont) tw.set_text(self.info_string()) vbox.add_widget(tw, 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)
def build_param_gui(self, container): """Call this in ``build_gui()`` to create 'Load Param' and 'Save Param' buttons. Parameters ---------- container : widget The widget to contain these buttons. """ captions = (('Load Param', 'button', 'Save Param', 'button'), ) w, b = Widgets.build_info(captions, orientation=self.orientation) self.w.update(b) b.load_param.set_tooltip('Load previously saved parameters') b.load_param.add_callback( 'activated', lambda w: self.load_params_cb()) b.save_param.set_tooltip('Save {0} parameters'.format(str(self))) b.save_param.add_callback( 'activated', lambda w: self.save_params()) container.add_widget(w, stretch=0) # Initialize file save dialog self.filesel = FileSelection(self.fv.w.root.get_widget())
def __init__(self, width, height): logger = log.get_logger(null=True) # We just use a ginga widget to implement the readout readout = Viewers.CanvasView(logger=logger) readout.set_desired_size(width, height) bg = colors.lookup_color('#202030') readout.set_bg(*bg) self.viewer = readout self.readout = Widgets.wrap(readout.get_widget()) self.readout.resize(width, height) canvas = readout.get_canvas() Text = canvas.get_draw_class('text') xoff, yoff = 4, 4 self.text_obj = Text(xoff, height-yoff, text='', color='lightgreen', fontsize=14, coord='canvas') canvas.add(self.text_obj, redraw=False) self.maxx = 0 self.maxy = 0 self.maxv = 0 self.fitsimage = None
def gui_add_channel(self, chname=None): if not chname: chname = self.make_channel_name("Image") captions = (('New channel name:', 'label', 'channel_name', 'entry'), ('In workspace:', 'label', 'workspace', 'combobox'), ) w, b = Widgets.build_info(captions, orientation='vertical') # populate values b.channel_name.set_text(chname) names = self.ds.get_wsnames() try: idx = names.index(self._lastwsname) except: idx = 0 for name in names: b.workspace.append_text(name) b.workspace.set_index(idx) # build dialog dialog = Widgets.Dialog(title="Add Channel", flags=0, buttons=[['Cancel', 0], ['Ok', 1]], parent=self.w.root) dialog.add_callback('activated', lambda w, rsp: self.add_channel_cb(w, rsp, b, names)) box = dialog.get_content_area() box.add_widget(w, stretch=0) self.ds.show_dialog(dialog)
def gui_add_channels(self): captions = (('Prefix:', 'label', 'Prefix', 'entry'), ('Number:', 'label', 'Number', 'spinbutton'), ('In workspace:', 'label', 'workspace', 'combobox'), ) w, b = Widgets.build_info(captions) b.prefix.set_text("Image") b.number.set_limits(1, 12, incr_value=1) b.number.set_value(1) cbox = b.workspace names = self.ds.get_wsnames() try: idx = names.index('channels') except: idx = 0 for name in names: b.workspace.append_text(name) b.workspace.set_index(idx) dialog = Widgets.Dialog(title="Add Channels", flags=0, buttons=[['Cancel', 0], ['Ok', 1]], parent=self.w.root) dialog.add_callback('activated', lambda w, rsp: self.add_channels_cb(w, rsp, b, names)) box = dialog.get_content_area() box.add_widget(w, stretch=0) self.ds.show_dialog(dialog)
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 could be called several times if the plugin is opened and closed. 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.Frame("Status") vbox2 = Widgets.VBox() vbox2.add_widget(tw) vbox2.add_widget(Widgets.Label(''), stretch=1) fr.set_widget(vbox2) 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): vbox = Widgets.VBox() self.msg_font = self.fv.get_font('fixed', 12) tw = Widgets.TextArea(wrap=False, editable=False) tw.set_font(self.msg_font) tw.set_limit(self.histlimit) self.tw = tw sw = Widgets.ScrollArea() sw.set_widget(self.tw) vbox.add_widget(sw, stretch=1) captions = (('Level', 'combobox', 'History', 'spinbutton'), ('Auto scroll', 'checkbutton', 'Clear', 'button') ) w, b = Widgets.build_info(captions) self.w.update(b) combobox = b.level for (name, level) in self.levels: combobox.append_text(name) combobox.set_index(1) combobox.add_callback('activated', self.set_loglevel_cb) combobox.set_tooltip("Set the logging level") spinbox = b.history spinbox.set_limits(100, self.histmax, incr_value=10) spinbox.set_value(self.histlimit) spinbox.add_callback('value-changed', self.set_history_cb) spinbox.set_tooltip("Set the logging history line limit") btn = b.auto_scroll btn.set_state(self.autoscroll) btn.set_tooltip("Scroll the log window automatically") btn.add_callback('activated', self.set_autoscroll_cb) btn = b.clear btn.add_callback('activated', lambda w: self.clear()) btn.set_tooltip("Clear the log history") vbox.add_widget(w, stretch=0) 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) 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) vbox.add_widget(btns, stretch=0) container.add_widget(vbox, 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) 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) 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)
def build_gui(self, container): cbar = ColorBar.ColorBar(self.logger) cbar.set_cmap(self.fv.cm) cbar.set_imap(self.fv.im) cbar_w = Widgets.wrap(cbar) self.colorbar = cbar self.fv.add_callback('channel-change', self.change_cbar, cbar) cbar.add_callback('motion', self.cbar_value_cb) fr = Widgets.Frame() fr.set_border_width(0) fr.set_widget(cbar_w) container.add_widget(fr, stretch=0)
def __init__(self, app): super(Viewer, self).__init__() self.logger = app.logger self.dc = get_canvas_types() self.top = app.make_window(title="Simple Ginga 3D Viewer") vw = CanvasView(self.logger) vw.ui_set_active(True) self.vw = vw # quick hack to get 'u' to invoke hidden camera mode bm = vw.get_bindmap() bm.mode_map['u'] = bm.mode_map['mode_camera'] bd = vw.get_bindings() bd.enable_all(True) # canvas that we will draw on canvas = self.dc.DrawingCanvas() canvas.set_surface(vw) self.canvas = canvas # add canvas to view private_canvas = vw.get_canvas() private_canvas.add(canvas) # add little mode indicator that shows keyboard modal states #vw.show_mode_indicator(True, corner='ur') # little hack because we don't have a way yet to ask for this # variation of back end through ginga.toolkit ww = Widgets.wrap(vw.get_widget()) vbox = Widgets.VBox() vbox.set_border_width(2) vbox.set_spacing(1) vbox.add_widget(ww, stretch=1) hbox = Widgets.HBox() hbox.set_border_width(4) wquit = Widgets.Button("Quit") wquit.add_callback('activated', self.quit) hbox.add_widget(Widgets.Label(''), stretch=1) hbox.add_widget(wquit) vbox.add_widget(hbox) self.top.set_widget(vbox)
def build_gui(self, container): if not have_samp: raise GingaPlugin.PluginError("To run this plugin you need to install the astropy.vo.samp module") vbox = Widgets.VBox() 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.Frame("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("SAMP") captions = [('Start hub', 'checkbutton'), ('Connect client', 'checkbutton'), ] w, b = Widgets.build_info(captions) self.w.update(b) b.start_hub.set_tooltip("Start a SAMP hub") b.start_hub.set_state(self.settings.get('start_hub', True)) b.start_hub.add_callback('activated', self.start_hub_cb) b.connect_client.set_tooltip("Register with a SAMP hub") b.connect_client.set_state(self.settings.get('default_connect', True)) b.connect_client.add_callback('activated', self.connect_client_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) # stretch vbox.add_widget(Widgets.Label(''), 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) vbox.add_widget(btns, stretch=0) container.add_widget(vbox, stretch=1)
def gui_add_ws(self): captions = (('Workspace name:', 'label', 'Workspace name', 'entry'), ('Workspace type:', 'label', 'Workspace type', 'combobox'), ('In workspace:', 'label', 'workspace', 'combobox'), ('Channel prefix:', 'label', 'Channel prefix', 'entry'), ('Number of channels:', 'label', 'num_channels', 'spinbutton'), ('Share settings:', 'label', 'Share settings', 'entry'), ) w, b = Widgets.build_info(captions) self.wscount += 1 wsname = "ws%d" % (self.wscount) b.workspace_name.set_text(wsname) #b.share_settings.set_length(60) cbox = b.workspace_type cbox.append_text("Grid") cbox.append_text("Tabs") cbox.append_text("MDI") cbox.append_text("Stack") cbox.set_index(0) cbox = b.workspace names = self.ds.get_wsnames() names.insert(0, 'top level') try: idx = names.index('channels') except: idx = 0 for name in names: cbox.append_text(name) cbox.set_index(idx) b.channel_prefix.set_text("Image") spnbtn = b.num_channels spnbtn.set_limits(0, 36, incr_value=1) spnbtn.set_value(4) dialog = Widgets.Dialog(title="Add Workspace", flags=0, buttons=[['Cancel', 0], ['Ok', 1]], parent=self.w.root) dialog.add_callback('activated', lambda w, rsp: self.add_ws_cb(w, rsp, b, names)) box = dialog.get_content_area() box.add_widget(w, stretch=1) self.ds.show_dialog(dialog)
def gui_add_ws(self): captions = (('Workspace name:', 'label', 'Workspace name', 'entry'), ('Workspace type:', 'label', 'Workspace type', 'combobox'), ('In workspace:', 'label', 'workspace', 'combobox'), ('Channel prefix:', 'label', 'Channel prefix', 'entry'), ('Number of channels:', 'label', 'num_channels', 'spinbutton'), ('Share settings:', 'label', 'Share settings', 'entry'), ) w, b = Widgets.build_info(captions) self.wscount += 1 wsname = "ws%d" % (self.wscount) b.workspace_name.set_text(wsname) #b.share_settings.set_length(60) cbox = b.workspace_type cbox.append_text("Tabs") ## cbox.append_text("Grid") ## cbox.append_text("MDI") cbox.set_index(0) cbox = b.workspace names = self.ds.get_wsnames() names.insert(0, 'top level') try: idx = names.index('channels') except: idx = 0 for name in names: cbox.append_text(name) cbox.set_index(idx) b.channel_prefix.set_text("Image") spnbtn = b.num_channels spnbtn.set_limits(0, 12, incr_value=1) spnbtn.set_value(4) dialog = Dialog("Add Workspace", 0, [['Cancel', 0], ['Ok', 1]], lambda w, rsp: self.new_ws_cb(w, rsp, b, names)) box = dialog.get_content_area() box.add_widget(w, stretch=1) dialog.show() # save a handle so widgets aren't garbage collected self._cur_dialogs.append(dialog)
def add_channel(self, viewer, chinfo): fitsimage = chinfo.fitsimage panimage = self._create_pan_image(fitsimage) chname = chinfo.name # ?? Can't we use panimage directly as a wrapped widget ?? iw = panimage.get_widget() # wrap widget iw = Widgets.wrap(iw) self.nb.add_widget(iw) index = self.nb.index_of(iw) paninfo = Bunch.Bunch(panimage=panimage, widget=iw, pancompass=None, panrect=None) self.channel[chname] = paninfo # Extract RGBMap object from main image and attach it to this # pan image rgbmap = fitsimage.get_rgbmap() panimage.set_rgbmap(rgbmap) rgbmap.add_callback('changed', self.rgbmap_cb, panimage) fitsimage.copy_attributes(panimage, ['cutlevels']) fitsimage.add_callback('image-set', self.new_image_cb, chinfo, paninfo) fitssettings = fitsimage.get_settings() pansettings = panimage.get_settings() xfrmsettings = ['flip_x', 'flip_y', 'swap_xy', 'rot_deg'] fitssettings.shareSettings(pansettings, xfrmsettings) for key in xfrmsettings: pansettings.getSetting(key).add_callback('set', self.settings_cb, fitsimage, chinfo, paninfo, 0) fitssettings.shareSettings(pansettings, ['cuts']) pansettings.getSetting('cuts').add_callback('set', self.settings_cb, fitsimage, chinfo, paninfo, 1) zoomsettings = ['zoom_algorithm', 'zoom_rate', 'scale_x_base', 'scale_y_base'] fitssettings.shareSettings(pansettings, zoomsettings) for key in zoomsettings: pansettings.getSetting(key).add_callback('set', self.zoom_ext_cb, fitsimage, chinfo, paninfo) fitsimage.add_callback('redraw', self.redraw_cb, chinfo, paninfo) self.logger.debug("channel '%s' added." % (chinfo.name))
def set_corrtype(self, corrtype): """This implicitly calls :meth:`draw_cb`.""" # Remove old params self.w.corrtype_attr_vbox.remove_all() self.canvas.deleteAllObjects() if corrtype not in self._corrtype_options: self.logger.error( 'Undefined bad pixel region type - {0}'.format(corrtype)) return True self.corrtype = corrtype # Reset parameters self.xcen, self.ycen = self._dummy_value, self._dummy_value self.radius = self._dummy_value # Universal params captions = [('X:', 'label', 'X', 'entry'), ('Y:', 'label', 'Y', 'entry')] if corrtype == 'circular': self.canvas.set_drawtype( 'circle', color=self.bpixcorrcolor, linestyle='dash') captions += [('Radius:', 'label', 'r', 'entry')] else: # single self.canvas.set_drawtype( 'point', color=self.bpixcorrcolor) w, b = Widgets.build_info(captions, orientation=self.orientation) self.w.update(b) b.x.set_tooltip('X of centroid') b.x.set_text(str(self.xcen)) b.x.add_callback('activated', lambda w: self.set_xcen()) b.y.set_tooltip('Y of centroid') b.y.set_text(str(self.ycen)) b.y.add_callback('activated', lambda w: self.set_ycen()) if corrtype == 'circular': b.r.set_tooltip('Radius of circular correction region') b.r.set_text(str(self.radius)) b.r.add_callback('activated', lambda w: self.set_radius()) self.w.corrtype_attr_vbox.add_widget(w, stretch=1) return True
def build_gui(self, container): # Make a top-level layout to which we will add the Toolbar and # the TableView. top_layout = container top_layout.set_margins(0, 0, 0, 0) # Create a toolbar and add it to the top_layout toolbar = Widgets.Toolbar() top_layout.add_widget(toolbar) # Create a "File" menu filemenu = toolbar.add_menu(text='File') self.file_save_item = filemenu.add_name('Save') self.file_save_item.set_enabled(False) self.file_save_item.add_callback('activated', self.save_item_clicked) # Create an "Edit" menu editmenu = toolbar.add_menu('Edit') copy_item = editmenu.add_name('Copy') copy_item.get_widget().setShortcut("Ctrl+C") copy_item.add_callback('activated', lambda w: self.copy_clicked()) paste_item = editmenu.add_name('Paste') paste_item.get_widget().setShortcut("Ctrl+V") paste_item.add_callback('activated', lambda w: self.paste_clicked()) insert_row_item = editmenu.add_name('Insert Rows') insert_row_item.add_callback('activated', lambda w: self.insert_row_clicked()) delete_row_item = editmenu.add_name('Delete Rows') delete_row_item.add_callback('activated', lambda w: self.delete_row_clicked()) # Create the table view tableview = QtGui.QTableView() self.tableview = tableview # Set the selection behavior tableview.setSelectionBehavior(QtGui.QAbstractItemView.SelectItems) tableview.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) # Set up the vertical header vh = tableview.verticalHeader() vh.setResizeMode(QtGui.QHeaderView.ResizeToContents) # Add the table view to the top_layout w = Widgets.wrap(tableview) top_layout.add_widget(w, stretch=1)
def add_pstamp(self): self.logger.debug('Called.') # Setup for thumbnail display di = Viewers.ImageViewCanvas(logger=self.logger) #di.configure_window(100, 100) di.set_desired_size(100, 100) di.enable_autozoom('on') di.add_callback('configure', self.window_resized_cb) di.enable_autocuts('off') di.set_bg(0.4, 0.4, 0.4) # for debugging di.set_name('pstamp') iw = Widgets.wrap(di.get_widget()) self.pstamps.add_widget(iw) return di
def build_gui(self, container): if not have_samp: raise GingaPlugin.PluginError( "To run this plugin you need to install the " "astropy package") vbox = Widgets.VBox() vbox.set_border_width(4) vbox.set_spacing(2) fr = Widgets.Frame("SAMP") captions = [('Start hub', 'checkbutton'), ('Connect client', 'checkbutton'), ] w, b = Widgets.build_info(captions) self.w.update(b) b.start_hub.set_tooltip("Start a SAMP hub") b.start_hub.set_state(self.settings.get('start_hub', True)) b.start_hub.add_callback('activated', self.start_hub_cb) b.connect_client.set_tooltip("Register with a SAMP hub") b.connect_client.set_state(self.settings.get('default_connect', True)) b.connect_client.add_callback('activated', self.connect_client_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) # stretch vbox.add_widget(Widgets.Label(''), 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) 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) vbox.add_widget(btns, stretch=0) container.add_widget(vbox, stretch=1) self.gui_up = True
def build_gui(self, container): vbox = Widgets.VBox() self.msgFont = self.fv.getFont("fixedFont", 12) tw = Widgets.TextArea(wrap=False, editable=False) tw.set_font(self.msgFont) self.tw = tw self.history = [] self.histmax = 10 sw = Widgets.ScrollArea() sw.set_widget(self.tw) vbox.add_widget(sw, stretch=1) captions = (('Local plugin:', 'label', 'Local plugin', 'entry', 'Reload', 'button'), ('Global plugin:', 'label', 'Global plugin', 'entry', 'ReloadG', 'button'), ) w, b = Widgets.build_info(captions) self.w.update(b) b.local_plugin.set_tooltip("Name of a local plugin to reload") b.local_plugin.set_length(14) b.reload.add_callback('activated', self.reload_local_cb) b.global_plugin.set_tooltip("Name of a global plugin to reload") b.global_plugin.set_length(14) b.reloadg.add_callback('activated', self.reload_global_cb) vbox.add_widget(w, stretch=1) self.entry = Widgets.TextEntry() vbox.add_widget(self.entry, stretch=0) self.entry.add_callback('activated', self.command_cb) 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) btns.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(btns) container.add_widget(vbox, stretch=1)
def build_gui(self, container): width, height = 300, 300 cm, im = self.fv.cm, self.fv.im thumb_len = self.settings.get('thumb_length', 192) tg = Viewers.ImageViewCanvas(logger=self.logger) tg.configure_window(thumb_len, thumb_len) tg.enable_autozoom('on') tg.set_autocut_params('zscale') tg.enable_autocuts('override') tg.enable_auto_orient(True) tg.defer_redraw = False tg.set_bg(0.7, 0.7, 0.7) self.thumb_generator = tg sw = Widgets.ScrollArea() sw.add_callback('configure', self.thumbpane_resized_cb) # Create thumbnails pane vbox = Widgets.GridBox() vbox.set_margins(4, 4, 4, 4) vbox.set_column_spacing(14) self.w.thumbs = vbox sw.set_widget(vbox) self.w.thumbs_scroll = sw container.add_widget(sw, stretch=1) captions = (('Auto scroll', 'checkbutton', 'Clear', 'button'),) w, b = Widgets.build_info(captions) self.w.update(b) b.auto_scroll.set_tooltip( "Scroll the thumbs window when new images arrive") b.clear.set_tooltip("Remove all current thumbnails") b.clear.add_callback('activated', lambda w: self.clear()) auto_scroll = self.settings.get('auto_scroll', True) b.auto_scroll.set_state(auto_scroll) container.add_widget(w, stretch=0) self.gui_up = True
def _setup_params(self, obj, container): params = obj.getParams() captions = [] paramList = sorted(params.values(), key=lambda b: b.order) for bnch in paramList: text = bnch.name if 'label' in bnch: text = bnch.label #captions.append((text, 'entry')) captions.append((text+':', 'label', bnch.name, 'entry')) # TODO: put RA/DEC first, and other stuff not in random orders w, b = Widgets.build_info(captions) # remove old widgets container.remove_all() # add new widgets container.add_widget(w) return b
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) 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("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 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) 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', "sp2", 'spacer', "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.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)
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_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) self.plot = plots.Plot(logger=self.logger, width=400, height=400) ax = self.plot.add_axis() ax.grid(True) w = Plot.PlotWidget(self.plot) w.resize(400, 400) vbox.add_widget(w, stretch=1) captions = ( ('Cut Low:', 'label', 'Cut Low', 'entry'), ('Cut High:', 'label', 'Cut High', 'entry', 'Cut Levels', 'button'), ('Auto Levels', 'button'), ('Log Histogram', 'checkbutton', 'Plot By Cuts', 'checkbutton'), ('NumBins:', 'label', 'NumBins', 'entry'), ('Full Image', 'button'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.cut_levels.set_tooltip("Set cut levels manually") b.auto_levels.set_tooltip("Set cut levels by algorithm") b.cut_low.set_tooltip("Set low cut level (press Enter)") b.cut_high.set_tooltip("Set high cut level (press Enter)") b.log_histogram.set_tooltip("Use the log of the pixel values for the " "histogram (empty bins map to 10^-1)") b.plot_by_cuts.set_tooltip("Only show the part of the histogram " "between the cuts") b.numbins.set_tooltip("Number of bins for the histogram") b.full_image.set_tooltip("Use the full image for calculating the " "histogram") b.numbins.set_text(str(self.numbins)) b.cut_low.add_callback('activated', lambda w: self.cut_levels()) b.cut_high.add_callback('activated', lambda w: self.cut_levels()) b.cut_levels.add_callback('activated', lambda w: self.cut_levels()) b.auto_levels.add_callback('activated', lambda w: self.auto_levels()) b.log_histogram.set_state(self.plot.logy) b.log_histogram.add_callback('activated', self.log_histogram_cb) b.plot_by_cuts.set_state(self.xlimbycuts) b.plot_by_cuts.add_callback('activated', self.plot_by_cuts_cb) b.numbins.add_callback('activated', lambda w: self.set_numbins_cb()) b.full_image.add_callback('activated', lambda w: self.full_image_cb()) vbox.add_widget(w, 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 box") 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 box") 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 box") self.w.btn_edit = btn3 hbox.add_widget(btn3) if self.histtag is None: self.w.btn_move.set_enabled(False) self.w.btn_edit.set_enabled(False) 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_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, future=None): vbox1 = Widgets.VBox() 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) mode = self.canvas.get_draw_mode() btns = Widgets.HBox() btns.set_spacing(5) btn1 = Widgets.RadioButton("Select") btn1.set_state(mode == 'select') btn1.add_callback('activated', lambda w, val: self.set_mode_cb('select', val)) btn1.set_tooltip("Choose this to highlight selection on table") self.w.btn_select = btn1 btns.add_widget(btn1, stretch=0) 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 define search region") self.w.btn_draw = btn2 btns.add_widget(btn2, stretch=0) 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 or move a region") self.w.btn_edit = btn3 btns.add_widget(btn3) btns.add_widget(Widgets.Label(''), stretch=1) 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) 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) 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, self.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('Smoothing Algorithm') captions = (('Algorithm:', 'label', 'smooth type', 'combobox'), ('Mode:', 'label', 'mode type', 'combobox')) w, b = Widgets.build_info(captions) self.w.update(b) combobox = b.smooth_type for name in self._smooth_options: combobox.append_text(name) b.smooth_type.set_index(self._smooth_options.index(self.algorithm)) b.smooth_type.add_callback('activated', self.set_algo_cb) combobox = b.mode_type for name in self._mode_options: combobox.append_text(name) b.mode_type.set_index(self._mode_options.index(self.mode)) b.mode_type.add_callback('activated', self.set_mode_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame('Attributes') vbox2 = Widgets.VBox() self.w.smooth_attr_vbox = Widgets.VBox() vbox2.add_widget(self.w.smooth_attr_vbox, stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) self.build_param_gui(vbox) captions = ( ('Status', 'llabel'), ('Smooth', 'button', 'Spacer1', 'spacer'), ) w, b = Widgets.build_info(captions, orientation=self.orientation) self.w.update(b) b.status.set_text('') b.smooth.set_tooltip('Smooth image') b.smooth.add_callback('activated', lambda w: self.do_smooth()) vbox.add_widget(w, 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()) self.w.close = btn 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) # Populate default attributes frame self.set_algo() 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("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, scrolled=True) self.orientation = orientation vbox.set_border_width(4) vbox.set_spacing(2) 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) 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.gui_up = True
def _create_info_window(self): sw = Widgets.ScrollArea() vbox = Widgets.VBox() sw.set_widget(vbox) captions = ( ('Name:', 'label', 'Name', 'llabel'), ('Object:', 'label', 'Object', 'llabel'), ('X:', 'label', 'X', 'llabel'), ('Y:', 'label', 'Y', 'llabel'), ('Value:', 'label', 'Value', 'llabel'), ('RA:', 'label', 'RA', 'llabel'), ('DEC:', 'label', 'DEC', 'llabel'), ('Equinox:', 'label', 'Equinox', 'llabel'), ('Dimensions:', 'label', 'Dimensions', 'llabel'), ('Min:', 'label', 'Min', 'llabel'), ('Max:', 'label', 'Max', 'llabel'), ) w, b = Widgets.build_info(captions) col = Widgets.VBox() row = Widgets.HBox() row.set_spacing(0) row.set_border_width(0) row.add_widget(w, stretch=0) row.add_widget(Widgets.Label(''), stretch=1) col.add_widget(row, stretch=0) #col.add_widget(Widgets.Label(''), stretch=1) sw2 = Widgets.ScrollArea() # hack for Qt to expand this widget properly sw2.cfg_expand(0x7, 0x4) sw2.set_widget(col) vbox.add_widget(sw2, stretch=2) # stretcher vbox.add_widget(Widgets.Label(''), stretch=1) captions = ( ('Zoom:', 'label', 'Zoom', 'llabel'), ('Cut Low:', 'label', 'Cut Low Value', 'llabel', 'Cut Low', 'entry'), ('Cut High:', 'label', 'Cut High Value', 'llabel', 'Cut High', 'entry'), ('Auto Levels', 'button', 'spacer1', 'spacer', 'Cut Levels', 'button'), ('Cut New:', 'label', 'Cut New', 'llabel'), ('Zoom New:', 'label', 'Zoom New', 'llabel'), ('Center New:', 'label', 'Center New', 'llabel'), ) w, b2 = Widgets.build_info(captions) b.update(b2) # TODO: need a more general solution to gtk labels resizing their # parent window #b.object.set_length(12) b.cut_levels.set_tooltip("Set cut levels manually") b.auto_levels.set_tooltip("Set cut levels by algorithm") b.cut_low.set_tooltip("Set low cut level (press Enter)") b.cut_low_value.set_text('') b.cut_high.set_tooltip("Set high cut level (press Enter)") b.cut_high_value.set_text('') b.cut_new.set_text('') b.zoom_new.set_text('') b.center_new.set_text('') row = Widgets.HBox() row.set_spacing(0) row.set_border_width(0) row.add_widget(w, stretch=0) ## row.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(row, stretch=0) return sw, b
def build_gui(self, container): vbox, sw, self.orientation = Widgets.get_oriented_box(container) captions = (('Color:', 'label', 'mask color', 'combobox'), ('Alpha:', 'label', 'mask alpha', 'entry')) w, b = Widgets.build_info(captions) self.w.update(b) combobox = b.mask_color for name in self._color_options: combobox.append_text(name) b.mask_color.set_index(self._color_options.index(self.maskcolor)) b.mask_color.add_callback('activated', self.set_maskcolor_cb) b.mask_alpha.set_tooltip('Mask alpha (transparency)') b.mask_alpha.set_text(str(self.maskalpha)) b.mask_alpha.add_callback('activated', lambda w: self.set_maskalpha()) container.add_widget(w, stretch=0) treeview = Widgets.TreeView(auto_expand=True, sortable=True, selection='multiple', use_alt_row_color=True) self.treeview = treeview treeview.setup_table(self.columns, 2, 'ID') treeview.add_callback('selected', self.hl_table2canvas) container.add_widget(treeview, stretch=1) captions = (('Load Mask', 'button'), ('Show', 'button', 'Hide', 'button', 'Forget', 'button')) w, b = Widgets.build_info(captions) self.w.update(b) b.load_mask.set_tooltip('Load mask image') b.load_mask.add_callback('activated', lambda w: self.load_mask_cb()) b.show.set_tooltip('Show masks') b.show.add_callback('activated', lambda w: self.redo()) b.hide.set_tooltip('Hide masks') b.hide.add_callback('activated', lambda w: self.clear_mask()) b.forget.set_tooltip('Forget masks') b.forget.add_callback('activated', lambda w: self.forget_masks()) 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) 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) container.add_widget(btns, stretch=0) self.gui_up = True # Initialize mask file selection dialog self.mfilesel = FileSelection(self.fv.w.root.get_widget(), all_at_once=True) # Populate table self.redo()
def build_gui(self, container): vbox, sw, self.orientation = Widgets.get_oriented_box(container) 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) 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) 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 set_bgtype(self, bgtype): if bgtype not in self._bgtype_options: self.logger.error( 'Undefined background selection type - {0}'.format(bgtype)) return True self.bgtype = bgtype # Remove old params self.w.bgtype_attr_vbox.remove_all() self.w.background_value.set_text(str(self._dummy_value)) self.w.subtract.set_enabled(False) self.set_mode('draw') self.canvas.delete_all_objects() # Reset parameters self.xcen, self.ycen = self._dummy_value, self._dummy_value self.radius = self._dummy_value self.boxwidth, self.boxheight = self._dummy_value, self._dummy_value captions = [('X:', 'label', 'X', 'entry'), ('Y:', 'label', 'Y', 'entry')] if bgtype == 'constant': self.canvas.enable_draw(False) self.w.background_value.set_editable(True) else: # annulus, box self.canvas.enable_draw(True) if bgtype == 'annulus': self.canvas.set_drawtype( 'annulus', width=self.annulus_width, color=self.bgsubcolor, linestyle='dash') captions += [('Radius:', 'label', 'r', 'entry'), ('Annulus Width:', 'label', 'Annulus Width', 'entry')] else: # box self.canvas.set_drawtype( 'rectangle', color=self.bgsubcolor, linestyle='dash') captions += [('Width:', 'label', 'box w', 'entry'), ('Height:', 'label', 'box h', 'entry')] captions += [ ('Algorithm:', 'label', 'Algorithm', 'combobox'), ('Sigma:', 'label', 'Sigma', 'entry'), ('Number of Iterations:', 'label', 'NIter', 'entry'), ('Ignore bad pixels', 'checkbutton')] w, b = Widgets.build_info(captions, orientation=self.orientation) self.w.update(b) b.x.set_tooltip('X of centroid') b.x.set_text(str(self.xcen)) b.x.add_callback('activated', lambda w: self.set_xcen()) b.y.set_tooltip('Y of centroid') b.y.set_text(str(self.ycen)) b.y.add_callback('activated', lambda w: self.set_ycen()) if bgtype == 'annulus': b.r.set_tooltip('Inner radius of annulus') b.r.set_text(str(self.radius)) b.r.add_callback('activated', lambda w: self.set_radius()) b.annulus_width.set_tooltip('Set annulus width manually') b.annulus_width.set_text(str(self.annulus_width)) b.annulus_width.add_callback( 'activated', lambda w: self.set_annulus_width()) else: # box b.box_w.set_tooltip('Width of box') b.box_w.set_text(str(self.boxwidth)) b.box_w.add_callback( 'activated', lambda w: self.set_boxwidth()) b.box_h.set_tooltip('Height of box') b.box_h.set_text(str(self.boxheight)) b.box_h.add_callback( 'activated', lambda w: self.set_boxheight()) for name in self._algorithm_options: b.algorithm.append_text(name) b.algorithm.set_index( self._algorithm_options.index(self.algorithm)) b.algorithm.add_callback('activated', self.set_algorithm_cb) b.sigma.set_tooltip('Sigma for clipping') b.sigma.set_text(str(self.sigma)) b.sigma.add_callback('activated', lambda w: self.set_sigma()) b.niter.set_tooltip('Number of clipping iterations') b.niter.set_text(str(self.niter)) b.niter.add_callback('activated', lambda w: self.set_niter()) 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) self.w.bgtype_attr_vbox.add_widget(w, stretch=1) self.w.background_value.set_editable(False) return True
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) box, sw, orientation = Widgets.get_oriented_box(container) box.set_border_width(4) box.set_spacing(2) paned = Widgets.Splitter(orientation=orientation) self.fwhm_plot = plots.FWHMPlot(logger=self.logger, width=400, height=400) if plots.MPL_GE_2_0: kwargs = {'facecolor': 'white'} else: kwargs = {'axisbg': 'white'} ax = self.fwhm_plot.add_axis(**kwargs) ax.grid(True) w = Plot.PlotWidget(self.fwhm_plot) w.resize(400, 400) paned.add_widget(Widgets.hadjust(w, orientation)) captions = (("Load a Nires Image", 'label', "Load", 'button'), ("Load an image and sky", 'label', "Load with sky", 'button'), ('Object_X', 'label', 'Object_X', 'llabel'), ('Object_Y', 'label', 'Object_Y', 'llabel'), ('Box Size (50): ', 'label', 'Box Size', 'entry', "Resize", 'button')) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) self.wdetail = b b.load.add_callback('activated', lambda w: self.load_cb()) b.load_with_sky.add_callback('activated', lambda w: self.load_with_sky_cb()) b.box_size.add_callback('activated', lambda w: self.boxsize_cb()) b.resize.add_callback('activated', lambda w: self.resize_cb()) fr = Widgets.Frame("Pick Target Star") fr.set_widget(w) box.add_widget(fr, stretch=0) paned.add_widget(sw) paned.set_sizes([400, 500]) top.add_widget(paned, stretch=5) 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.mfilesel = FileSelection(self.fv.w.root.get_widget())
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('Background Selection') captions = (('Type:', 'label', 'BG type', 'combobox'), ('Move', 'radiobutton', 'Draw', 'radiobutton')) w, b = Widgets.build_info(captions) self.w.update(b) combobox = b.bg_type for name in self._bgtype_options: combobox.append_text(name) b.bg_type.set_index(self._bgtype_options.index(self.bgtype)) b.bg_type.add_callback('activated', self.set_bgtype_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.Frame('Attributes') vbox2 = Widgets.VBox() self.w.bgtype_attr_vbox = Widgets.VBox() vbox2.add_widget(self.w.bgtype_attr_vbox, stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) captions = (('Background Value:', 'label', 'Background Value', 'entry'), ) w, b = Widgets.build_info(captions, orientation=self.orientation) self.w.update(b) b.background_value.set_tooltip('Background value') b.background_value.set_text(str(self.bgval)) b.background_value.add_callback( 'activated', lambda w: self.set_constant_bg()) b.background_value.set_editable(False) b.background_value.set_enabled(True) vbox.add_widget(w, stretch=0) self.build_param_gui(vbox) captions = (('Subtract', 'button', 'spacer1', 'spacer'), ) w, b = Widgets.build_info(captions, orientation=self.orientation) self.w.update(b) b.subtract.set_tooltip('Subtract background') b.subtract.add_callback('activated', lambda w: self.sub_bg()) b.subtract.set_enabled(False) vbox.add_widget(w, 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) 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) # Populate default attributes frame self.set_bgtype(self.bgtype) self.gui_up = True
def build_gui(self, container): vbox = Widgets.VBox() vbox.set_margins(2, 2, 2, 2) # create the table color_alternate = self.settings.get('color_alternate_rows', True) table = Widgets.TreeView(sortable=True, selection='multiple', use_alt_row_color=color_alternate, dragable=True) table.add_callback('activated', self.item_dblclicked_cb) table.add_callback('drag-start', self.item_drag_cb) # set header col = 0 self._name_idx = 0 for hdr, attrname in self.columns: if attrname == 'name': self._name_idx = col col += 1 table.setup_table(self.columns, 1, 'name') vbox.add_widget(table, stretch=1) self.treeview = table self.entry = Widgets.TextEntry() vbox.add_widget(self.entry, stretch=0) self.entry.add_callback('activated', self.browse_cb) hbox = Widgets.HBox() btn = Widgets.Button("Load") btn.add_callback('activated', lambda w: self.load_cb()) hbox.add_widget(btn, stretch=0) btn = Widgets.Button("Save Image As") hbox.add_widget(btn, stretch=0) self.entry2 = Widgets.TextEntry() hbox.add_widget(self.entry2, stretch=1) vbox.add_widget(hbox, stretch=0) self.entry2.add_callback('activated', self.save_as_cb) btn.add_callback('activated', lambda w: self.save_as_cb()) 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) btn = Widgets.Button("Refresh") btn.add_callback('activated', lambda w: self.refresh()) btns.add_widget(btn, stretch=0) btn = Widgets.Button("Make Thumbs") btn.add_callback('activated', lambda w: self.make_thumbs()) btns.add_widget(btn, stretch=0) vbox.add_widget(btns, stretch=0) container.add_widget(vbox, stretch=1)
def build_gui(self, container): canvas = self.dc.DrawingCanvas() canvas.enable_draw(False) ## canvas.set_callback('none-move', self.cursormotion) canvas.add_callback('key-press', self.window_key_press) canvas.add_callback('key-release', self.window_key_release) self.canvas = canvas vbox = Widgets.VBox() fr = Widgets.Frame("IRAF") captions = [ ("Addr:", 'label', "Addr", 'llabel', 'Restart', 'button'), ("Set Addr:", 'label', "Set Addr", 'entry'), ("Control", 'hbox'), ("Channel:", 'label', 'Channel', 'llabel'), ] w, b = Widgets.build_info(captions) self.w.update(b) addr = str(self.addr.name) b.addr.set_text(addr) b.restart.set_tooltip("Restart the server") b.restart.add_callback('activated', self.restart_cb) b.set_addr.set_length(100) b.addr.set_text(addr) b.set_addr.set_tooltip("Set address to run remote control server") b.set_addr.add_callback('activated', self.set_addr_cb) self.w.mode_d = {} btn1 = Widgets.RadioButton("Ginga") btn1.set_state(True) btn1.add_callback('activated', lambda w, val: self.switchMode('ginga')) self.w.mode_d['ginga'] = btn1 self.w.control.add_widget(btn1) btn2 = Widgets.RadioButton("IRAF", group=btn1) btn2.add_callback('activated', lambda w, val: self.switchMode('iraf')) self.w.mode_d['iraf'] = btn2 self.w.control.add_widget(btn2) fr.set_widget(w) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Frame/Channel") lbl = Widgets.Label("") self.w.frch = lbl fr.set_widget(lbl) vbox.add_widget(fr, stretch=0) # stretch vbox.add_widget(Widgets.Label(''), 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) btns.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(btns) container.add_widget(vbox, stretch=1) self.gui_up = True fmap = self.get_channel_frame_mapping() self.update_chinfo(fmap)
def __init__(self, logger, ev_quit, options): super(GingaVision, self).__init__() self.logger = logger self.ev_quit = ev_quit from ginga.gw import Widgets, Viewers, GwHelp, GwMain self.card = 'default' # playback rate; changed when we know the actual rate self.fps = 30 self.playback_rate = 1.0 / self.fps # Use an AstroImage, not RGBImage for now because we get a # different default (faster) scaling algorithm self.pimage = AstroImage.AstroImage() self.pdata = None self.app = Widgets.Application(logger=logger) self.app.add_callback('shutdown', self.quit) self.top = self.app.make_window("Ginga example2") self.top.add_callback('close', lambda *args: self.quit()) thread_pool = Task.ThreadPool(2, logger, ev_quit=ev_quit) thread_pool.startall() self.main = GwMain.GwMain(logger=logger, ev_quit=ev_quit, app=self.app, thread_pool=thread_pool) vbox = Widgets.VBox() vbox.set_border_width(2) vbox.set_spacing(1) fi = Viewers.CanvasView(logger=logger) fi.enable_autocuts('off') fi.set_autocut_params('histogram') fi.enable_autozoom('off') fi.cut_levels(0, 255) fi.defer_redraw = False fi.set_bg(0.2, 0.2, 0.2) fi.ui_setActive(True) self.fitsimage = fi # these options are needed for correct panning with this type of image fi._invert_y = False fi.origin_upper = False # <-- Some optimizations to smooth playback at decent FPS fi.set_redraw_lag(self.playback_rate) #fi.set_redraw_lag(0.0) # PassThruRGBMapper is the most efficient mapper #rgbmap = RGBMap.NonColorMapper(self.logger) rgbmap = RGBMap.PassThruRGBMapper(self.logger) fi.set_rgbmap(rgbmap) # Clip cuts assumes data does not need to be scaled in cut levels-- # only clipped fi.set_autocuts(AutoCuts.Clip(logger=self.logger)) # <-- end optimizations bd = fi.get_bindings() bd.enable_all(True) fi.set_desired_size(512, 512) iw = Viewers.GingaViewerWidget(viewer=fi) vbox.add_widget(iw, stretch=1) hbox = Widgets.HBox() hbox.set_margins(4, 2, 4, 2) wopen = Widgets.Button("Open File") #wopen.clicked.connect(self.open_file) wquit = Widgets.Button("Quit") wquit.add_callback('activated', lambda *args: self.quit()) for w in (wopen, wquit): hbox.add_widget(w, stretch=0) hbox.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(hbox, stretch=0) self.top.set_widget(vbox) self.top.set_title("Video Example Viewer")
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) 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) if np.isscalar(fov_deg): fov_str = str(fov_deg) else: x_fov, y_fov = fov_deg fov_str = str(x_fov) + ', ' + str(y_fov) #b.set_fov.set_length(8) b.fov.set_text(fov_str) b.set_fov.set_text(fov_str) 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) 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.gui_up = True
def build_gui(self, container): nb = Widgets.StackWidget() self.nb = nb container.add_widget(self.nb, stretch=1) self.gui_up = True
def __init__(self, name, wstype='tab', group=0, detachable=False, use_toolbar=False): super(Workspace, self).__init__() self.name = name self.wstype = wstype self.wstypes = ['tabs', 'mdi', 'stack', 'grid'] self.vbox = Widgets.VBox() self.vbox.set_spacing(0) self.vbox.set_border_width(0) # for now self.widget = self.vbox self.nb = None self.group = group self.detachable = detachable self.mdi_menu = None self.wstypes_c = ['Tabs', 'Grid', 'MDI', 'Stack'] self.wstypes_l = ['tabs', 'grid', 'mdi', 'stack'] self.extdata = Bunch.Bunch(toolbar=None) self.toolbar = None if use_toolbar: toolbar = Widgets.Toolbar(orientation='horizontal') toolbar.set_border_width(0) self.vbox.add_widget(toolbar, stretch=0) self.toolbar = toolbar self.extdata.toolbar = toolbar ws_menu = toolbar.add_menu("Workspace") item = ws_menu.add_name("Close") item.add_callback('activated', self._close_menuitem_cb) self._set_wstype(wstype) self.vbox.add_widget(self.nb, stretch=1) if use_toolbar: cbox = Widgets.ComboBox() for _wstype in self.wstypes_c: cbox.append_text(_wstype) idx = self.wstypes_l.index(wstype) cbox.set_index(idx) cbox.add_callback('activated', self.config_wstype_cb) cbox.set_tooltip("Set workspace type") self.toolbar.add_widget(cbox) mdi_menu = self.toolbar.add_menu("MDI") item = mdi_menu.add_name("Tile Panes") item.add_callback('activated', lambda *args: self.tile_panes_cb()) item = mdi_menu.add_name("Cascade Panes") item.add_callback('activated', lambda *args: self.cascade_panes_cb()) self.mdi_menu = mdi_menu self.extdata.mdi_menu = mdi_menu self._update_mdi_menu() for name in ('page-switch', 'page-detach', 'page-close', 'page-removed', 'page-added', 'ws-close'): self.enable_callback(name)
def build_naxis(self, dims): # build a vbox of NAXIS controls captions = [("NAXIS1:", 'label', 'NAXIS1', 'llabel'), ("NAXIS2:", 'label', 'NAXIS2', 'llabel')] self.naxispath = [] for n in range(2, len(dims)): self.naxispath.append(0) key = 'naxis%d' % (n+1) title = key.upper() maxn = int(dims[n]) self.logger.debug("NAXIS%d=%d" % (n+1, maxn)) if maxn <= 1: captions.append((title+':', 'label', title, 'llabel')) else: captions.append((title+':', 'label', title, 'llabel', #"Choose %s" % (title), 'spinbutton')) "Choose %s" % (title), 'hscale')) if len(dims) > 3: # only add radiobuttons if we have more than 3 dim radiobuttons = [] for i in range(2, len(dims)): title = 'AXIS%d' % (i+1) radiobuttons.extend((title, 'radiobutton')) captions.append(radiobuttons) # Remove old naxis widgets for key in self.w: if key.startswith('choose_'): self.w[key] = None w, b = Widgets.build_info(captions, orientation=self.orientation) self.w.update(b) for n in range(0, len(dims)): key = 'naxis%d' % (n+1) lbl = b[key] maxn = int(dims[n]) lbl.set_text("%d" % maxn) slkey = 'choose_' + key if slkey in b: slider = b[slkey] lower = 1 upper = maxn slider.set_limits(lower, upper, incr_value=1) slider.set_value(lower) slider.set_tracking(True) #slider.set_digits(0) #slider.set_wrap(True) slider.add_callback('value-changed', self.set_naxis_cb, n) # Add vbox of naxis controls to gui self.naxisfr.set_widget(w) # for storing play_idx for each dim of image. used for going back to # the idx where you left off. self.play_indices = ([0 for i in range(len(dims) - 2)] if len(dims) > 3 else None) if len(dims) > 3: # dims only exists in here, hence this function exists here def play_axis_change_func_creator(n): # widget callable needs (widget, value) args def play_axis_change(): self.play_indices[self.play_axis - 2] = (self.play_idx - 1) % dims[self.play_axis] # noqa self.play_axis = n self.logger.debug("play_axis changed to %d" % n) if self.play_axis < len(dims): self.play_max = dims[self.play_axis] self.play_idx = self.play_indices[n - 2] def check_if_we_need_change(w, v): if self.play_axis is not n: play_axis_change() return check_if_we_need_change for n in range(2, len(dims)): key = 'axis%d' % (n + 1) self.w[key].add_callback( 'activated', play_axis_change_func_creator(n)) if n == 2: self.w[key].set_state(True) self.play_axis = 2 if self.play_axis < len(dims): self.play_max = dims[self.play_axis] self.play_idx = 1 # Enable or disable NAXIS animation controls is_dc = len(dims) > 2 self.w.next.set_enabled(is_dc) self.w.prev.set_enabled(is_dc) self.w.first.set_enabled(is_dc) self.w.last.set_enabled(is_dc) self.w.play.set_enabled(is_dc) self.w.stop.set_enabled(is_dc) self.w.interval.set_enabled(is_dc) self.w.save_slice.set_enabled(is_dc) if have_mencoder: self.w.save_movie.set_enabled(is_dc)
def build_gui(self, container): vbox, sw, orientation = Widgets.get_oriented_box(container, fill=True, scrolled=False) vbox.set_border_width(4) vbox.set_spacing(2) # Uncomment to debug; passing parent logger generates too # much noise in the main logger #zi = Viewers.CanvasView(logger=self.logger) zi = Viewers.CanvasView(logger=None) zi.set_desired_size(self._wd, self._ht) zi.enable_autozoom('off') zi.enable_autocuts('off') #zi.set_scale_limits(0.001, 1000.0) zi.zoom_to(self.default_zoom) settings = zi.get_settings() settings.getSetting('zoomlevel').add_callback('set', self.zoomset, zi) zi.set_bg(0.4, 0.4, 0.4) zi.show_pan_mark(True) # for debugging zi.set_name('zoomimage') self.zoomimage = zi bd = zi.get_bindings() bd.enable_zoom(False) bd.enable_pan(False) bd.enable_cmap(False) iw = Viewers.GingaViewerWidget(zi) iw.resize(self._wd, self._ht) vpaned = Widgets.Splitter(orientation=orientation) vpaned.add_widget(iw) vbox2 = Widgets.VBox() captions = (("Zoom Radius:", 'label', 'Zoom Radius', 'hscale'), ("Zoom Amount:", 'label', 'Zoom Amount', 'hscale'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) vbox2.add_widget(w, stretch=0) self.w.zoom_radius.set_limits(1, 300, incr_value=1) self.w.zoom_radius.set_value(self.zoom_radius) self.w.zoom_radius.add_callback('value-changed', self.set_radius_cb) self.w.zoom_radius.set_tracking(True) self.w.zoom_amount.set_limits(-20, 30, incr_value=1) self.w.zoom_amount.set_value(self.zoom_amount) self.w.zoom_amount.add_callback('value-changed', self.set_amount_cb) self.w.zoom_amount.set_tracking(True) captions = (("Zoom:", 'label', 'Zoom', 'label'), ("Relative Zoom", 'checkbutton'), ("Refresh Interval", 'label', 'Refresh Interval', 'spinbutton'), ("Defaults", 'button'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.zoom.set_text(self.fv.scale2text(zi.get_scale())) b.relative_zoom.set_state(not self.t_abszoom) b.relative_zoom.add_callback("activated", self.set_absrel_cb) b.defaults.add_callback("activated", lambda w: self.set_defaults()) b.refresh_interval.set_limits(0, 200, incr_value=1) b.refresh_interval.set_value(int(self.refresh_interval * 1000)) b.refresh_interval.add_callback('value-changed', self.set_refresh_cb) row = Widgets.HBox() row.add_widget(w, stretch=0) row.add_widget(Widgets.Label(''), stretch=1) vbox2.add_widget(row, stretch=0) # stretch spacer = Widgets.Label('') vbox2.add_widget(spacer, stretch=1) vpaned.add_widget(vbox2) #vpaned.add_widget(Widgets.Label('')) vbox.add_widget(vpaned, stretch=1) #vbox.add_widget(Widgets.Label(''), stretch=1) container.add_widget(sw, stretch=1)
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.msg_font = self.fv.get_font("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msg_font) self.tw = tw # Frame for instructions and add the text widget with another # blank widget to stretch as needed to fill emp frame = Widgets.Expander("Instructions") frame.set_widget(tw) vbox.add_widget(frame, stretch=0) frame = Widgets.Frame('Center') hbox = Widgets.HBox() w, b = Widgets.build_info( (('X center:', 'label', 'X center', 'entry'), ('Y center:', 'label', 'Y center', 'entry'), ('Background:', 'label', 'background', 'entry'),) ) b.background.set_text('0.0') self.w.update(b) hbox.add_widget(w) w, b = Widgets.build_info( (('Use FOV center', 'button'), ('Centroid', 'button'), ('Centroid box:', 'label', 'centroid box', 'entry'),) ) b.use_fov_center.add_callback('activated', self.use_fov_center_cb) # centroiding requires photutils if photutils: b.centroid.add_callback('activated', self.centroid_cb) b.centroid_box.set_text('11') else: b.centroid.set_enabled(False) b.centroid_box.set_enabled(False) self.w.update(b) hbox.add_widget(w) frame.set_widget(hbox) vbox.add_widget(frame) # Enhancement tabs tabw = Widgets.TabWidget() self.w.tabw = tabw # 1/rho rho_vbox = Widgets.VBox() widgets = (('No options', 'label'), ('Enhance', 'button')) w, b = Widgets.build_info(widgets) b.enhance.add_callback('activated', self.rho_cb) self.w.rho = b rho_vbox.add_widget(w) tabw.add_widget(rho_vbox, title='1/rho') vbox.add_widget(tabw) # 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 plugin_build_error(self, box, text): textw = Widgets.TextArea(editable=False, wrap=True) textw.append_text(text) box.add_widget(textw, 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) fr = Widgets.Frame("Compositing") captions = ( ("Compose Type:", 'label', "Compose Type", 'combobox'), ("New Image", 'button', "Insert from Channel", '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) b.new_image.add_callback('activated', lambda w: self.new_cb()) b.new_image.set_tooltip("Start a new composite image") b.insert_from_channel.add_callback('activated', lambda w: self.insert_cb()) b.insert_from_channel.set_tooltip("Insert channel image as layer") zi = Viewers.CanvasView(logger=None) zi.set_desired_size(self._wd, self._ht) zi.enable_autozoom('on') zi.enable_autocuts('off') zi.cut_levels(0, 255) zi.set_bg(0.4, 0.4, 0.4) zi.set_name('compose_image') self.preview_image = zi bd = zi.get_bindings() bd.enable_zoom(True) bd.enable_pan(True) bd.enable_flip(True) bd.enable_cuts(True) bd.enable_cmap(True) iw = Viewers.GingaViewerWidget(zi) iw.resize(self._wd, self._ht) zi.get_canvas().add(self.canvas) self.canvas.set_surface(zi) self.canvas.ui_set_active(True) fr = Widgets.Frame("Preview") fr.set_widget(iw) vpaned = Widgets.Splitter(orientation=orientation) vpaned.add_widget(fr) # spacer vpaned.add_widget(Widgets.Label('')) fr = Widgets.Frame("Layers") self.w.scales = fr #vpaned.add_widget(fr) vbox.add_widget(vpaned, stretch=1) vbox.add_widget(fr, stretch=0) captions = ( ("Save Image As", 'button', "Save Path", 'entry'), ("Save to Channel", 'button'), ) w, b = Widgets.build_info(captions) self.w.update(b) b.save_to_channel.add_callback('activated', lambda w: self.save_to_channel_cb()) b.save_to_channel.set_tooltip("Save composite image to channel") b.save_image_as.add_callback('activated', lambda w: self.save_as_cb()) self.entry2 = b.save_path self.entry2.add_callback('activated', lambda *args: self.save_as_cb()) vbox.add_widget(w, stretch=0) top.add_widget(vbox, 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) 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.gui_up = True
def start_plugin_future(self, chname, opname, future, alreadyOpenOk=True): try: p_info = self.get_plugin_info(opname) except KeyError: self.fv.show_error("No plugin information for plugin '%s'" % ( opname)) return if chname is not None: # local plugin plname = chname.upper() + ': ' + p_info.spec.get('tab', p_info.name) p_info.tabname = plname else: # global plugin plname = p_info.name p_info.tabname = p_info.spec.get('tab', plname) lname = p_info.name.lower() if lname in self.active: if alreadyOpenOk: self.set_focus(p_info.name) return raise PluginManagerError("Plugin %s is already active." % ( plname)) # Raise tab with GUI vbox = None had_error = False try: if hasattr(p_info.obj, 'build_gui'): vbox = Widgets.VBox() in_ws = p_info.spec.get('workspace', None) if in_ws is None: # to be deprecated in_ws = p_info.spec.ws if in_ws.startswith('in:'): # TODO: how to set this size appropriately # Which plugins are actually using this attribute? vbox.size = (400, 900) else: # attach size of workspace to container so plugin # can plan for how to configure itself wd, ht = self.ds.get_ws_size(in_ws) vbox.size = (wd, ht) if future: p_info.obj.build_gui(vbox, future=future) else: p_info.obj.build_gui(vbox) except Exception as e: errstr = "Plugin UI failed to initialize: %s" % ( str(e)) self.logger.error(errstr) try: (type, value, tb) = sys.exc_info() tb_str = "".join(traceback.format_tb(tb)) self.logger.error("Traceback:\n%s" % (tb_str)) except Exception as e: tb_str = "Traceback information unavailable." self.logger.error(tb_str) self.plugin_build_error(vbox, errstr + '\n' + tb_str) #raise PluginManagerError(e) if not had_error: try: if future: p_info.obj.start(future=future) else: p_info.obj.start() except Exception as e: had_error = True errstr = "Plugin failed to start correctly: %s" % ( str(e)) self.logger.error(errstr) try: (type, value, tb) = sys.exc_info() tb_str = "".join(traceback.format_tb(tb)) self.logger.error("Traceback:\n%s" % (tb_str)) except Exception as e: tb_str = "Traceback information unavailable." self.logger.error(tb_str) self.plugin_build_error(vbox, errstr + '\n' + tb_str) #raise PluginManagerError(e) if vbox is not None: self.finish_gui(p_info, vbox) self.activate(p_info) self.set_focus(p_info.name) else: # If this is a local plugin, raise the channel associated with the # plug in if p_info.chinfo is not None: itab = p_info.chinfo.name self.ds.raise_tab(itab)
self.redraw() if __name__ == '__main__': from qplan import entity, common from qplan.util.site import get_site import pytz from ginga import toolkit toolkit.use('qt') from ginga.gw import Widgets, Plot plot = AZELPlot(1000, 1000) plot.setup() app = Widgets.Application() topw = app.make_window() plotw = Plot.PlotWidget(plot) topw.set_widget(plotw) topw.add_callback('close', lambda w: w.delete()) topw.show() plot.plot_azel([(-210.0, 60.43, "telescope"),]) tgt3 = entity.StaticTarget(name="Bootes", ra="14:31:45.40", dec="+32:28:38.50") site = get_site('subaru') tz = site.tz_local start_time = datetime.strptime("2015-03-27 20:05:00", "%Y-%m-%d %H:%M:%S") start_time = tz.localize(start_time)
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) 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('Background Selection') captions = (('Type:', 'label', 'BG type', 'combobox'), ) w, b = Widgets.build_info(captions) self.w.update(b) combobox = b.bg_type for name in self._bgtype_options: combobox.append_text(name) b.bg_type.set_index(self._bgtype_options.index(self.bgtype)) b.bg_type.add_callback('activated', self.set_bgtype_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame('Attributes') vbox2 = Widgets.VBox() self.w.bgtype_attr_vbox = Widgets.VBox() vbox2.add_widget(self.w.bgtype_attr_vbox, stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) captions = (('Background Value:', 'label', 'Background Value', 'entry'), ) w, b = Widgets.build_info(captions, orientation=self.orientation) self.w.update(b) b.background_value.set_tooltip('Background value') b.background_value.set_text(str(self.bgval)) b.background_value.add_callback('activated', lambda w: self.set_constant_bg()) b.background_value.set_editable(False) b.background_value.set_enabled(True) vbox.add_widget(w, stretch=0) self.build_param_gui(vbox) captions = (('Subtract', 'button', 'spacer1', 'spacer'), ) w, b = Widgets.build_info(captions, orientation=self.orientation) self.w.update(b) b.subtract.set_tooltip('Subtract background') b.subtract.add_callback('activated', lambda w: self.sub_bg()) b.subtract.set_enabled(False) vbox.add_widget(w, 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) # Populate default attributes frame self.set_bgtype(self.bgtype) self.gui_up = True
def build_gui(self, container): vtop = Widgets.VBox() vtop.set_border_width(4) box, sw, orientation = Widgets.get_oriented_box(container) # Uncomment to debug; passing parent logger generates too # much noise in the main logger #zi = Viewers.CanvasView(logger=self.logger) zi = Viewers.CanvasView(logger=None) zi.set_desired_size(self._wd, self._ht) zi.enable_autozoom('off') zi.enable_autocuts('off') zi.zoom_to(self.default_zoom) settings = zi.get_settings() settings.get_setting('zoomlevel').add_callback('set', self.zoomset, zi) zi.set_bg(0.4, 0.4, 0.4) zi.show_pan_mark(True) cmname = self.settings.get('zoom_cmap_name', None) if cmname is not None: zi.set_color_map(cmname) imname = self.settings.get('zoom_imap_name', None) if imname is not None: zi.set_intensity_map(imname) # for debugging zi.set_name('zoomimage') self.zoomimage = zi bd = zi.get_bindings() bd.enable_zoom(False) bd.enable_pan(False) bd.enable_cmap(False) iw = Viewers.GingaViewerWidget(zi) iw.resize(self._wd, self._ht) paned = Widgets.Splitter(orientation=orientation) paned.add_widget(iw) vbox2 = Widgets.VBox() captions = ( ("Zoom Radius:", 'label', 'Zoom Radius', 'hscale'), ("Zoom Amount:", 'label', 'Zoom Amount', 'hscale'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) vbox2.add_widget(w, stretch=0) self.w.zoom_radius.set_limits(1, 300, incr_value=1) self.w.zoom_radius.set_value(self.zoom_radius) self.w.zoom_radius.add_callback('value-changed', self.set_radius_cb) self.w.zoom_radius.set_tracking(True) self.w.zoom_amount.set_limits(-20, 30, incr_value=1) self.w.zoom_amount.set_value(self.zoom_amount) self.w.zoom_amount.add_callback('value-changed', self.set_amount_cb) self.w.zoom_amount.set_tracking(True) captions = ( ("Zoom:", 'label', 'Zoom', 'label'), ("Relative Zoom", 'checkbutton'), ("Refresh Interval", 'label', 'Refresh Interval', 'spinbutton'), ("Defaults", 'button'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.zoom.set_text(self.fv.scale2text(zi.get_scale())) b.relative_zoom.set_state(not self.t_abszoom) b.relative_zoom.add_callback("activated", self.set_absrel_cb) b.defaults.add_callback("activated", lambda w: self.set_defaults()) b.refresh_interval.set_limits(0, 200, incr_value=1) b.refresh_interval.set_value(int(self.refresh_interval * 1000)) b.refresh_interval.add_callback('value-changed', self.set_refresh_cb) row = Widgets.HBox() row.add_widget(w, stretch=0) row.add_widget(Widgets.Label(''), stretch=1) vbox2.add_widget(row, stretch=0) # stretch spacer = Widgets.Label('') vbox2.add_widget(spacer, stretch=1) box.add_widget(vbox2, stretch=1) paned.add_widget(sw) # hack to set a reasonable starting position for the splitter _sz = max(self._wd, self._ht) paned.set_sizes([_sz, _sz]) vtop.add_widget(paned, stretch=5) 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) 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) vtop.add_widget(btns, stretch=0) container.add_widget(vtop, stretch=5) self.gui_up = True
def build_gui(self, container): vbox = Widgets.VBox() vbox.set_border_width(4) vbox.set_spacing(2) # construct an interaactive viewer to view and scroll # the thumbs pane self.c_view = Viewers.CanvasView(logger=self.logger) c_v = self.c_view c_v.set_desired_size(self._wd, self._ht) c_v.enable_autozoom('off') c_v.enable_autocuts('off') c_v.set_pan(0, 0) c_v.scale_to(1.0, 1.0) # Y-axis flipped c_v.transform(False, True, False) c_v.cut_levels(0, 255) c_v.set_bg(0.4, 0.4, 0.4) # for debugging c_v.set_name('cmimage') c_v.add_callback('configure', self.thumbpane_resized_cb) c_v.add_callback('drag-drop', self.drag_drop_cb) c_v.get_settings().get_setting('pan').add_callback( 'set', self.thumbs_pan_cb) canvas = c_v.get_canvas() canvas.register_for_cursor_drawing(c_v) canvas.set_draw_mode('pick') canvas.ui_set_active(True) self.canvas = canvas bd = c_v.get_bindings() bd.enable_pan(True) bd.enable_zoom(False) bd.enable_cmap(False) # remap some bindings for pan mode into no mode needed bm = c_v.get_bindmap() for name in [ 'home', 'end', 'page_up', 'page_down', 'left', 'right', 'up', 'down' ]: bm.map_event(None, [], 'kp_%s' % name, 'pan_%s' % name) # scroll wheel bm.map_event(None, [], 'sc_scroll', 'pan') iw = Viewers.GingaScrolledViewerWidget(c_v) iw.resize(self._wd, self._ht) iw.scroll_bars(horizontal='auto', vertical='auto') vbox.add_widget(iw, stretch=1) captions = (('Auto scroll', 'checkbutton', 'Clear', 'button'), ) w, b = Widgets.build_info(captions) self.w.update(b) b.auto_scroll.set_tooltip( "Scroll the thumbs window when new images arrive") b.clear.set_tooltip("Remove all current thumbnails") b.clear.add_callback('activated', lambda w: self.clear()) auto_scroll = self.settings.get('auto_scroll', False) b.auto_scroll.set_state(auto_scroll) vbox.add_widget(w, stretch=0) container.add_widget(vbox, stretch=1) self.gui_up = True
def build_gui(self, container): """Build GUI such that image list area is maximized.""" vbox, sw, orientation = Widgets.get_oriented_box(container) 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'), ('Log:', 'llabel', 'LogFile', 'entry'), ('Out:', 'llabel', 'StaFile', 'entry'), ('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.logfile.set_text(self.logfile) b.logfile.set_tooltip('QUIP Log') b.stafile.set_text(self.stafile) b.stafile.set_tooltip('QUIP Out') 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) 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) container.add_widget(btns, stretch=0) self.gui_up = True # Generate initial listing try: self.update_channels() except ValueError: # This fails if plugin autoloads on startup pass
def _build_gui(self, container): self.mframe = container vbox = Widgets.VBox() # create the table table = Widgets.TreeView(selection='single', sortable=True, use_alt_row_color=False) self.table = table table.add_callback('selected', self.select_star_cb) vbox.add_widget(table, stretch=1) self.cbar = ColorBar.ColorBar(self.logger) # hack to set font size of this color bar self.cbar.cbar.fontsize = 8 self.cbar.set_cmap(self.cmap) self.cbar.set_imap(self.imap) rgbmap = self.cbar.get_rgbmap() rgbmap.add_callback('changed', lambda *args: self.replot_stars()) cbar_w = self.cbar.get_widget() cbar_w.resize(-1, self.cbar_ht) vbox.add_widget(cbar_w, stretch=0) btns = Widgets.HBox() btns.set_spacing(5) combobox = Widgets.ComboBox() options = [] index = 0 for name in self.cmap_names: options.append(name) combobox.append_text(name) index += 1 cmap_name = self.magcmap try: index = self.cmap_names.index(cmap_name) except Exception: index = self.cmap_names.index('gray') combobox.set_index(index) combobox.add_callback( 'activated', lambda w, idx: self.set_cmap_cb(idx)) self.btn['cmap'] = combobox btns.add_widget(combobox, stretch=0) combobox = Widgets.ComboBox() options = [] index = 0 for name in self.imap_names: options.append(name) combobox.append_text(name) index += 1 imap_name = self.magimap try: index = self.imap_names.index(imap_name) except Exception: index = self.imap_names.index('ramp') combobox.set_index(index) combobox.add_callback( 'activated', lambda w, idx: self.set_imap_cb(idx)) self.btn['imap'] = combobox btns.add_widget(combobox, stretch=0) combobox = Widgets.ComboBox() options = [] index = 0 for name, fn in self.operation_table: options.append(name) combobox.append_text(name) index += 1 combobox.set_index(0) self.btn['oprn'] = combobox btns.add_widget(combobox, stretch=0) btn = Widgets.Button("Do it") btn.add_callback('activated', self.do_operation_cb, combobox) btns.add_widget(btn, stretch=0) vbox.add_widget(btns, stretch=0) btns = Widgets.HBox() btns.set_spacing(5) for name in ('Plot', 'Clear'): # 'Close' btn = Widgets.Button(name) btns.add_widget(btn, stretch=0) self.btn[name.lower()] = btn self.btn.plot.add_callback('activated', lambda w: self.replot_stars()) self.btn.clear.add_callback('activated', lambda w: self.clear()) #self.btn.close.add_callback('activated', # lambda w: self.close()) combobox = Widgets.ComboBox() options = [] index = 0 for name in ['Mag']: options.append(name) combobox.append_text(name) index += 1 combobox.set_index(0) combobox.add_callback('activated', lambda w, idx: self.set_field_cb(idx)) self.btn['field'] = combobox btns.add_widget(combobox, stretch=0) vbox.add_widget(btns, stretch=0) # create the table info = Bunch.Bunch(columns=self.columns, color='Mag') self.build_table(info) self.mframe.add_widget(vbox, stretch=1)