Example #1
0
 def __init__(self, *args):
     Kittens.widgets.ClickableTreeWidget.__init__(self, *args)
     self._currier = PersistentCurrier()
     self.model = None
     # insert columns
     self.setHeaderLabels(ViewColumns)
     self.headerItem().setText(ColumnIapp, "I(app)")
     self.header().setMovable(False)
     self.header().setClickable(True)
     self.setSortingEnabled(True)
     self.setRootIsDecorated(False)
     self.setEditTriggers(QAbstractItemView.AllEditTriggers)
     self.setMouseTracking(True)
     # set column width modes
     for icol in range(NumColumns - 1):
         self.header().setResizeMode(icol, QHeaderView.ResizeToContents)
     self.header().setStretchLastSection(True)
     ## self.setTextAlignment(ColumnR,Qt.AlignRight);
     ## self.setTextAlignment(ColumnType,Qt.AlignHCenter);
     # _column_enabled[i] is True if column is available in the model.
     # _column_show[i] is True if column is currently being shown (via a view control)
     self._column_enabled = [True] * NumColumns
     self._column_shown = [True] * NumColumns
     # other listview init
     self.header().show()
     self.setSelectionMode(QTreeWidget.ExtendedSelection)
     self.setAllColumnsShowFocus(True)
     ## self.setShowToolTips(True);
     self._updating_selection = False
     self.setRootIsDecorated(False)
     # connect signals to track selected sources
     QObject.connect(self, SIGNAL("itemSelectionChanged()"),
                     self._selectionChanged)
     QObject.connect(self, SIGNAL("itemEntered(QTreeWidgetItem*,int)"),
                     self._itemHighlighted)
     # add "View" controls for different column categories
     self._column_views = []
     self._column_widths = {}
     self.addColumnCategory("Position", [ColumnRa, ColumnDec])
     self.addColumnCategory("Position errors",
                            [ColumnRa_err, ColumnDec_err], False)
     self.addColumnCategory("Type", [ColumnType])
     self.addColumnCategory("Flux", [ColumnIapp, ColumnI])
     self.addColumnCategory("Flux errors", [ColumnI_err], False)
     self.addColumnCategory("Polarization",
                            [ColumnQ, ColumnU, ColumnV, ColumnRm])
     self.addColumnCategory(
         "Polarization errors",
         [ColumnQ_err, ColumnU_err, ColumnV_err, ColumnRm_err], False)
     self.addColumnCategory("Spectrum", [ColumnSpi])
     self.addColumnCategory("Spectrum errors", [ColumnSpi_err], False)
     self.addColumnCategory("Shape", [ColumnShape])
     self.addColumnCategory("Shape errors", [ColumnShape_err], False)
     self.addColumnCategory("Tags", [ColumnTags])
Example #2
0
 def __init__(self, parent, *args):
     QWidget.__init__(self, parent, *args)
     self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
     lo = QVBoxLayout(self)
     lo.setContentsMargins(0, 0, 0, 0)
     lo1 = QHBoxLayout()
     lo.addLayout(lo1)
     lo1.setContentsMargins(0, 0, 0, 0)
     lbl = QLabel(QString("<nobr><b>Source groupings:</b></nobr>"), self)
     lo1.addWidget(lbl, 0)
     lo1.addStretch(1)
     # add show/hide button
     self._showattrbtn = QPushButton(self)
     self._showattrbtn.setMinimumWidth(256)
     lo1.addWidget(self._showattrbtn, 0)
     lo1.addStretch()
     QObject.connect(self._showattrbtn, SIGNAL("clicked()"),
                     self._togglePlotControlsVisibility)
     # add table
     self.table = QTableWidget(self)
     lo.addWidget(self.table)
     QObject.connect(self.table, SIGNAL("cellChanged(int,int)"),
                     self._valueChanged)
     self.table.setSelectionMode(QTableWidget.NoSelection)
     # setup basic columns
     self.table.setColumnCount(6 + len(self.EditableAttrs))
     for i, label in enumerate(
         ("grouping", "total", "selection", "list", "plot", "style")):
         self.table.setHorizontalHeaderItem(i, QTableWidgetItem(label))
     self.table.horizontalHeader().setSectionHidden(self.ColApply, True)
     # setup columns for editable grouping attributes
     for i, attr in self.AttrByCol.iteritems():
         self.table.setHorizontalHeaderItem(
             i, QTableWidgetItem(PlotStyles.StyleAttributeLabels[attr]))
         self.table.horizontalHeader().setSectionHidden(i, True)
     self.table.verticalHeader().hide()
     # other internal init
     self._attrs_shown = False
     self._togglePlotControlsVisibility()
     self.model = None
     self._setting_model = False
     self._currier = PersistentCurrier()
     # row of 'selected' grouping
     self._irow_selgroup = 0
