File failed to load: https://isis.astrogeology.usgs.gov/9.0.0/Object/assets/jax/output/NativeMML/config.js
Isis 3 Programmer Reference
BlinkTool.cpp
1
6
7/* SPDX-License-Identifier: CC0-1.0 */
8
9#include "BlinkTool.h"
10
11#include "FileName.h"
12#include "IString.h"
13#include "MainWindow.h"
14#include "MdiCubeViewport.h"
15
16#include <QDialog>
17#include <QDoubleSpinBox>
18#include <QEvent>
19#include <QHBoxLayout>
20#include <QListWidgetItem>
21#include <QMenu>
22#include <QPainter>
23#include <QPushButton>
24#include <QSettings>
25#include <QSplitter>
26#include <QTimer>
27#include <QToolBar>
28#include <QToolButton>
29#include <QVBoxLayout>
30
31namespace Isis {
32
39 BlinkTool::BlinkTool(QWidget *parent) : Tool(parent) {
40 // Create the blink window
41 p_dialog = new QDialog(parent);
42 p_dialog->setWindowTitle("Blink Comparator");
43 p_dialog->setSizeGripEnabled(true);
45 p_blinkWindow->setMinimumSize(492, 492);
46 p_blinkWindow->setBackgroundRole(QPalette::Shadow);
47 //p_blinkWindow->installEventFilter(this);
48
49 p_listWidget = new QListWidget(p_dialog);
50 p_listWidget->setMinimumHeight(100);
51 connect(p_listWidget, SIGNAL(itemActivated(QListWidgetItem *)),
52 this, SLOT(toggleLink(QListWidgetItem *)));
53 connect(p_listWidget, SIGNAL(currentRowChanged(int)),
54 this, SLOT(updateWindow()));
55
56 p_splitter = new QSplitter(Qt::Vertical, p_dialog);
57 p_splitter->addWidget(p_blinkWindow);
58 p_splitter->addWidget(p_listWidget);
59 p_splitter->setCollapsible(0, false);
60 p_splitter->setCollapsible(1, false);
61 p_splitter->setStretchFactor(0, 0);
62 p_splitter->setStretchFactor(1, 1);
63
64 QWidget *buttons = new QWidget(p_dialog);
65
66 QVBoxLayout *layout = new QVBoxLayout();
67// layout->addWidget(p_blinkWindow,2);
68// layout->addWidget(p_listWidget,1);
69 layout->addWidget(p_splitter, 1);
70 layout->addWidget(buttons, 0);
71 p_dialog->setLayout(layout);
72
73 QToolButton *reverse = new QToolButton(buttons);
74 reverse->setIcon(QPixmap(toolIconDir() + "/blinkReverse.png"));
75 reverse->setIconSize(QSize(22, 22));
76 reverse->setShortcut(Qt::CTRL + Qt::Key_Delete);
77 reverse->setToolTip("Previous");
78 QString text = "<b>Function:</b> Show previous linked viewport and \
79 stop automatic timed blinking \
80 <p><b>Shortcut:</b> Ctrl+Delete</p>";
81 reverse->setWhatsThis(text);
82 connect(reverse, SIGNAL(released()), this, SLOT(reverse()));
83
84 QToolButton *stop = new QToolButton(buttons);
85 stop->setIcon(QPixmap(toolIconDir() + "/blinkStop.png"));
86 stop->setIconSize(QSize(22, 22));
87 stop->setToolTip("Stop");
88 text = "<b>Function:</b> Stop automatic timed blinking";
89 stop->setWhatsThis(text);
90 connect(stop, SIGNAL(released()), this, SLOT(stop()));
91
92 QToolButton *start = new QToolButton(buttons);
93 start->setIcon(QPixmap(toolIconDir() + "/blinkStart.png"));
94 start->setIconSize(QSize(22, 22));
95 start->setToolTip("Start");
96 text = "<b>Function:</b> Start automatic timed blinking. Cycles \
97 through linked viewports at variable rate";
98 start->setWhatsThis(text);
99 connect(start, SIGNAL(released()), this, SLOT(start()));
100
101 QToolButton *forward = new QToolButton(buttons);
102 forward->setIcon(QPixmap(toolIconDir() + "/blinkAdvance.png"));
103 forward->setIconSize(QSize(22, 22));
104 forward->setToolTip("Next");
105 forward->setShortcut(Qt::Key_Delete);
106 text = "<b>Function:</b> Show next linked viewport and stop \
107 automatic timed blinking \
108 <p><b>Shortcut:</b> Delete</p>";
109 forward->setWhatsThis(text);
110 connect(forward, SIGNAL(released()), this, SLOT(advance()));
111
112 p_timeBox = new QDoubleSpinBox(buttons);
113 p_timeBox->setMinimum(0.1);
114 p_timeBox->setMaximum(5.0);
115 p_timeBox->setDecimals(1);
116 p_timeBox->setSingleStep(0.1);
117 p_timeBox->setValue(0.5);
118 p_timeBox->setToolTip("iTime Delay");
119 text = "<b>Function:</b> Change automatic blink rate between " +
120 QString::number(p_timeBox->minimum()) + " and " +
121 QString::number(p_timeBox->maximum()) + " seconds";
122 p_timeBox->setWhatsThis(text);
123
124 QPushButton *close = new QPushButton("Close", buttons);
125 close->setDefault(false);
126 close->setAutoDefault(false);
127 connect(close, SIGNAL(released()), p_dialog, SLOT(hide()));
128 connect(close, SIGNAL(released()), this, SLOT(stop()));
129
130 QHBoxLayout *hlayout = new QHBoxLayout();
131 hlayout->addWidget(reverse);
132 hlayout->addWidget(stop);
133 hlayout->addWidget(start);
134 hlayout->addWidget(forward);
135 hlayout->addWidget(p_timeBox);
136 hlayout->addStretch(1);
137 hlayout->addWidget(close);
138 buttons->setLayout(hlayout);
139
140 // Create the action to bring up the blink window
141 p_action = new QAction(parent);
142 p_action->setShortcut(Qt::Key_K);
143 p_action->setText("&Blink ...");
144 p_action->setIcon(QPixmap(toolIconDir() + "/blink.png"));
145 p_action->setToolTip("Blink");
146 text =
147 "<b>Function:</b> Opens a blink comparator for linked viewports. \
148 <p><b>Shortcut:</b>K</p>";
149 p_action->setWhatsThis(text);
150 p_action->setEnabled(false);
151 connect(p_action, SIGNAL(triggered()), p_dialog, SLOT(show()));
152
153 p_timerOn = false;
154 readSettings();
155 p_blinkWindow->installEventFilter(this);
156 }
157
158
166 menu->addAction(p_action);
167 }
168
169
177 perm->addAction(p_action);
178 }
179
180
186 QString unlinkedIcon = FileName("$ISISROOT/appdata/images/icons/unlinked.png").expanded();
187 static QIcon unlinked(unlinkedIcon);
188 QString linkedIcon = FileName("$ISISROOT/appdata/images/icons/linked.png").expanded();
189 static QIcon linked(linkedIcon);
190 p_listWidget->clear();
191 for(int i = 0; i < (int)cubeViewportList()->size(); i++) {
192 MdiCubeViewport *d = (*(cubeViewportList()))[i];
193 disconnect(d, SIGNAL(linkChanging(bool)), this, 0);
194 disconnect(d, SIGNAL(windowTitleChanged()), this, 0);
195 QListWidgetItem *item = new QListWidgetItem(p_listWidget);
196 item->setText(d->parentWidget()->windowTitle());
197 if(d->isLinked()) {
198 item->setIcon(linked);
199 }
200 else {
201 item->setIcon(unlinked);
202 }
203 connect(d, SIGNAL(linkChanging(bool)), this, SLOT(updateTool()));
204 connect(d, SIGNAL(windowTitleChanged()), this, SLOT(updateTool()));
205 }
206
207 if(cubeViewport() == NULL) {
208 p_action->setEnabled(false);
209 }
210 else if(cubeViewportList()->size() <= 1) {
211 p_action->setEnabled(false);
212 }
213 else {
214 p_action->setEnabled(true);
215 }
216 }
217
218
225 void BlinkTool::toggleLink(QListWidgetItem *item) {
226 for(int i = 0; i < p_listWidget->count(); i++) {
227 if(p_listWidget->item(i) == item) {
228 MdiCubeViewport *d = (*(cubeViewportList()))[i];
229 d->setLinked(!d->isLinked());
230 return;
231 }
232 }
233 }
234
235
241 p_timerOn = false;
242
243 int row = p_listWidget->currentRow() - 1;
244 for(int i = 0; i < (int)cubeViewportList()->size(); i++) {
245 if(row < 0) row = (int)cubeViewportList()->size() - 1;
246 MdiCubeViewport *d = (*(cubeViewportList()))[row];
247 if(d->isLinked()) {
248 p_listWidget->setCurrentRow(row);
249 p_listWidget->scrollToItem(p_listWidget->currentItem());
250 break;
251 }
252 row--;
253 }
254 }
255
256
262 p_timerOn = false;
263 }
264
265
271 if(p_timerOn) return;
272 p_timerOn = true;
273 int msec = (int)(p_timeBox->value() * 1000.0);
274 QTimer::singleShot(msec, this, SLOT(timeout()));
275 }
276
282 p_timerOn = false;
283
284 int row = p_listWidget->currentRow() + 1;
285 for(int i = 0; i < (int)cubeViewportList()->size(); i++) {
286 if(row >= (int) cubeViewportList()->size()) row = 0;
287 MdiCubeViewport *d = (*(cubeViewportList()))[row];
288 if(d->isLinked()) {
289 p_listWidget->setCurrentRow(row);
290 p_listWidget->scrollToItem(p_listWidget->currentItem());
291 break;
292 }
293 row++;
294 }
295 }
296
297
303 if(p_timerOn) {
304 advance();
305 start();
306 }
307 }
308
309
315 p_blinkWindow->repaint();
316 }
317
318
325 QSettings settings(MainWindow::settingsFileName("BlinkTool"), QSettings::NativeFormat);
326 settings.setValue("rate", p_timeBox->value());
327 settings.setValue("size", p_dialog->size());
328 settings.setValue("pos", p_dialog->pos());
329 settings.setValue("geom", p_dialog->saveGeometry());
330 settings.setValue("splitterState", p_splitter->saveState());
331 }
332
333
340 QSettings settings(MainWindow::settingsFileName("BlinkTool"), QSettings::NativeFormat);
341 double rate = settings.value("rate", 0.5).toDouble();
342
343 p_dialog->restoreGeometry(settings.value("geom").toByteArray());
344 p_splitter->restoreState(settings.value("splitterState").toByteArray());
345
346 if (!settings.value("pos").toPoint().isNull())
347 p_dialog->move(settings.value("pos").toPoint());
348
349 p_dialog->resize(settings.value("size", QSize(492, 492)).toSize());
350
351 p_timeBox->setValue(rate);
352 }
353
354
365 bool BlinkTool::eventFilter(QObject *o, QEvent *e) {
366 if(o != p_blinkWindow) return false;
367 if(e->type() == QEvent::Hide) writeSettings();
368 if(e->type() != QEvent::Paint) return false;
369
370 static QPixmap lastPixmap;
371 int row = p_listWidget->currentRow();
372 if(row != -1) {
373 MdiCubeViewport *d = (*(cubeViewportList()))[row];
374 lastPixmap = d->pixmap();
375 }
376
377 int dx = lastPixmap.width() - p_blinkWindow->width();
378 int x = 0;
379 int sx = dx / 2;
380 if(dx < 0) {
381 x = -dx / 2;
382 sx = 0;
383 }
384 int dy = lastPixmap.height() - p_blinkWindow->height();
385 int y = 0;
386 int sy = dy / 2;
387 if(dy < 0) {
388 y = -dy / 2;
389 sy = 0;
390 }
391
392 QPainter p(p_blinkWindow);
393 p.drawPixmap(x, y, lastPixmap, sx, sy, -1, -1);
394
395 return true;
396 }
397}
QPixmap pixmap()
Returns the pixmap.
File name manipulation and expansion.
Definition FileName.h:100
QString expanded() const
Returns a QString of the full file name including the file path, excluding the attributes.
Definition FileName.cpp:196
Cube display widget for certain Isis MDI applications.
void setLinked(bool b)
Change the linked state of the viewport.
bool isLinked() const
Is the viewport linked with other viewports.
Tool(QWidget *parent)
Tool constructor.
Definition Tool.cpp:27
CubeViewportList * cubeViewportList() const
Return the list of cubeviewports.
Definition Tool.cpp:390
MdiCubeViewport * cubeViewport() const
Return the current cubeviewport.
Definition Tool.h:197
QString toolIconDir() const
returns the path to the icon directory.
Definition Tool.h:113
This is free and unencumbered software released into the public domain.
Definition Apollo.h:16