2 * Definitions for Qt4 based control panel
5 #include "controlpanel.h"
7 #ifndef CONTROLPANEL_DISABLED
21 ControlPanel::ControlPanel(RunArgs & args, QWidget * p) : QMainWindow(p),
22 m_view(args.view), m_doc(args.doc), m_screen(args.screen), m_width(300), m_height(300),
23 m_state(ControlPanel::ABOUT), m_on_ok(NULL)
26 resize(m_width,m_height);
40 void ControlPanel::CreateLayout()
42 m_text_edit = new QTextEdit(this);
43 m_text_edit->setGeometry(10,35,m_width-20,m_height-100);
45 m_ok_button = new QPushButton("OK", this);
46 m_ok_button->setGeometry(10,35+m_height-90, m_width-20, 50);
47 connect(m_ok_button, SIGNAL(clicked()), this, SLOT(PressOK()));
50 QMenu * ControlPanel::CreateMainMenu()
52 QMenu * main = menuBar()->addMenu("&Main");
54 QAction * about = new QAction("&About", this);
55 main->addAction(about);
56 connect(about, SIGNAL(triggered()), this, SLOT(StateAbout()));
60 QAction * quit = new QAction("&Quit", this);
61 main->addAction(quit);
62 connect(quit, SIGNAL(triggered()), qApp, SLOT(quit()));
66 QMenu * ControlPanel::CreateDocumentMenu()
68 QMenu * document = menuBar()->addMenu("&Document");
70 m_document_set_font = new QAction("&Set Insertion Font", this);
71 document->addAction(m_document_set_font);
72 connect(m_document_set_font, SIGNAL(triggered()), this, SLOT(SetDocumentFont()));
74 m_document_insert_text = new QAction("&Insert Text", this);
75 document->addAction(m_document_insert_text);
76 connect(m_document_insert_text, SIGNAL(triggered()), this, SLOT(StateInsertText()));
78 m_document_load_svg = new QAction("&Load SVG From File", this);
79 document->addAction(m_document_load_svg);
80 connect(m_document_load_svg, SIGNAL(triggered()), this, SLOT(LoadSVGIntoDocument()));
82 m_document_parse_svg = new QAction("&Input SVG Manually", this);
83 document->addAction(m_document_parse_svg);
84 connect(m_document_parse_svg, SIGNAL(triggered()), this, SLOT(StateParseSVG()));
90 QMenu * ControlPanel::CreateViewMenu()
92 QMenu * view = menuBar()->addMenu("&View");
94 m_view_set_bounds = new QAction("&Set bounds", this);
95 view->addAction(m_view_set_bounds);
96 connect(m_view_set_bounds, SIGNAL(triggered()), this, SLOT(SetViewBounds()));
98 m_view_show_bezier_bounds = new QAction("&Show Bezier Bounds", this);
99 m_view_show_bezier_bounds->setCheckable(true);
100 view->addAction(m_view_show_bezier_bounds);
101 connect(m_view_show_bezier_bounds, SIGNAL(triggered()), this, SLOT(ToggleShowBezierBounds()));
103 m_view_show_bezier_type = new QAction("&Show Bezier Type", this);
104 m_view_show_bezier_type->setCheckable(true);
105 view->addAction(m_view_show_bezier_type);
106 connect(m_view_show_bezier_type, SIGNAL(triggered()), this, SLOT(ToggleShowBezierType()));
108 m_view_show_fill_bounds = new QAction("&Show Fill Bounds", this);
109 m_view_show_fill_bounds->setCheckable(true);
110 view->addAction(m_view_show_fill_bounds);
111 connect(m_view_show_fill_bounds, SIGNAL(triggered()), this, SLOT(ToggleShowFillBounds()));
113 m_view_show_fill_points = new QAction("&Show Fill Points", this);
114 m_view_show_fill_points->setCheckable(true);
115 view->addAction(m_view_show_fill_points);
116 connect(m_view_show_fill_bounds, SIGNAL(triggered()), this, SLOT(ToggleShowFillPoints()));
118 m_view_enable_shading = new QAction("&Enable Shading", this);
119 m_view_enable_shading->setCheckable(true);
120 view->addAction(m_view_enable_shading);
121 connect(m_view_enable_shading, SIGNAL(triggered()), this, SLOT(ToggleEnableShading()));
128 QMenu * ControlPanel::CreateScreenMenu()
130 QMenu * screen = menuBar()->addMenu("&Screen");
132 m_screen_gpu_rendering = new QAction("&GPU Rendering", this);
133 m_screen_gpu_rendering->setCheckable(true);
134 m_screen_gpu_rendering->setToolTip("Uses the GPU for Rendering");
136 m_screen_cpu_rendering = new QAction("&CPU Rendering", this);
137 m_screen_cpu_rendering->setCheckable(true);
138 m_screen_gpu_rendering->setToolTip("Uses the CPU for Rendering");
140 m_screen_lazy_rendering = new QAction("&Lazy Rendering", this);
141 m_screen_lazy_rendering->setCheckable(true);
143 screen->addAction(m_screen_gpu_rendering);
144 screen->addAction(m_screen_cpu_rendering);
146 screen->addAction(m_screen_lazy_rendering);
147 connect(m_screen_lazy_rendering, SIGNAL(triggered()), this, SLOT(ToggleLazyRendering()));
149 connect(m_screen_gpu_rendering, SIGNAL(triggered()), this, SLOT(SetGPURendering()));
150 connect(m_screen_cpu_rendering, SIGNAL(triggered()), this, SLOT(SetCPURendering()));
152 m_screen_show_debug = new QAction("&Print Debug Info", this);
153 m_screen_show_debug->setCheckable(true);
155 screen->addAction(m_screen_show_debug);
156 connect(m_screen_show_debug, SIGNAL(triggered()), this, SLOT(ToggleScreenDebugFont()));
161 void ControlPanel::paintEvent(QPaintEvent * e)
167 void ControlPanel::ChangeState(State next_state)
169 m_state = next_state;
174 void ControlPanel::UpdateAll()
176 bool using_gpu_rendering = m_view.UsingGPURendering();
177 m_screen_gpu_rendering->setChecked(using_gpu_rendering);
178 m_screen_cpu_rendering->setChecked(!using_gpu_rendering);
179 m_screen_show_debug->setChecked(m_screen.DebugFontShown());
180 m_screen_lazy_rendering->setChecked(m_view.UsingLazyRendering());
182 m_view_show_bezier_bounds->setChecked(m_view.ShowingBezierBounds());
183 m_view_show_bezier_type->setChecked(m_view.ShowingBezierType());
184 m_view_show_fill_bounds->setChecked(m_view.ShowingFillBounds());
185 m_view_show_fill_points->setChecked(m_view.ShowingFillPoints());
186 m_view_enable_shading->setChecked(m_view.PerformingShading());
189 // update things based on state
191 const char * tooltip;
195 title = "Insert Text";
196 tooltip = "Type text to insert, press OK, simple.";
199 m_on_ok = &ControlPanel::InsertTextIntoDocument;
200 if (m_text_edit->toPlainText() == "")
201 m_text_edit->setText("The quick brown\nfox jumps over\nthe lazy dog.");
205 tooltip = "Enter valid SVG and press OK to insert.";
208 m_on_ok = &ControlPanel::InsertSVGIntoDocument;
209 if (m_text_edit->toPlainText() == "")
210 m_text_edit->setText("<svg width=\"104\" height=\"186\">\n<path d = \"m 57,185\n\t c 0,0 57,-13 32,-43\n\t -25,-30 -53,2 -25, -30\n\t 28,-32 52,17 28,-32\n\t -24,-50 -16,44 -35,12\n\t-19,-32 13,-64 13,-64\n\t 0,0 40,-50 -0,-14\n\t -40,36 -94,68 -59,109\n\t 35,41 45,62 45,62 z\"/>\n</svg>");
215 title = "IPDF Control Panel";
216 tooltip = "This is the IPDF Control Panel\nDo you feel in control?";
224 setWindowTitle(title);
229 void ControlPanel::ToggleShowBezierBounds()
231 bool state = m_view.ShowingBezierBounds();
232 m_view.ShowBezierBounds(!state);
235 void ControlPanel::ToggleShowBezierType()
237 bool state = m_view.ShowingBezierType();
238 m_view.ShowBezierType(!state);
241 void ControlPanel::ToggleShowFillBounds()
243 bool state = m_view.ShowingFillBounds();
244 m_view.ShowFillBounds(!state);
248 void ControlPanel::ToggleShowFillPoints()
250 bool state = m_view.ShowingFillPoints();
251 m_view.ShowFillPoints(!state);
255 void ControlPanel::ToggleEnableShading()
257 bool state = m_view.PerformingShading();
258 m_view.PerformShading(!state);
262 void ControlPanel::SetGPURendering()
264 m_view.SetGPURendering(true);
268 void ControlPanel::SetCPURendering()
270 m_view.SetGPURendering(false);
274 void ControlPanel::ToggleLazyRendering()
276 bool state = m_view.UsingLazyRendering();
277 m_view.SetLazyRendering(!state);
281 void ControlPanel::ToggleScreenDebugFont()
283 bool state = m_screen.DebugFontShown();
284 m_screen.ShowDebugFont(!state);
289 void ControlPanel::SetViewBounds()
292 Real xx = QInputDialog::getDouble(this, "View X Coordinate", "Enter X coordinate:", 0, -2e-30, 2e30,30,&ok);
294 Real yy = QInputDialog::getDouble(this, "View Y Coordinate", "Enter Y coordinate:", 0, -2e-30, 2e30,30,&ok);
296 Real w = QInputDialog::getDouble(this, "View Width", "Enter Width:", 1, -2e-30, 2e30,30,&ok);
298 Real h = QInputDialog::getDouble(this, "View Height", "Enter Height:", 1, -2e-30, 2e30,30,&ok);
299 m_view.SetBounds(Rect(xx,yy,w,h));
303 void ControlPanel::InsertTextIntoDocument()
305 const Rect & bounds = m_view.GetBounds();
307 Real yy = bounds.y + bounds.h/Real(2);
309 string msg = m_text_edit->toPlainText().toStdString();
310 Real scale = bounds.h / Real(2);
311 Debug("Insert \"%s\" at %f, %f, scale %f", msg.c_str(), Float(xx), Float(yy), Float(scale));
312 #ifndef QUADTREE_DISABLED
313 m_doc.SetQuadtreeInsertNode(m_view.GetCurrentQuadtreeNode());
315 m_doc.AddText(msg, scale, xx, yy);
316 #ifndef QUADTREE_DISABLED
317 m_doc.PropagateQuadChanges(m_view.GetCurrentQuadtreeNode());
319 m_view.ForceRenderDirty();
320 m_view.ForceBufferDirty();
321 m_view.ForceBoundsDirty();
323 void ControlPanel::InsertSVGIntoDocument()
325 Rect bounds(m_view.GetBounds());
326 bounds.x += bounds.w/Real(2);
327 bounds.y += bounds.h/Real(2);
329 bounds.w /= Real(m_screen.ViewportWidth());
330 bounds.h /= Real(m_screen.ViewportHeight());
332 #ifndef QUADTREE_DISABLED
333 m_doc.SetQuadtreeInsertNode(m_view.GetCurrentQuadtreeNode());
335 m_doc.ParseSVG(m_text_edit->toPlainText().toStdString(), bounds);
336 #ifndef QUADTREE_DISABLED
337 m_doc.PropagateQuadChanges(m_view.GetCurrentQuadtreeNode());
339 m_view.ForceRenderDirty();
340 m_view.ForceBufferDirty();
341 m_view.ForceBoundsDirty();
344 void ControlPanel::LoadSVGIntoDocument()
347 QString filename = QFileDialog::getOpenFileName(this, "Open SVG", "svg-tests", "Image Files (*.svg)");
351 #ifdef TRANSFORM_OBJECTS_NOT_VIEW
352 Rect bounds(0,0,1,1);
354 Rect bounds(m_view.GetBounds());
356 bounds.x += bounds.w/Real(2);
357 bounds.y += bounds.h/Real(2);
359 bounds.w /= Real(m_screen.ViewportWidth());
360 bounds.h /= Real(m_screen.ViewportHeight());
362 #ifndef QUADTREE_DISABLED
363 m_doc.SetQuadtreeInsertNode(m_view.GetCurrentQuadtreeNode());
365 m_doc.LoadSVG(filename.toStdString(), bounds);
366 #ifndef QUADTREE_DISABLED
367 m_doc.PropagateQuadChanges(m_view.GetCurrentQuadtreeNode());
369 m_view.ForceRenderDirty();
370 m_view.ForceBufferDirty();
371 m_view.ForceBoundsDirty();
374 void ControlPanel::SetDocumentFont()
376 QString filename = QFileDialog::getOpenFileName(this, "Set Font", "fonts", "True Type Fonts (*.ttf)");
378 m_doc.SetFont(filename.toStdString());
381 ControlPanel * ControlPanel::g_panel = NULL;
383 int ControlPanel::Run(void * args)
385 ControlPanel::RunArgs * a = (ControlPanel::RunArgs*)args;
386 QApplication app(a->argc, a->argv);
387 g_panel = new ControlPanel(*a);
389 int result = app.exec();
390 a->screen.RequestQuit();
398 #endif //CONTROLPANEL_ENABLED