Example #3
0
 def __init__(self, parent, menu, toolbar):
     QObject.__init__(self, parent)
     self._currier = PersistentCurrier()
     # get list of mouse modes from config
     modelist = []
     for mid in Config.get("mouse-modes", _DefaultModes).split(","):
         if not ConfigFile.has_section(mid):
             print "ERROR: unknown mouse-mode '%s', skipping. Check your %s." % (
                 mid, ConfigFileName)
         else:
             modelist.append(self._readModeConfig(mid))
     self._modes = dict([(mode.id, mode) for mode in modelist])
     self._qag_mode = QActionGroup(self)
     self._qag_submode = QActionGroup(self)
     self._all_submodes = []
     # make entries for main modes
     for mode in modelist:
         mode.addAction(menu,
                        self._qag_mode,
                        callback=self._currier.curry(
                            self._setMode, mode.id))
         if mode.submodes:
             self._all_submodes += list(mode.submodes)
     # make entries for submodes
     self._qa_submode_sep = menu.addSeparator()
     self._modes.update([(mode.id, mode) for mode in self._all_submodes])
     for mode in self._all_submodes:
         mode.addAction(menu,
                        self._qag_submode,
                        toolbar=toolbar,
                        callback=self._currier.curry(
                            self._setSubmode, mode.id))
     # other init
     self._current_context = None
     self._available_submodes = []
     # set initial mode
     initmode = Config.get("current-mouse-mode", _DefaultInitialMode)
     if initmode not in self._modes:
         initmode = modelist[0].id
     self._modes[initmode].qa.setChecked(True)
     self._setMode(initmode, write_config=False)
Example #4
0
 def __init__ (self,*args):
   QWidget.__init__(self,*args);
   # init layout
   self._lo = QVBoxLayout(self);
   self._lo.setContentsMargins(0,0,0,0);
   self._lo.setSpacing(0);
   # init internal state
   self._currier = PersistentCurrier();
   self._z0 = 0;  # z-depth of first image, the rest count down from it
   self._updating_imap = False;
   self._locked_display_range = False;
   self._imagecons = [];
   self._imagecon_loadorder = [];
   self._center_image = None;
   self._plot = None;
   self._border_pen = None;
   self._drawing_key = None;
   self._load_image_dialog = None;
   self._model_imagecons = set();
   # init menu and standard actions
   self._menu = QMenu("&Image",self);
   qag = QActionGroup(self);
   # exclusive controls for plotting topmost or all images
   self._qa_plot_top = qag.addAction("Display topmost image only");
   self._qa_plot_all   = qag.addAction("Display all images");
   self._qa_plot_top.setCheckable(True);
   self._qa_plot_all.setCheckable(True);
   self._qa_plot_top.setChecked(True);
   QObject.connect(self._qa_plot_all,SIGNAL("toggled(bool)"),self._displayAllImages);
   self._closing = False;
   
   self._qa_load_clipboard = None;
   self._clipboard_mode = QClipboard.Clipboard;
   QObject.connect(QApplication.clipboard(),SIGNAL("changed(QClipboard::Mode)"),self._checkClipboardPath);
   # populate the menu
   self._repopulateMenu();
