1 // Copyright (C) 2012-2019 The VPaint Developers.
2 // See the COPYRIGHT file at the top-level directory of this distribution
3 // and at https://github.com/dalboris/vpaint/blob/master/COPYRIGHT
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16
17 #include "ViewSettings.h"
18
ViewSettings()19 ViewSettings::ViewSettings() :
20 // Display
21 zoom_(1.0),
22 displayMode_(ILLUSTRATION),
23 outlineOnly_(false),
24 drawBackground_(true),
25 drawCursor_(true),
26 isMainDrawing_(true),
27 vertexTopologySize_(5),
28 edgeTopologyWidth_(3),
29 drawTopologyFaces_(false),
30 screenRelative_(true),
31
32 time_(),
33
34 // Onion skinning
35 onionSkinningIsEnabled_(false),
36 areOnionSkinsPickable_(true),
37 numOnionSkinsBefore_(3),
38 numOnionSkinsAfter_(3),
39 onionSkinsTimeOffset_(Time(1)),
40 onionSkinsXOffset_(0.0),
41 onionSkinsYOffset_(0.0),
42 onionSkinsTransparencyRatio_(1.0)
43 {
44 }
45
~ViewSettings()46 ViewSettings::~ViewSettings()
47 {
48 }
49
50
time() const51 Time ViewSettings::time() const
52 {
53 return time_;
54 }
55
setTime(const Time & t)56 void ViewSettings::setTime(const Time & t)
57 {
58 time_ = t;
59 }
60
61 // Zoom level
zoom() const62 double ViewSettings::zoom() const
63 {
64 return zoom_;
65 }
setZoom(double newValue)66 void ViewSettings::setZoom(double newValue)
67 {
68 if(zoom_ != newValue)
69 {
70 zoom_ = newValue;
71 }
72 }
73
displayMode() const74 ViewSettings::DisplayMode ViewSettings::displayMode() const
75 {
76 return displayMode_;
77 }
setDisplayMode(DisplayMode mode)78 void ViewSettings::setDisplayMode(DisplayMode mode)
79 {
80 if(displayMode_ != mode)
81 {
82 displayMode_ = mode;
83 }
84 }
85
toggleOutline()86 void ViewSettings::toggleOutline()
87 {
88 if(displayMode() == ILLUSTRATION)
89 {
90 if(outlineOnly_)
91 setDisplayMode(OUTLINE);
92 else
93 setDisplayMode(ILLUSTRATION_OUTLINE);
94 }
95 else
96 setDisplayMode(ILLUSTRATION);
97 }
98
toggleOutlineOnly()99 void ViewSettings::toggleOutlineOnly()
100 {
101 if(displayMode() != ILLUSTRATION)
102 {
103 outlineOnly_ = !outlineOnly_;
104 if(outlineOnly_)
105 setDisplayMode(OUTLINE);
106 else
107 setDisplayMode(ILLUSTRATION_OUTLINE);
108 }
109 }
110
drawCursor() const111 bool ViewSettings::drawCursor() const
112 {
113 return drawCursor_;
114 }
setDrawCursor(bool newValue)115 void ViewSettings::setDrawCursor(bool newValue)
116 {
117 drawCursor_ = newValue;
118 }
119
isMainDrawing() const120 bool ViewSettings::isMainDrawing() const
121 {
122 return isMainDrawing_;
123 }
setMainDrawing(bool newValue)124 void ViewSettings::setMainDrawing(bool newValue)
125 {
126 if(isMainDrawing_ != newValue)
127 {
128 isMainDrawing_ = newValue;
129 }
130 }
131
vertexTopologySize() const132 int ViewSettings::vertexTopologySize() const
133 {
134 return vertexTopologySize_;
135 }
setVertexTopologySize(int newValue)136 void ViewSettings::setVertexTopologySize(int newValue)
137 {
138 if(vertexTopologySize_ != newValue)
139 {
140 vertexTopologySize_ = newValue;
141 }
142 }
143
edgeTopologyWidth() const144 int ViewSettings::edgeTopologyWidth() const
145 {
146 return edgeTopologyWidth_;
147 }
setEdgeTopologyWidth(int newValue)148 void ViewSettings::setEdgeTopologyWidth(int newValue)
149 {
150 if(edgeTopologyWidth_ != newValue)
151 {
152 edgeTopologyWidth_ = newValue;
153 }
154 }
155
drawTopologyFaces() const156 bool ViewSettings::drawTopologyFaces() const
157 {
158 return drawTopologyFaces_;
159 }
setDrawTopologyFaces(bool newValue)160 void ViewSettings::setDrawTopologyFaces(bool newValue)
161 {
162 if(drawTopologyFaces_ != newValue)
163 {
164 drawTopologyFaces_ = newValue;
165 }
166 }
167
screenRelative() const168 bool ViewSettings::screenRelative() const
169 {
170 return screenRelative_;
171 }
setScreenRelative(bool newValue)172 void ViewSettings::setScreenRelative(bool newValue)
173 {
174 if(screenRelative_ != newValue)
175 {
176 screenRelative_ = newValue;
177 }
178 }
179
180
181
182
183
onionSkinningIsEnabled() const184 bool ViewSettings::onionSkinningIsEnabled() const
185 {
186 return onionSkinningIsEnabled_;
187 }
setOnionSkinningIsEnabled(bool newValue)188 void ViewSettings::setOnionSkinningIsEnabled(bool newValue)
189 {
190 onionSkinningIsEnabled_ = newValue;
191 }
192
areOnionSkinsPickable() const193 bool ViewSettings::areOnionSkinsPickable() const
194 {
195 return areOnionSkinsPickable_;
196 }
setAreOnionSkinsPickable(bool newValue)197 void ViewSettings::setAreOnionSkinsPickable(bool newValue)
198 {
199 areOnionSkinsPickable_ = newValue;
200 }
201
numOnionSkinsBefore() const202 int ViewSettings::numOnionSkinsBefore() const
203 {
204 return numOnionSkinsBefore_;
205 }
setNumOnionSkinsBefore(int newValue)206 void ViewSettings::setNumOnionSkinsBefore(int newValue)
207 {
208 numOnionSkinsBefore_ = newValue;
209 }
210
numOnionSkinsAfter() const211 int ViewSettings::numOnionSkinsAfter() const
212 {
213 return numOnionSkinsAfter_;
214 }
setNumOnionSkinsAfter(int newValue)215 void ViewSettings::setNumOnionSkinsAfter(int newValue)
216 {
217 numOnionSkinsAfter_ = newValue;
218 }
219
onionSkinsTimeOffset() const220 Time ViewSettings::onionSkinsTimeOffset() const
221 {
222 return onionSkinsTimeOffset_;
223 }
setOnionSkinsTimeOffset(Time newValue)224 void ViewSettings::setOnionSkinsTimeOffset(Time newValue)
225 {
226 onionSkinsTimeOffset_ = newValue;
227 }
228
setOnionSkinsTimeOffset(double newValue)229 void ViewSettings::setOnionSkinsTimeOffset(double newValue)
230 {
231 int intValue = newValue;
232 if(newValue == (double) intValue)
233 onionSkinsTimeOffset_ = Time(intValue); // Exact frame
234 else
235 onionSkinsTimeOffset_ = Time(newValue); // float time
236 }
237
onionSkinsXOffset() const238 double ViewSettings::onionSkinsXOffset() const
239 {
240 return onionSkinsXOffset_;
241 }
setOnionSkinsXOffset(double newValue)242 void ViewSettings::setOnionSkinsXOffset(double newValue)
243 {
244 onionSkinsXOffset_ = newValue;
245 }
246
onionSkinsYOffset() const247 double ViewSettings::onionSkinsYOffset() const
248 {
249 return onionSkinsYOffset_;
250 }
setOnionSkinsYOffset(double newValue)251 void ViewSettings::setOnionSkinsYOffset(double newValue)
252 {
253 onionSkinsYOffset_ = newValue;
254 }
255
onionSkinsTransparencyRatio() const256 double ViewSettings::onionSkinsTransparencyRatio() const
257 {
258 return onionSkinsTransparencyRatio_;
259 }
setOnionSkinsTransparencyRatio(double newValue)260 void ViewSettings::setOnionSkinsTransparencyRatio(double newValue)
261 {
262 onionSkinsTransparencyRatio_ = newValue;
263 }
264
265 #include <QWidgetAction>
266 #include <QMenuBar>
267 #include <QMenu>
268 #include <QLabel>
269 #include <QComboBox>
270 #include <QPushButton>
271 #include <QLineEdit>
272
ViewSettingsWidget(ViewSettings & viewSettings,QWidget * parent)273 ViewSettingsWidget::ViewSettingsWidget(ViewSettings & viewSettings, QWidget * parent) :
274 QWidget(parent),
275 viewSettings_(viewSettings),
276 ignoreZoomValueChangedSignal_(false)
277 {
278 // Set style
279 setCursor(Qt::ArrowCursor);
280
281 zoomSpinBox_ = new QSpinBox();
282 zoomSpinBox_->setMaximumWidth(70);
283 zoomSpinBox_->setRange(1,1e7);
284 zoomSpinBox_->setValue(100);
285 zoomSpinBox_->setSuffix(" %");
286 zoomSpinBox_->setAlignment(Qt::AlignCenter);
287
288 QPushButton * goToPreviousFrameButton = new QPushButton();
289 int frameButtonWidth = 40;
290 goToPreviousFrameButton->setMaximumWidth(frameButtonWidth);
291 goToPreviousFrameButton->setIcon(QIcon(":/images/go-first-view.png"));
292
293 frameLineEdit_ = new QLineEdit();
294 frameLineEdit_->setMaximumWidth(50);
295 frameLineEdit_->setAlignment(Qt::AlignCenter);
296
297 QPushButton * goToNextFrameButton = new QPushButton();
298 goToNextFrameButton->setMaximumWidth(frameButtonWidth);
299 goToNextFrameButton->setIcon(QIcon(":/images/go-last-view.png"));
300
301 // Menu to change the display mode and options
302
303 QSize buttonSize(68, 48);
304 QSize buttonIconSize(24, 24);
305
306 QHBoxLayout * displayModeLayout = new QHBoxLayout();
307 displayModeLayout->setMargin(0);
308 displayModeLayout->setSpacing(0);
309
310 QVBoxLayout * displayModeLayoutLeftColumn = new QVBoxLayout();
311 displayModeLayoutLeftColumn->setMargin(0);
312 displayModeLayoutLeftColumn->setSpacing(0);
313
314 QFormLayout * displayModeLayoutRightColumn = new QFormLayout();
315 displayModeLayoutRightColumn->setMargin(10);
316 displayModeLayoutRightColumn->setSpacing(10);
317
318 displayModeButton_Normal_ = new QPushButton();
319 displayModeButton_Normal_->setToolTip("Normal display mode");
320 displayModeButton_Normal_->setIcon(QIcon(":images/display-mode-normal.png"));
321 displayModeButton_Normal_->setIconSize(buttonIconSize);
322 displayModeButton_Normal_->setFixedSize(buttonSize);
323 displayModeButton_Normal_->setAutoExclusive(true);
324 displayModeButton_Normal_->setCheckable(true);
325 displayModeButton_Normal_->setChecked(true);
326
327 displayModeButton_NormalOutline_ = new QPushButton();
328 displayModeButton_NormalOutline_->setToolTip("Normal+Outline display mode");
329 displayModeButton_NormalOutline_->setIcon(QIcon(":images/display-mode-normal-outline.png"));
330 displayModeButton_NormalOutline_->setIconSize(buttonIconSize);
331 displayModeButton_NormalOutline_->setFixedSize(buttonSize);
332 displayModeButton_NormalOutline_->setAutoExclusive(true);
333 displayModeButton_NormalOutline_->setCheckable(true);
334 displayModeButton_NormalOutline_->setChecked(false);
335
336 displayModeButton_Outline_ = new QPushButton();
337 displayModeButton_Outline_->setToolTip("Outline display mode");
338 displayModeButton_Outline_->setIcon(QIcon(":images/display-mode-outline.png"));
339 displayModeButton_Outline_->setIconSize(buttonIconSize);
340 displayModeButton_Outline_->setFixedSize(buttonSize);
341 displayModeButton_Outline_->setAutoExclusive(true);
342 displayModeButton_Outline_->setCheckable(true);
343 displayModeButton_Outline_->setChecked(false);
344
345 displayModeLayoutLeftColumn->addWidget(displayModeButton_Normal_);
346 displayModeLayoutLeftColumn->addWidget(displayModeButton_NormalOutline_);
347 displayModeLayoutLeftColumn->addWidget(displayModeButton_Outline_);
348 displayModeLayoutLeftColumn->addStretch();
349
350
351 vertexTopologySize_ = new QSlider();
352 vertexTopologySize_->setOrientation(Qt::Horizontal);
353 vertexTopologySize_->setRange(0,100);
354 displayModeLayoutRightColumn->addRow(tr("Vertex outline size"), vertexTopologySize_);
355
356 edgeTopologyWidth_ = new QSlider();
357 edgeTopologyWidth_->setOrientation(Qt::Horizontal);
358 edgeTopologyWidth_->setRange(0,100);
359 displayModeLayoutRightColumn->addRow(tr("Edge outline width"), edgeTopologyWidth_);
360
361 drawTopologyFaces_ = new QCheckBox();
362 displayModeLayoutRightColumn->addRow(tr("Display faces in outline mode"), drawTopologyFaces_);
363
364 QWidget * displayModeWidget = new QWidget();
365 displayModeLayout->addLayout(displayModeLayoutLeftColumn);
366 displayModeLayout->addLayout(displayModeLayoutRightColumn);
367 displayModeWidget->setLayout(displayModeLayout);
368
369 QMenu * displayModeMenu = new QMenu();
370 QWidgetAction * displayModeWidgetAction = new QWidgetAction(this);
371 displayModeWidgetAction->setDefaultWidget(displayModeWidget);
372 displayModeMenu->addAction(displayModeWidgetAction);
373
374
375 // Button to show/hide the display mode menu
376
377 int dropdownButtonWidth = 60;
378 displayModeButton_ = new QPushButton();
379 displayModeButton_->setToolTip("Display mode settings");
380 displayModeButton_->setIcon(QIcon(":images/display-mode-normal.png"));
381 displayModeButton_->setMaximumWidth(dropdownButtonWidth);
382 displayModeButton_->setMenu(displayModeMenu);
383
384
385 // Menu to change onion skinning options
386
387 QHBoxLayout * onionSkinningLayout = new QHBoxLayout();
388 onionSkinningLayout->setMargin(0);
389 onionSkinningLayout->setSpacing(0);
390
391 QVBoxLayout * onionSkinningLayoutLeftColumn = new QVBoxLayout();
392 onionSkinningLayoutLeftColumn->setMargin(0);
393 onionSkinningLayoutLeftColumn->setSpacing(0);
394
395 QFormLayout * onionSkinningLayoutRightColumn = new QFormLayout();
396 onionSkinningLayoutRightColumn->setMargin(10);
397 onionSkinningLayoutRightColumn->setSpacing(10);
398
399 QFormLayout * onionSkinningLayoutRightColumn2 = new QFormLayout();
400 onionSkinningLayoutRightColumn2->setMargin(10);
401 onionSkinningLayoutRightColumn2->setSpacing(10);
402
403 onionSkinningButton_Off_ = new QPushButton();
404 onionSkinningButton_Off_->setToolTip("Onion skinning off");
405 onionSkinningButton_Off_->setIcon(QIcon(":images/onion-skinning-off.png"));
406 onionSkinningButton_Off_->setIconSize(buttonIconSize);
407 onionSkinningButton_Off_->setFixedSize(buttonSize);
408 onionSkinningButton_Off_->setAutoExclusive(true);
409 onionSkinningButton_Off_->setCheckable(true);
410 onionSkinningButton_Off_->setChecked(true);
411
412 onionSkinningButton_On_ = new QPushButton();
413 onionSkinningButton_On_->setToolTip("Onion skinning on");
414 onionSkinningButton_On_->setIcon(QIcon(":images/onion-skinning-on.png"));
415 onionSkinningButton_On_->setIconSize(buttonIconSize);
416 onionSkinningButton_On_->setFixedSize(buttonSize);
417 onionSkinningButton_On_->setAutoExclusive(true);
418 onionSkinningButton_On_->setCheckable(true);
419 onionSkinningButton_On_->setChecked(false);
420
421 onionSkinningLayoutLeftColumn->addWidget(onionSkinningButton_Off_);
422 onionSkinningLayoutLeftColumn->addWidget(onionSkinningButton_On_);
423 onionSkinningLayoutLeftColumn->addStretch();
424
425 numOnionSkinsBefore_ = new QSpinBox();
426 numOnionSkinsBefore_->setRange(0,100);
427 onionSkinningLayoutRightColumn->addRow(tr("Num skins before"), numOnionSkinsBefore_);
428
429 numOnionSkinsAfter_ = new QSpinBox();
430 numOnionSkinsAfter_->setRange(0,100);
431 onionSkinningLayoutRightColumn->addRow(tr("Num skins after"), numOnionSkinsAfter_);
432
433 areOnionSkinsPickable_ = new QCheckBox();
434 onionSkinningLayoutRightColumn->addRow(tr("Are skins pickable"), areOnionSkinsPickable_);
435
436 onionSkinsTimeOffset_ = new QDoubleSpinBox();
437 onionSkinsTimeOffset_->setRange(-100,100);
438 onionSkinsTimeOffset_->setDecimals(2);
439 onionSkinningLayoutRightColumn2->addRow(tr("Skins frame offset"), onionSkinsTimeOffset_);
440
441 onionSkinsXOffset_ = new QDoubleSpinBox();
442 onionSkinsXOffset_->setRange(-10000,10000);
443 onionSkinsXOffset_->setDecimals(2);
444 onionSkinningLayoutRightColumn2->addRow(tr("Skin X offset"), onionSkinsXOffset_);
445
446 onionSkinsYOffset_ = new QDoubleSpinBox();
447 onionSkinsYOffset_->setRange(-10000,10000);
448 onionSkinsYOffset_->setDecimals(2);
449 onionSkinningLayoutRightColumn2->addRow(tr("Skin Y offset"), onionSkinsYOffset_);
450
451 QWidget * onionSkinningWidget = new QWidget();
452 onionSkinningLayout->addLayout(onionSkinningLayoutLeftColumn);
453 onionSkinningLayout->addLayout(onionSkinningLayoutRightColumn);
454 onionSkinningLayout->addLayout(onionSkinningLayoutRightColumn2);
455 onionSkinningWidget->setLayout(onionSkinningLayout);
456
457 QMenu * onionSkinningMenu = new QMenu();
458 QWidgetAction * onionSkinningWidgetAction = new QWidgetAction(this);
459 onionSkinningWidgetAction->setDefaultWidget(onionSkinningWidget);
460 onionSkinningMenu->addAction(onionSkinningWidgetAction);
461
462
463 // Button to show/hide the onion skinning menu
464
465 onionSkinningButton_ = new QPushButton();
466 onionSkinningButton_->setToolTip("Onion skinning settings");
467 onionSkinningButton_->setIcon(QIcon(":images/display-mode-normal.png"));
468 onionSkinningButton_->setMaximumWidth(dropdownButtonWidth);
469 onionSkinningButton_->setMenu(onionSkinningMenu);
470
471
472 // Horizontal layout
473 int spacing = 5;
474 QHBoxLayout * hlayout = new QHBoxLayout();
475 hlayout->setContentsMargins(spacing, spacing, spacing, spacing);
476 hlayout->setSpacing(0);
477 hlayout->addWidget(zoomSpinBox_);
478 hlayout->addSpacing(spacing);
479 hlayout->addWidget(goToPreviousFrameButton);
480 hlayout->addWidget(frameLineEdit_);
481 hlayout->addWidget(goToNextFrameButton);
482 hlayout->addSpacing(spacing);
483 hlayout->addWidget(displayModeButton_);
484 hlayout->addSpacing(spacing);
485 hlayout->addWidget(onionSkinningButton_);
486 hlayout->addStretch();
487 setLayout(hlayout);
488
489
490 // ----------------- Backend/Gui connections -----------------
491
492 updateWidgetFromSettings(); // Might not be an exact match due to widget min/max values
493 updateSettingsFromWidget(); // Make sure its an exact match
494
495 /* THE FOLLOWING ARE NOT IMPLEMENTED OR DEEMED IRRELEVANT
496 connect(screenRelative_, SIGNAL(stateChanged(int)), this, SLOT(updateSettingsFromWidget()));
497 connect(onionSkinsTransparencyRatio_, SIGNAL(valueChanged(double)), this, SLOT(updateSettingsFromWidget()));
498 */
499
500 // Widget -> Settings connection
501 connect(zoomSpinBox_, SIGNAL(valueChanged(int)), this, SLOT(processZoomValueChangedSignal(int)));
502 connect(frameLineEdit_, SIGNAL(returnPressed()), this, SLOT(updateSettingsFromWidget()));
503 connect(goToPreviousFrameButton, SIGNAL(clicked(bool)), this, SLOT(decrFrame()));
504 connect(goToNextFrameButton, SIGNAL(clicked(bool)), this, SLOT(incrFrame()));
505
506 connect(displayModeButton_Normal_, SIGNAL(clicked(bool)), this, SLOT(updateSettingsFromWidget()));
507 connect(displayModeButton_NormalOutline_, SIGNAL(clicked(bool)), this, SLOT(updateSettingsFromWidget()));
508 connect(displayModeButton_Outline_, SIGNAL(clicked(bool)), this, SLOT(updateSettingsFromWidget()));
509 connect(onionSkinningButton_Off_, SIGNAL(clicked(bool)), this, SLOT(updateSettingsFromWidget()));
510 connect(onionSkinningButton_On_, SIGNAL(clicked(bool)), this, SLOT(updateSettingsFromWidget()));
511
512 connect(vertexTopologySize_, SIGNAL(valueChanged(int)), this, SLOT(updateSettingsFromWidget()));
513 connect(edgeTopologyWidth_, SIGNAL(valueChanged(int)), this, SLOT(updateSettingsFromWidget()));
514 connect(drawTopologyFaces_, SIGNAL(stateChanged(int)), this, SLOT(updateSettingsFromWidget()));
515
516 connect(areOnionSkinsPickable_, SIGNAL(stateChanged(int)), this, SLOT(updateSettingsFromWidget()));
517 connect(numOnionSkinsBefore_, SIGNAL(valueChanged(int)), this, SLOT(updateSettingsFromWidget()));
518 connect(numOnionSkinsAfter_, SIGNAL(valueChanged(int)), this, SLOT(updateSettingsFromWidget()));
519 connect(onionSkinsTimeOffset_, SIGNAL(valueChanged(double)), this, SLOT(updateSettingsFromWidget()));
520 connect(onionSkinsXOffset_, SIGNAL(valueChanged(double)), this, SLOT(updateSettingsFromWidget()));
521 connect(onionSkinsYOffset_, SIGNAL(valueChanged(double)), this, SLOT(updateSettingsFromWidget()));
522
523
524 // Settings -> Widget connection
525 // -> must be done manually by owner of ViewSettings and ViewSettingsWidget
526
527
528 // ----------------- Set position and size -----------------
529
530 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
531 }
532
~ViewSettingsWidget()533 ViewSettingsWidget::~ViewSettingsWidget()
534 {
535 }
536
setActive(bool isActive)537 void ViewSettingsWidget::setActive(bool isActive)
538 {
539
540 }
541
processZoomValueChangedSignal(int n)542 void ViewSettingsWidget::processZoomValueChangedSignal(int n)
543 {
544 // Only set value from spinbox when user actual change value from
545 // spinbox, not when setValue() is called programmatically. We do
546 // this by manually setting
547 // ignoreZoomValueChangedSignal_ = true;
548 // before calling setValue()
549 if(!ignoreZoomValueChangedSignal_)
550 {
551 zoomValue_ = 0.01 * n;
552 updateSettingsFromWidget();
553 }
554 }
555
556
updateWidgetFromSettings()557 void ViewSettingsWidget::updateWidgetFromSettings()
558 {
559 /* THE FOLLOWING ARE NOT IMPLEMENTED OR DEEMED IRRELEVANT
560 screenRelative_->setChecked(viewSettings_.screenRelative());
561 onionSkinsTransparencyRatio_->setValue(viewSettings_.onionSkinsTransparencyRatio());
562 */
563
564 vertexTopologySize_->setValue(viewSettings_.vertexTopologySize());
565 edgeTopologyWidth_->setValue(viewSettings_.edgeTopologyWidth());
566 drawTopologyFaces_->setChecked(viewSettings_.drawTopologyFaces());
567
568 areOnionSkinsPickable_->setChecked(viewSettings_.areOnionSkinsPickable());
569 numOnionSkinsBefore_->setValue(viewSettings_.numOnionSkinsBefore());
570 numOnionSkinsAfter_->setValue(viewSettings_.numOnionSkinsAfter());
571 onionSkinsTimeOffset_->setValue(viewSettings_.onionSkinsTimeOffset().floatTime());
572 onionSkinsXOffset_->setValue(viewSettings_.onionSkinsXOffset());
573 onionSkinsYOffset_->setValue(viewSettings_.onionSkinsYOffset());
574
575 zoomValue_ = viewSettings_.zoom();
576 ignoreZoomValueChangedSignal_ = true;
577 zoomSpinBox_->setValue(100*viewSettings_.zoom());
578 ignoreZoomValueChangedSignal_ = false;
579
580 frameLineEdit_->setText(QString().setNum(viewSettings_.time().frame()));
581
582 switch(viewSettings_.displayMode())
583 {
584 case ViewSettings::ILLUSTRATION:
585 displayModeButton_Normal_->setChecked(true);
586 displayModeButton_->setIcon(QIcon(":images/display-mode-normal.png"));
587 break;
588 case ViewSettings::ILLUSTRATION_OUTLINE:
589 displayModeButton_NormalOutline_->setChecked(true);
590 displayModeButton_->setIcon(QIcon(":images/display-mode-normal-outline.png"));
591 break;
592 case ViewSettings::OUTLINE:
593 displayModeButton_Outline_->setChecked(true);
594 displayModeButton_->setIcon(QIcon(":images/display-mode-outline.png"));
595 break;
596 }
597
598 if(viewSettings_.onionSkinningIsEnabled())
599 {
600 onionSkinningButton_On_->setChecked(true);
601 onionSkinningButton_->setIcon(QIcon(":images/onion-skinning-on.png"));
602 }
603 else
604 {
605 onionSkinningButton_Off_->setChecked(true);
606 onionSkinningButton_->setIcon(QIcon(":images/onion-skinning-off.png"));
607 }
608 }
609
updateSettingsFromWidget()610 void ViewSettingsWidget::updateSettingsFromWidget()
611 {
612 updateSettingsFromWidgetSilent();
613 emit changed();
614 }
615
getFrame_()616 int ViewSettingsWidget::getFrame_()
617 {
618 bool ok;
619 int frame = frameLineEdit_->text().toInt(&ok);
620 if(ok)
621 {
622 return frame;
623 }
624 else
625 {
626 return viewSettings_.time().frame();
627 }
628 }
629
incrFrame()630 void ViewSettingsWidget::incrFrame()
631 {
632 int frame = getFrame_();
633 frame++;
634 frameLineEdit_->setText(QString().setNum(frame));
635 updateSettingsFromWidget();
636 }
637
decrFrame()638 void ViewSettingsWidget::decrFrame()
639 {
640 int frame = getFrame_();
641 frame--;
642 frameLineEdit_->setText(QString().setNum(frame));
643 updateSettingsFromWidget();
644 }
645
updateSettingsFromWidgetSilent()646 void ViewSettingsWidget::updateSettingsFromWidgetSilent()
647 {
648 /* THE FOLLOWING ARE NOT IMPLEMENTED OR DEEMED IRRELEVANT
649 viewSettings_.setScreenRelative(screenRelative_->isChecked());
650 viewSettings_.setOnionSkinsTransparencyRatio(onionSkinsTransparencyRatio_->value());
651 */
652
653 viewSettings_.setVertexTopologySize(vertexTopologySize_->value());
654 viewSettings_.setEdgeTopologyWidth(edgeTopologyWidth_->value());
655 viewSettings_.setDrawTopologyFaces(drawTopologyFaces_->isChecked());
656
657 viewSettings_.setAreOnionSkinsPickable(areOnionSkinsPickable_->isChecked());
658 viewSettings_.setNumOnionSkinsBefore(numOnionSkinsBefore_->value());
659 viewSettings_.setNumOnionSkinsAfter(numOnionSkinsAfter_->value());
660 viewSettings_.setOnionSkinsTimeOffset(onionSkinsTimeOffset_->value());
661 viewSettings_.setOnionSkinsXOffset(onionSkinsXOffset_->value());
662 viewSettings_.setOnionSkinsYOffset(onionSkinsYOffset_->value());
663
664 viewSettings_.setZoom(zoomValue_);
665 QString textFrame = frameLineEdit_->text();
666 bool ok;
667 int frame = textFrame.toInt(&ok);
668 if(ok)
669 {
670 viewSettings_.setTime(Time(frame));
671 }
672 else
673 {
674 frameLineEdit_->setText(QString().setNum(viewSettings_.time().frame()));
675 }
676
677 if(displayModeButton_Normal_->isChecked())
678 {
679 viewSettings_.setDisplayMode(ViewSettings::ILLUSTRATION);
680 displayModeButton_->setIcon(QIcon(":images/display-mode-normal.png"));
681 }
682 else if(displayModeButton_NormalOutline_->isChecked())
683 {
684 viewSettings_.setDisplayMode(ViewSettings::ILLUSTRATION_OUTLINE);
685 displayModeButton_->setIcon(QIcon(":images/display-mode-normal-outline.png"));
686
687 }
688 else if(displayModeButton_Outline_->isChecked())
689 {
690 viewSettings_.setDisplayMode(ViewSettings::OUTLINE);
691 displayModeButton_->setIcon(QIcon(":images/display-mode-outline.png"));
692 }
693
694 if(onionSkinningButton_Off_->isChecked())
695 {
696 viewSettings_.setOnionSkinningIsEnabled(false);
697 onionSkinningButton_->setIcon(QIcon(":images/onion-skinning-off.png"));
698 }
699 else if(onionSkinningButton_On_->isChecked())
700 {
701 viewSettings_.setOnionSkinningIsEnabled(true);
702 onionSkinningButton_->setIcon(QIcon(":images/onion-skinning-on.png"));
703 }
704
705 }
706