qvolray

view src/ui.cc @ 31:c1dd5b120504

separated the transfer function to a different subwindow and added shortcut for quit
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 14 Apr 2012 22:32:14 +0300
parents 40df2cdc6323
children 7e5a2dd9bca6
line source
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <vector>
4 #include <QtGui>
5 #include "ui.h"
6 #include "ui_maingl.h"
7 #include "ui_sliceview.h"
8 #include "ui_xferview.h"
11 static Volume *volume;
12 std::vector<QGLWidget*> glwlist;
14 MainWindow::MainWindow()
15 {
16 setWindowTitle("Volume Renderer");
18 // OpenGL view (this must be initialized first)
19 maingl = new MainGLView;
20 setCentralWidget(maingl);
21 glwlist.push_back(maingl);
23 // slice view sub-window
24 sidewin = new SideWindow;
25 sidewin->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
26 sidewin->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);
27 addDockWidget(Qt::LeftDockWidgetArea, sidewin);
29 // transfer function sub-window
30 xferwin = new XFerWin;
31 xferwin->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
32 xferwin->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);
33 addDockWidget(Qt::LeftDockWidgetArea, xferwin);
35 // actions
36 QAction *act_open = new QAction(qApp->style()->standardIcon(QStyle::SP_DialogOpenButton), "&Open...", this);
37 act_open->setStatusTip("Open a volume dataset");
38 QObject::connect(act_open, SIGNAL(triggered()), this, SLOT(open_volume()));
40 QAction *act_quit = new QAction("&Quit", this);
41 act_quit->setStatusTip("Quit");
42 //act_quit->setShortcut(QKeySequence(QKeySequence::Quit));
43 act_quit->setShortcut(QKeySequence(tr("Ctrl+Q", "File|Quit")));
44 QObject::connect(act_quit, SIGNAL(triggered()), this, SLOT(close()));
46 // menus
47 QMenu *mfile = menuBar()->addMenu("&File");
48 mfile->addAction(act_open);
49 mfile->addAction(act_quit);
51 // toolbars
52 QToolBar *tfile = addToolBar("&File");
53 tfile->addAction(act_open);
55 statusBar();
56 show();
57 }
59 void MainWindow::open_volume()
60 {
61 QString fname = QFileDialog::getOpenFileName(this, "Open volume dataset", QString(), "Volume descriptors (*.vol)");
62 if(!fname.isNull()) {
63 Volume *vol = new Volume;
65 if(vol->load(qPrintable(fname))) {
66 delete volume;
67 volume = vol;
68 volray_setvolume(vol);
69 post_redisplay();
70 } else {
71 delete vol;
72 }
73 }
74 }
77 SideWindow::SideWindow()
78 {
79 QGroupBox *group_slice = new QGroupBox("Volume slice");
80 {
81 slice_view = new SliceGLView(glwlist[0]);
82 glwlist.push_back(slice_view);
84 QCheckBox *chk_clip = new QCheckBox("clip");
85 chk_clip->setStatusTip("Enable clipping at the current slice");
86 chk_clip->setChecked(false);
87 connect(chk_clip, SIGNAL(stateChanged(int)), this, SLOT(clip_change(int)));
89 QSlider *zslider = new QSlider(Qt::Horizontal);
90 zslider->setStatusTip("Change current Z slice");
91 zslider->setRange(0, 256);
92 zslider->setValue(volray_getvalue(VolRayOpt::ZCURSOR) * 256.0);
93 connect(zslider, SIGNAL(valueChanged(int)), this, SLOT(zslider_change(int)));
95 QVBoxLayout *vbox = new QVBoxLayout;
96 vbox->addWidget(slice_view);
97 vbox->addWidget(chk_clip);
98 vbox->addWidget(zslider);
100 group_slice->setLayout(vbox);
101 }
103 QWidget *win = new QWidget;
104 setWidget(win);
106 QVBoxLayout *vbox = new QVBoxLayout;
107 vbox->addWidget(group_slice);
108 vbox->addStretch();
110 win->setLayout(vbox);
111 }
113 void SideWindow::zslider_change(int val)
114 {
115 volray_setvalue(VolRayOpt::ZCURSOR, (float)val / 256.0);
116 }
118 void SideWindow::clip_change(int checked)
119 {
120 volray_setvalue(VolRayOpt::ZCLIP, checked);
121 }
124 XFerWin::XFerWin()
125 {
126 QGroupBox *group_xfer = new QGroupBox("Transfer function");
127 {
128 XFerGLView *xfer_view = new XFerGLView(glwlist[0]);
129 glwlist.push_back(xfer_view);
131 QVBoxLayout *vbox = new QVBoxLayout;
132 vbox->addWidget(xfer_view);
134 group_xfer->setLayout(vbox);
135 }
137 QWidget *win = new QWidget;
138 setWidget(win);
140 QVBoxLayout *vbox = new QVBoxLayout;
141 vbox->addWidget(group_xfer);
142 vbox->addStretch();
144 win->setLayout(vbox);
145 }
148 void post_redisplay()
149 {
150 for(auto glw : glwlist) {
151 glw->updateGL();
152 }
153 }