Example #5
0
    def __init__(self, image, parent, imgman, name=None, save=False):
        QFrame.__init__(self, parent)
        self.setFrameStyle(QFrame.StyledPanel | QFrame.Raised)
        # init state
        self.image = image
        self._imgman = imgman
        self._currier = PersistentCurrier()
        self._control_dialog = None
        # create widgets
        self._lo = lo = QHBoxLayout(self)
        lo.setContentsMargins(0, 0, 0, 0)
        lo.setSpacing(2)
        # raise button
        self._wraise = QToolButton(self)
        lo.addWidget(self._wraise)
        self._wraise.setIcon(pixmaps.raise_up.icon())
        self._wraise.setAutoRaise(True)
        self._can_raise = False
        QObject.connect(self._wraise, SIGNAL("clicked()"),
                        self._raiseButtonPressed)
        self._wraise.setToolTip(
            """<P>Click here to raise this image above other images. Hold the button down briefly to
      show a menu of image operations.</P>""")
        # center label
        self._wcenter = QLabel(self)
        self._wcenter.setPixmap(pixmaps.center_image.pm())
        self._wcenter.setToolTip(
            "<P>The plot is currently centered on (the reference pixel %d,%d) of this image.</P>"
            % self.image.referencePixel())
        lo.addWidget(self._wcenter)
        # name/filename label
        self.name = image.name
        self._wlabel = QLabel(self.name, self)
        self._number = 0
        self.setName(self.name)
        self._wlabel.setToolTip(
            "%s %s" %
            (image.filename, u"\u00D7".join(map(str,
                                                image.data().shape))))
        lo.addWidget(self._wlabel, 1)
        # if 'save' is specified, create a "save" button
        if save:
            self._wsave = QToolButton(self)
            lo.addWidget(self._wsave)
            self._wsave.setText("save")
            self._wsave.setAutoRaise(True)
            self._save_dir = save if isinstance(save, str) else "."
            QObject.connect(self._wsave, SIGNAL("clicked()"), self._saveImage)
            self._wsave.setToolTip(
                """<P>Click here to write this image to a FITS file.</P>""")
        # render control
        dprint(2, "creating RenderControl")
        self._rc = RenderControl(image, self)
        dprint(2, "done")
        # selectors for extra axes
        self._wslicers = []
        curslice = self._rc.currentSlice()
        # this may be loaded from config, so not necessarily 0
        for iextra, axisname, labels in self._rc.slicedAxes():
            if axisname.upper() not in ["STOKES", "COMPLEX"]:
                lbl = QLabel("%s:" % axisname, self)
                lo.addWidget(lbl)
            else:
                lbl = None
            slicer = QComboBox(self)
            self._wslicers.append(slicer)
            lo.addWidget(slicer)
            slicer.addItems(labels)
            slicer.setToolTip(
                """<P>Selects current slice along the %s axis.</P>""" %
                axisname)
            slicer.setCurrentIndex(curslice[iextra])
            QObject.connect(slicer, SIGNAL("activated(int)"),
                            self._currier.curry(self._rc.changeSlice, iextra))
        # min/max display ranges
        lo.addSpacing(5)
        self._wrangelbl = QLabel(self)
        lo.addWidget(self._wrangelbl)
        self._minmaxvalidator = FloatValidator(self)
        self._wmin = QLineEdit(self)
        self._wmax = QLineEdit(self)
        width = self._wmin.fontMetrics().width("1.234567e-05")
        for w in self._wmin, self._wmax:
            lo.addWidget(w, 0)
            w.setValidator(self._minmaxvalidator)
            w.setMaximumWidth(width)
            w.setMinimumWidth(width)
            QObject.connect(w, SIGNAL("editingFinished()"),
                            self._changeDisplayRange)
        # full-range button
        self._wfullrange = QToolButton(self)
        lo.addWidget(self._wfullrange, 0)
        self._wfullrange.setIcon(pixmaps.zoom_range.icon())
        self._wfullrange.setAutoRaise(True)
        QObject.connect(self._wfullrange, SIGNAL("clicked()"),
                        self.renderControl().resetSubsetDisplayRange)
        rangemenu = QMenu(self)
        rangemenu.addAction(pixmaps.full_range.icon(), "Full subset",
                            self.renderControl().resetSubsetDisplayRange)
        for percent in (99.99, 99.9, 99.5, 99, 98, 95):
            rangemenu.addAction(
                "%g%%" % percent,
                self._currier.curry(self._changeDisplayRangeToPercent,
                                    percent))
        self._wfullrange.setPopupMode(QToolButton.DelayedPopup)
        self._wfullrange.setMenu(rangemenu)
        # update widgets from current display range
        self._updateDisplayRange(*self._rc.displayRange())
        # lock button
        self._wlock = QToolButton(self)
        self._wlock.setIcon(pixmaps.unlocked.icon())
        self._wlock.setAutoRaise(True)
        self._wlock.setToolTip(
            """<P>Click to lock or unlock the intensity range. When the intensity range is locked across multiple images, any changes in the intensity
          range of one are propagated to the others. Hold the button down briefly for additional options.</P>"""
        )
        lo.addWidget(self._wlock)
        QObject.connect(self._wlock, SIGNAL("clicked()"),
                        self._toggleDisplayRangeLock)
        QObject.connect(self.renderControl(), SIGNAL("displayRangeLocked"),
                        self._setDisplayRangeLock)
        QObject.connect(self.renderControl(), SIGNAL("dataSubsetChanged"),
                        self._dataSubsetChanged)
        lockmenu = QMenu(self)
        lockmenu.addAction(
            pixmaps.locked.icon(), "Lock all to this",
            self._currier.curry(imgman.lockAllDisplayRanges,
                                self.renderControl()))
        lockmenu.addAction(pixmaps.unlocked.icon(), "Unlock all",
                           imgman.unlockAllDisplayRanges)
        self._wlock.setPopupMode(QToolButton.DelayedPopup)
        self._wlock.setMenu(lockmenu)
        self._setDisplayRangeLock(self.renderControl().isDisplayRangeLocked())
        # dialog button
        self._wshowdialog = QToolButton(self)
        lo.addWidget(self._wshowdialog)
        self._wshowdialog.setIcon(pixmaps.colours.icon())
        self._wshowdialog.setAutoRaise(True)
        self._wshowdialog.setToolTip(
            """<P>Click for colourmap and intensity policy options.</P>""")
        QObject.connect(self._wshowdialog, SIGNAL("clicked()"),
                        self.showRenderControls)
        tooltip = """<P>You can change the currently displayed intensity range by entering low and high limits here.</P>
    <TABLE>
      <TR><TD><NOBR>Image min:</NOBR></TD><TD>%g</TD><TD>max:</TD><TD>%g</TD></TR>
      </TABLE>""" % self.image.imageMinMax()
        for w in self._wmin, self._wmax, self._wrangelbl:
            w.setToolTip(tooltip)

        # create image operations menu
        self._menu = QMenu(self.name, self)
        self._qa_raise = self._menu.addAction(
            pixmaps.raise_up.icon(), "Raise image",
            self._currier.curry(self.image.emit, SIGNAL("raise")))
        self._qa_center = self._menu.addAction(
            pixmaps.center_image.icon(), "Center plot on image",
            self._currier.curry(self.image.emit, SIGNAL("center")))
        self._qa_show_rc = self._menu.addAction(pixmaps.colours.icon(),
                                                "Colours && Intensities...",
                                                self.showRenderControls)
        if save:
            self._qa_save = self._menu.addAction("Save image...",
                                                 self._saveImage)
        self._menu.addAction("Export image to PNG file...",
                             self._exportImageToPNG)
        self._export_png_dialog = None
        self._menu.addAction(
            "Unload image",
            self._currier.curry(self.image.emit, SIGNAL("unload")))
        self._wraise.setMenu(self._menu)
        self._wraise.setPopupMode(QToolButton.DelayedPopup)

        # connect updates from renderControl and image
        self.image.connect(SIGNAL("slice"), self._updateImageSlice)
        QObject.connect(self._rc, SIGNAL("displayRangeChanged"),
                        self._updateDisplayRange)

        # default plot depth of image markers
        self._z_markers = None
        # and the markers themselves
        self._image_border = QwtPlotCurve()
        self._image_label = QwtPlotMarker()

        # subset markers
        self._subset_pen = QPen(QColor("Light Blue"))
        self._subset_border = QwtPlotCurve()
        self._subset_border.setPen(self._subset_pen)
        self._subset_border.setVisible(False)
        self._subset_label = QwtPlotMarker()
        text = QwtText("subset")
        text.setColor(self._subset_pen.color())
        self._subset_label.setLabel(text)
        self._subset_label.setLabelAlignment(Qt.AlignRight | Qt.AlignBottom)
        self._subset_label.setVisible(False)
        self._setting_lmrect = False

        self._all_markers = [
            self._image_border, self._image_label, self._subset_border,
            self._subset_label
        ]
Example #6
0
  def __init__ (self,parent,hide_on_close=False):
    QMainWindow.__init__(self,parent);
    self.setWindowIcon(pixmaps.tigger_starface.icon());
    self._currier = PersistentCurrier();
    self.hide();
    # init column constants
    for icol,col in enumerate(self.ViewModelColumns):
        setattr(self,"Column%s"%col.capitalize(),icol);
    # init GUI
    self.setWindowTitle("Tigger");
    # self.setIcon(pixmaps.purr_logo.pm());
    cw = QWidget(self);
    self.setCentralWidget(cw);
    cwlo = QVBoxLayout(cw);
    cwlo.setMargin(5);
    # make splitter
    spl1 = self._splitter1 = QSplitter(Qt.Vertical,cw);
    spl1.setOpaqueResize(False);
    cwlo.addWidget(spl1);
    # Create listview of LSM entries
    self.tw = SkyModelTreeWidget(spl1);
    self.tw.hide();

    # split bottom pane
    spl2 = self._splitter2 = QSplitter(Qt.Horizontal,spl1);
    spl2.setOpaqueResize(False);
    self._skyplot_stack = QWidget(spl2);
    self._skyplot_stack_lo = QVBoxLayout(self._skyplot_stack);
    self._skyplot_stack_lo.setContentsMargins(0,0,0,0);

    # add plot
    self.skyplot = SkyModelPlotter(self._skyplot_stack,self);
    self.skyplot.resize(128,128);
    self.skyplot.setSizePolicy(QSizePolicy.Minimum,QSizePolicy.Preferred);
    self._skyplot_stack_lo.addWidget(self.skyplot,1000);
    self.skyplot.hide();
    QObject.connect(self.skyplot,SIGNAL("imagesChanged"),self._imagesChanged);
    QObject.connect(self.skyplot,SIGNAL("showMessage"),self.showMessage);
    QObject.connect(self.skyplot,SIGNAL("showErrorMessage"),self.showErrorMessage);

    self._grouptab_stack = QWidget(spl2);
    self._grouptab_stack_lo = lo =QVBoxLayout(self._grouptab_stack);
    self._grouptab_stack_lo.setContentsMargins(0,0,0,0);
    # add groupings table
    self.grouptab = ModelGroupsTable(self._grouptab_stack);
    self.grouptab.setSizePolicy(QSizePolicy.Preferred,QSizePolicy.Preferred);
    QObject.connect(self,SIGNAL("hasSkyModel"),self.grouptab.setEnabled);
    lo.addWidget(self.grouptab,1000);
    lo.addStretch(1);
    self.grouptab.hide();

    # add image controls -- parentless for now (setLayout will reparent them anyway)
    self.imgman = ImageManager();
    self.skyplot.setImageManager(self.imgman);
    QObject.connect(self.imgman,SIGNAL("imagesChanged"),self._imagesChanged);
    QObject.connect(self.imgman,SIGNAL("showMessage"),self.showMessage);
    QObject.connect(self.imgman,SIGNAL("showErrorMessage"),self.showErrorMessage);

    # enable status line
    self.statusBar().show();
    # Create and populate main menu
    menubar = self.menuBar();
    # File menu
    file_menu = menubar.addMenu("&File");
    qa_open = file_menu.addAction("&Open model...",self._openFileCallback,Qt.CTRL+Qt.Key_O);
    qa_merge = file_menu.addAction("&Merge in model...",self._mergeFileCallback,Qt.CTRL+Qt.SHIFT+Qt.Key_O);
    QObject.connect(self,SIGNAL("hasSkyModel"),qa_merge.setEnabled);
    file_menu.addSeparator();
    qa_save = file_menu.addAction("&Save model",self.saveFile,Qt.CTRL+Qt.Key_S);
    QObject.connect(self,SIGNAL("isUpdated"),qa_save.setEnabled);
    qa_save_as = file_menu.addAction("Save model &as...",self.saveFileAs);
    QObject.connect(self,SIGNAL("hasSkyModel"),qa_save_as.setEnabled);
    qa_save_selection_as = file_menu.addAction("Save selection as...",self.saveSelectionAs);
    QObject.connect(self,SIGNAL("hasSelection"),qa_save_selection_as.setEnabled);
    file_menu.addSeparator();
    qa_close = file_menu.addAction("&Close model",self.closeFile,Qt.CTRL+Qt.Key_W);
    QObject.connect(self,SIGNAL("hasSkyModel"),qa_close.setEnabled);
    qa_quit = file_menu.addAction("Quit",self.close,Qt.CTRL+Qt.Key_Q);

    # Image menu
    menubar.addMenu(self.imgman.getMenu());
    # Plot menu
    menubar.addMenu(self.skyplot.getMenu());

    # LSM Menu
    em = QMenu("&LSM",self);
    self._qa_em = menubar.addMenu(em);
    self._qa_em.setVisible(False);
    QObject.connect(self,SIGNAL("hasSkyModel"),self._qa_em.setVisible);
    self._column_view_menu = QMenu("&Show columns",self);
    self._qa_cv_menu = em.addMenu(self._column_view_menu);
    em.addSeparator();
    em.addAction("Select &all",self._selectAll,Qt.CTRL+Qt.Key_A);
    em.addAction("&Invert selection",self._selectInvert,Qt.CTRL+Qt.Key_I);
    em.addAction("Select b&y attribute...",self._showSourceSelector,Qt.CTRL+Qt.Key_Y);
    em.addSeparator();
    qa_add_tag = em.addAction("&Tag selection...",self.addTagToSelection,Qt.CTRL+Qt.Key_T);
    QObject.connect(self,SIGNAL("hasSelection"),qa_add_tag.setEnabled);
    qa_del_tag = em.addAction("&Untag selection...",self.removeTagsFromSelection,Qt.CTRL+Qt.Key_U);
    QObject.connect(self,SIGNAL("hasSelection"),qa_del_tag.setEnabled);
    qa_del_sel = em.addAction("&Delete selection",self._deleteSelection);
    QObject.connect(self,SIGNAL("hasSelection"),qa_del_sel.setEnabled);

   # Tools menu
    tm = self._tools_menu = QMenu("&Tools",self);
    self._qa_tm = menubar.addMenu(tm);
    self._qa_tm.setVisible(False);
    QObject.connect(self,SIGNAL("hasSkyModel"),self._qa_tm.setVisible);

   # Help menu
    menubar.addSeparator();
    hm = self._help_menu = menubar.addMenu("&Help");
    hm.addAction("&About...",self._showAboutDialog);
    self._about_dialog = None;

    # message handlers
    self.qerrmsg = QErrorMessage(self);

    # set initial state
    self.setAcceptDrops(True);
    self.model = None;
    self.filename = None;
    self._display_filename = None;
    self._open_file_dialog = self._merge_file_dialog = self._save_as_dialog = self._save_sel_as_dialog = self._open_image_dialog = None;
    self.emit(SIGNAL("isUpdated"),False);
    self.emit(SIGNAL("hasSkyModel"),False);
    self.emit(SIGNAL("hasSelection"),False);
    self._exiting = False;

    # set initial layout
    self._current_layout = None;
    self.setLayout(self.LayoutEmpty);
    dprint(1,"init complete");