void EditorWindow::createActions() { openAct = new QAction(tr("&Open"), this); openAct->setShortcut(QKeySequence::Open); connect(openAct, SIGNAL(triggered()), this, SLOT(openImage())); saveAct = new QAction(tr("&Save"), this); saveAct->setShortcut(QKeySequence::Save); connect(saveAct, SIGNAL(triggered()), this, SLOT(saveImage())); saveAsAct = new QAction(tr("Save As"), this); saveAsAct->setShortcut(QKeySequence::SaveAs); connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveImageAs())); quitAct = new QAction(tr("Quit"), this); quitAct->setShortcut(QKeySequence::Quit); connect(quitAct, SIGNAL(triggered()), this, SLOT(close())); zoomInAct = new QAction(tr("Zoom In"), this); zoomInAct->setShortcut(QKeySequence::ZoomIn); connect(zoomInAct, SIGNAL(triggered()), imageWidget, SLOT(zoomIn())); zoomOutAct = new QAction(tr("Zoom Out"), this); zoomOutAct->setShortcut(QKeySequence::ZoomOut); connect(zoomOutAct, SIGNAL(triggered()), imageWidget, SLOT(zoomOut())); connect(imageWidget, SIGNAL(zoomOutAvailableChanged(bool)), zoomOutAct, SLOT(setEnabled(bool))); zoomOriginalAct = new QAction(tr("Actual Size"), this); connect(zoomOriginalAct, SIGNAL(triggered()), imageWidget, SLOT(zoomOriginal())); zoomByWheelAct = new QAction(tr("Zoom by Mouse Wheel"), this); zoomByWheelAct->setCheckable(true); zoomByWheelAct->setChecked(false); connect(zoomByWheelAct, SIGNAL(toggled(bool)), imageWidget, SLOT(setWheelZoom(bool))); autoContrastAct = new QAction(tr("Auto Contrast"), this); autoContrastAct->setToolTip(tr("Apply luminance histogram stretching")); connect(autoContrastAct, SIGNAL(triggered()), this, SLOT(doAutoContrast())); autoLevelsAct = new QAction(tr("Auto Levels"), this); autoLevelsAct->setToolTip(tr("Apply channel-wise RGB histogram stretching")); connect(autoLevelsAct, SIGNAL(triggered()), this, SLOT(doAutoLevels())); whiteBalanceAct = new QAction(tr("Correct White Balance"), this); whiteBalanceAct->setToolTip(tr("Apply white balance correction using greyworld model")); connect(whiteBalanceAct, SIGNAL(triggered()), this, SLOT(doWhiteBalance())); geometryAct = new QAction(tr("Scale/Rotate"), this); geometryAct->setToolTip(tr("Scale and rotate image relative to the center")); connect(geometryAct, SIGNAL(triggered()), this, SLOT(doGeometryTransform())); filterAct = new QAction(tr("Filters && Effects"), this); filterAct->setToolTip(tr("Open filtration dialog")); connect(filterAct, SIGNAL(triggered()), this, SLOT(doFilter())); convolutionAct = new QAction(tr("Convolution"), this); convolutionAct->setToolTip(tr("Apply convolution with arbitrary kernel")); connect(convolutionAct, SIGNAL(triggered()), this, SLOT(doConvolution())); }
void ImageView::keyPressEvent(QKeyEvent *event) { const int key = event->key(); if (key == Qt::Key_Equal || key == Qt::Key_Plus) zoomIn(); else if (key == Qt::Key_Minus) zoomOut(); else if (event->nativeVirtualKey() == Qt::Key_H && event->modifiers() == Qt::ControlModifier) zoomOriginal(); QGraphicsView::keyPressEvent(event); }
void ImageView::zoomFit() { if (!m_image.isNull() && m_image.width() <= width() && m_image.height() <= height()) { zoomOriginal(); return; } fitInView(m_scene->sceneRect(), Qt::KeepAspectRatio); m_scaleFactor = transform().m11(); queueGenerateCache(); }
void ImageView::zoomFit() { if(!image_.isNull()) { // if the image is smaller than our view, use its original size // instead of scaling it up. if(image_.width() <= width() && image_.height() <= height()) { zoomOriginal(); return; } } fitInView(scene_->sceneRect(), Qt::KeepAspectRatio); scaleFactor_ = transform().m11(); queueGenerateCache(); }
void MainWindow::createActions() { // File menu m_newDocumentAction = new QAction(QIcon::fromTheme("document-new"), tr("&New"), this); m_newDocumentAction->setShortcut(QKeySequence::New); connect(m_newDocumentAction, SIGNAL(triggered()), this, SLOT(newDocument())); m_openDocumentAction = new QAction(QIcon::fromTheme("document-open"), tr("&Open"), this); m_openDocumentAction->setShortcuts(QKeySequence::Open); connect(m_openDocumentAction, SIGNAL(triggered()), this, SLOT(onOpenDocumentActionTriggered())); m_saveDocumentAction = new QAction(QIcon::fromTheme("document-save"), tr("&Save"), this); m_saveDocumentAction->setShortcuts(QKeySequence::Save); connect(m_saveDocumentAction, SIGNAL(triggered()), this, SLOT(onSaveActionTriggered())); m_saveAsDocumentAction = new QAction(QIcon::fromTheme("document-save-as"), tr("Save As..."), this); m_saveAsDocumentAction->setShortcuts(QKeySequence::SaveAs); connect(m_saveAsDocumentAction, SIGNAL(triggered()), this, SLOT(onSaveAsActionTriggered())); m_exportImageAction = new QAction(EXPORT_TO_MENU_FORMAT_STRING.arg(""), this); m_exportImageAction->setShortcut(Qt::CTRL + Qt::Key_E); connect(m_exportImageAction, SIGNAL(triggered()), this, SLOT(onExportImageActionTriggered())); m_exportAsImageAction = new QAction(tr("Export as ..."), this); m_exportAsImageAction->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_E); connect(m_exportAsImageAction, SIGNAL(triggered()), this, SLOT(onExportAsImageActionTriggered())); m_quitAction = new QAction(QIcon::fromTheme("application-exit"), tr("&Quit"), this); m_quitAction->setShortcuts(QKeySequence::Quit); // m_quitAction->setShortcut(Qt::CTRL + Qt::Key_Q); m_quitAction->setStatusTip(tr("Quit the application")); connect(m_quitAction, SIGNAL(triggered()), this, SLOT(close())); // Edit menu m_undoAction = new QAction(QIcon::fromTheme("edit-undo"), tr("&Undo"), this); m_undoAction->setShortcuts(QKeySequence::Undo); connect(m_undoAction, SIGNAL(triggered()), this, SLOT(undo())); m_redoAction = new QAction(QIcon::fromTheme("edit-redo"), tr("&Redo"), this); m_redoAction->setShortcuts(QKeySequence::Redo); connect(m_redoAction, SIGNAL(triggered()), this, SLOT(redo())); m_copyImageAction = new QAction(QIcon::fromTheme("copy"), tr("&Copy Image"), this); m_copyImageAction->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_C) << QKeySequence::Copy ); connect(m_copyImageAction, SIGNAL(triggered()), this, SLOT(copyImage()) ); // Tools menu m_pngPreviewAction = new QAction(tr("PNG"), this); m_pngPreviewAction->setCheckable(true); m_pngPreviewAction->setStatusTip(tr("Tell PlantUML to produce PNG output")); connect(m_pngPreviewAction, SIGNAL(toggled(bool)), this, SLOT(changeImageFormat())); m_svgPreviewAction = new QAction(tr("SVG"), this); m_svgPreviewAction->setCheckable(true); m_svgPreviewAction->setStatusTip(tr("Tell PlantUML to produce SVG output")); connect(m_svgPreviewAction, SIGNAL(toggled(bool)), this, SLOT(changeImageFormat())); QActionGroup* output_action_group = new QActionGroup(this); output_action_group->setExclusive(true); output_action_group->addAction(m_pngPreviewAction); output_action_group->addAction(m_svgPreviewAction); m_svgPreviewAction->setChecked(true); m_refreshAction = new QAction(QIcon::fromTheme("view-refresh"), tr("Refresh"), this); m_refreshAction->setShortcuts(QKeySequence::Refresh); m_refreshAction->setStatusTip(tr("Call PlantUML to regenerate the UML image")); connect(m_refreshAction, SIGNAL(triggered()), this, SLOT(onRefreshActionTriggered())); m_autoRefreshAction = new QAction(tr("Auto-Refresh"), this); m_autoRefreshAction->setCheckable(true); m_autoSaveImageAction = new QAction(tr("Auto-Save image"), this); m_autoSaveImageAction->setCheckable(true); connect(m_autoRefreshAction, SIGNAL(toggled(bool)), this, SLOT(onAutoRefreshActionToggled(bool))); // Settings menu m_showMainToolbarAction = new QAction(tr("Show toolbar"), this); m_showMainToolbarAction->setCheckable(true); m_showStatusBarAction = new QAction(tr("Show statusbar"), this); m_showStatusBarAction->setCheckable(true); m_preferencesAction = new QAction(QIcon::fromTheme("preferences-other"), tr("Preferences"), this); connect(m_preferencesAction, SIGNAL(triggered()), this, SLOT(onPreferencesActionTriggered())); // Help menu m_aboutAction = new QAction(QIcon::fromTheme("help-about"), tr("&About"), this); m_aboutAction->setStatusTip(tr("Show the application's About box")); connect(m_aboutAction, SIGNAL(triggered()), this, SLOT(about())); m_aboutQtAction = new QAction(tr("About &Qt"), this); m_aboutQtAction->setStatusTip(tr("Show the Qt library's About box")); connect(m_aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt())); // focus actions QAction* focus_action = new QAction(this); focus_action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_0)); connect(focus_action, SIGNAL(triggered()), m_editor, SLOT(setFocus())); this->addAction(focus_action); focus_action = new QAction(this); focus_action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_1)); connect(focus_action, SIGNAL(triggered()), this, SLOT(onAssistantFocus())); this->addAction(focus_action); // assistant actions QAction* navigation_action = new QAction(this); navigation_action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Down)); connect(navigation_action, SIGNAL(triggered()), this, SLOT(onNextAssistant())); addAction(navigation_action); navigation_action = new QAction(this); navigation_action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Up)); connect(navigation_action, SIGNAL(triggered()), this, SLOT(onPrevAssistant())); addAction(navigation_action); // zoom action m_zoomInAction = new QAction(QIcon::fromTheme("zoom-in"), tr("Zoom In"), this); connect(m_zoomInAction, SIGNAL(triggered()), m_imageWidget, SLOT(zoomIn())); m_zoomOutAction = new QAction(QIcon::fromTheme("zoom-out"), tr("Zoom Out"), this); connect(m_zoomOutAction, SIGNAL(triggered()), m_imageWidget, SLOT(zoomOut())); m_zoomOriginalAction = new QAction(QIcon::fromTheme("zoom-original"), tr("1:1"), this); connect(m_zoomOriginalAction, SIGNAL(triggered()), m_imageWidget, SLOT(zoomOriginal())); }
PFSViewMainWin::PFSViewMainWin( float window_min, float window_max ): QMainWindow( 0 ) { currentFrame = frameList.end(); QScrollArea *pfsViewArea = new PFSViewWidgetArea( this ); pfsView = (PFSViewWidget*)pfsViewArea->widget(); setCentralWidget( pfsViewArea ); setWindowIcon( QIcon( ":icons/appicon.png" ) ); QAction *nextFrameAct = new QAction( tr( "&Next frame" ), this ); nextFrameAct->setStatusTip( tr( "Load next frame" ) ); nextFrameAct->setShortcut( Qt::Key_PageDown ); connect( nextFrameAct, SIGNAL(triggered()), this, SLOT(gotoNextFrame()) ); QAction *previousFrameAct = new QAction( tr( "&Previous frame" ), this ); previousFrameAct->setStatusTip( tr( "Load previous frame" ) ); previousFrameAct->setShortcut( Qt::Key_PageUp ); connect( previousFrameAct, SIGNAL(triggered()), this, SLOT(gotoPreviousFrame()) ); QToolBar *toolBar = addToolBar( tr( "Navigation" ) ); // toolBar->setHorizontalStretchable( true ); QToolButton *previousFrameBt = new QToolButton( toolBar ); previousFrameBt->setArrowType( Qt::LeftArrow ); previousFrameBt->setMinimumWidth( 15 ); connect( previousFrameBt, SIGNAL(clicked()), this, SLOT(gotoPreviousFrame()) ); previousFrameBt->setToolTip( "Goto previous frame" ); toolBar->addWidget( previousFrameBt ); QToolButton *nextFrameBt = new QToolButton( toolBar ); nextFrameBt->setArrowType( Qt::RightArrow ); nextFrameBt->setMinimumWidth( 15 ); connect( nextFrameBt, SIGNAL(clicked()), this, SLOT(gotoNextFrame()) ); nextFrameBt->setToolTip( "Goto next frame" ); toolBar->addWidget( nextFrameBt ); QLabel *channelSelLabel = new QLabel( "&Channel", toolBar ); channelSelection = new QComboBox( toolBar ); channelSelLabel->setBuddy( channelSelection ); connect( channelSelection, SIGNAL( activated( int ) ), this, SLOT( setChannelSelection(int) ) ); toolBar->addWidget( channelSelLabel ); toolBar->addWidget( channelSelection ); toolBar->addSeparator(); QLabel *mappingMethodLabel = new QLabel( "&Mapping", toolBar ); mappingMethodLabel->setAlignment( Qt::AlignRight | Qt::AlignVCenter ); // | // Qt::TextExpandTabs | Qt::TextShowMnemonic ); mappingMethodCB = new QComboBox( toolBar ); mappingMethodLabel->setBuddy( mappingMethodCB ); mappingMethodCB->addItem( "Linear" ); mappingMethodCB->addItem( "Gamma 1.4" ); mappingMethodCB->addItem( "Gamma 1.8" ); mappingMethodCB->addItem( "Gamma 2.2" ); mappingMethodCB->addItem( "Gamma 2.6" ); mappingMethodCB->addItem( "Logarithmic" ); mappingMethodCB->setCurrentIndex( 3 ); connect( mappingMethodCB, SIGNAL( activated( int ) ), this, SLOT( setLumMappingMethod(int) ) ); toolBar->addWidget( mappingMethodLabel ); toolBar->addWidget( mappingMethodCB ); // addToolBar( Qt::BottomToolBarArea, toolBar ); QToolBar *toolBarLR = addToolBar( tr( "Histogram" ) ); lumRange = new LuminanceRangeWidget( toolBarLR ); connect( lumRange, SIGNAL( updateRangeWindow() ), this, SLOT( updateRangeWindow() ) ); toolBarLR->addWidget( lumRange ); // addToolBar( toolBar ); pointerPosAndVal = new QLabel( statusBar() ); statusBar()->addWidget( pointerPosAndVal ); // QFont fixedFont = QFont::defaultFont(); // fixedFont.setFixedPitch( true ); // pointerPosAndVal->setFont( fixedFont ); zoomValue = new QLabel( statusBar() ); statusBar()->addWidget( zoomValue ); exposureValue = new QLabel( statusBar() ); statusBar()->addWidget( exposureValue ); connect( pfsView, SIGNAL(updatePointerValue()), this, SLOT(updatePointerValue()) ); QMenu *frameMenu = menuBar()->addMenu( tr( "&Frame" ) ); frameMenu->addAction( nextFrameAct ); frameMenu->addAction( previousFrameAct ); frameMenu->addSeparator(); frameMenu->addAction( "&Save image...", this, SLOT(saveImage()), QKeySequence::Save ); frameMenu->addAction( "&Copy image to clipboard", this, SLOT(copyImage()), QKeySequence::Copy ); frameMenu->addSeparator(); frameMenu->addAction( "&Quit", qApp, SLOT(quit()), Qt::Key_Q ); //QKeySequence::Quit QShortcut *shortcut = new QShortcut( QKeySequence::Close, this ); connect( shortcut, SIGNAL(activated()), qApp, SLOT(quit()) ); QAction *act; QMenu *viewMenu = menuBar()->addMenu( tr( "&View" ) ); act = viewMenu->addAction( "&Zoom in", pfsView, SLOT(zoomIn()), Qt::Key_Period ); // QKeySequence::ZoomIn -- not doing it -- silly binding under Linux connect( act, SIGNAL(triggered()), this, SLOT(updateZoomValue()) ); act = viewMenu->addAction( "Zoom &out", pfsView, SLOT(zoomOut()), Qt::Key_Comma ); connect( act, SIGNAL(triggered()), this, SLOT(updateZoomValue()) ); act = viewMenu->addAction( "Zoom &1:1", pfsView, SLOT(zoomOriginal()), Qt::Key_N ); connect( act, SIGNAL(triggered()), this, SLOT(updateZoomValue()) ); viewMenu->addAction( "&Fit window to content", this, SLOT(updateViewSize()), Qt::Key_C ); viewMenu->addSeparator(); QMenu *infnanMenu = viewMenu->addMenu( "NaN and &Inf values" ); QActionGroup *infnanActGrp = new QActionGroup( this ); infnanActGrp->setExclusive( true ); QAction *infnanHideAct = new QAction( tr( "&Hide" ), this ); infnanHideAct->setCheckable(true); infnanHideAct->setData(0); infnanActGrp->addAction( infnanHideAct ); infnanMenu->addAction( infnanHideAct ); QAction *infnanMarkAct = new QAction( tr( "Mark with &red color" ), this ); infnanMarkAct->setCheckable(true); infnanMarkAct->setData(1); infnanActGrp->addAction( infnanMarkAct ); infnanMenu->addAction( infnanMarkAct ); infnanMarkAct->setChecked( true ); connect( infnanActGrp, SIGNAL(triggered(QAction*)), pfsView, SLOT(setInfNaNTreatment(QAction*)) ); QMenu *colorClipMenu = viewMenu->addMenu( "&Color clipping" ); QActionGroup *colorClipActGrp = new QActionGroup( this ); colorClipActGrp->setExclusive( true ); QAction *colorClipSimpleAct = new QAction( tr( "&Simple clipping" ), this ); colorClipSimpleAct->setCheckable(true); colorClipSimpleAct->setData(CLIP_SIMPLE); colorClipSimpleAct->setShortcut( Qt::CTRL + Qt::Key_H ); colorClipActGrp->addAction( colorClipSimpleAct ); colorClipMenu->addAction( colorClipSimpleAct ); QAction *colorClipCodedAct = new QAction( tr( "&Color-coded clipping" ), this ); colorClipCodedAct->setCheckable(true); colorClipCodedAct->setShortcut( Qt::CTRL + Qt::Key_J ); colorClipCodedAct->setData(CLIP_COLORCODED); colorClipActGrp->addAction( colorClipCodedAct ); colorClipMenu->addAction( colorClipCodedAct ); QAction *colorClipBriHueAct = new QAction( tr( "&Keep brightness and hue" ), this ); colorClipBriHueAct->setCheckable(true); colorClipBriHueAct->setShortcut( Qt::CTRL + Qt::Key_K ); colorClipBriHueAct->setData(CLIP_KEEP_BRI_HUE); colorClipActGrp->addAction( colorClipBriHueAct ); colorClipMenu->addAction( colorClipBriHueAct ); colorClipSimpleAct->setChecked( true ); connect( colorClipActGrp, SIGNAL(triggered(QAction*)), pfsView, SLOT(setRGBClippingMethod(QAction*)) ); QMenu *negativeMenu = viewMenu->addMenu( "&Negative values" ); QActionGroup *negativeActGrp = new QActionGroup( this ); negativeActGrp->setExclusive( true ); act = new QAction( tr( "&Black" ), this ); act->setCheckable(true); act->setData(NEGATIVE_BLACK); act->setShortcut( Qt::ALT + Qt::Key_B ); negativeActGrp->addAction( act ); negativeMenu->addAction( act ); act->setChecked( true ); act = new QAction( tr( "Mark with &red color" ), this ); act->setCheckable(true); act->setData(NEGATIVE_MARK_AS_RED); act->setShortcut( Qt::ALT + Qt::Key_R ); negativeActGrp->addAction( act ); negativeMenu->addAction( act ); act = new QAction( tr( "Use &green color scale" ), this ); act->setCheckable(true); act->setData(NEGATIVE_GREEN_SCALE); act->setShortcut( Qt::ALT + Qt::Key_G ); negativeActGrp->addAction( act ); negativeMenu->addAction( act ); act = new QAction( tr( "Use &absolute values" ), this ); act->setCheckable(true); act->setData(NEGATIVE_ABSOLUTE); act->setShortcut( Qt::ALT + Qt::Key_A ); negativeActGrp->addAction( act ); negativeMenu->addAction( act ); connect( negativeActGrp, SIGNAL(triggered(QAction*)), pfsView, SLOT(setNegativeTreatment(QAction*)) ); viewMenu->addSeparator(); QMenu *colorCoordMenu = viewMenu->addMenu( "Color coo&rdinates" ); QActionGroup *colorCoordActGrp = new QActionGroup( this ); colorCoordActGrp->setExclusive( true ); act = new QAction( tr( "&RGB" ), this ); act->setCheckable(true); act->setData(CC_RGB); act->setShortcut( Qt::SHIFT + Qt::ALT + Qt::Key_R ); colorCoordActGrp->addAction( act ); colorCoordMenu->addAction( act ); act->setChecked( true ); act = new QAction( tr( "&XYZ" ), this ); act->setCheckable(true); act->setData(CC_XYZ); act->setShortcut( Qt::SHIFT + Qt::ALT + Qt::Key_X ); colorCoordActGrp->addAction( act ); colorCoordMenu->addAction( act ); act = new QAction( tr( "Y&u'v'" ), this ); act->setCheckable(true); act->setData(CC_Yupvp); act->setShortcut( Qt::SHIFT + Qt::ALT + Qt::Key_U ); colorCoordActGrp->addAction( act ); colorCoordMenu->addAction( act ); act = new QAction( tr( "Yx&y" ), this ); act->setCheckable(true); act->setData(CC_Yxy); act->setShortcut( Qt::SHIFT + Qt::ALT + Qt::Key_Y ); colorCoordActGrp->addAction( act ); colorCoordMenu->addAction( act ); connect( colorCoordActGrp, SIGNAL(triggered(QAction*)), this, SLOT(setColorCoord(QAction*)) ); QMenu *mappingMenu = menuBar()->addMenu( tr( "&Tone mapping" ) ); mappingMenu->addAction( "Increase exposure", lumRange, SLOT(increaseExposure()), Qt::Key_Minus ); mappingMenu->addAction( "Decrease exposure", lumRange, SLOT(decreaseExposure()), Qt::Key_Equal ); mappingMenu->addAction( "Extend dynamic range", lumRange, SLOT(extendRange()), Qt::Key_BracketRight ); mappingMenu->addAction( "Shrink dynamic range", lumRange, SLOT(shrinkRange()), Qt::Key_BracketLeft ); mappingMenu->addAction( "Fit to dynamic range", lumRange, SLOT(fitToDynamicRange()), Qt::Key_Backslash ); mappingMenu->addAction( "Low dynamic range", lumRange, SLOT(lowDynamicRange()), Qt::ALT + Qt::Key_L ); QMenu *mapfuncMenu = mappingMenu->addMenu( "&Mapping function" ); QActionGroup *mapfuncActGrp = new QActionGroup( this ); mapfuncActGrp->setExclusive( true ); mappingAct[0] = act = new QAction( tr( "&Linear" ), this ); act->setCheckable(true); act->setData(0); act->setShortcut( Qt::Key_L ); mapfuncActGrp->addAction( act ); mapfuncMenu->addAction( act ); mappingAct[1] = act = new QAction( tr( "Gamma 1.&4" ), this ); act->setCheckable(true); act->setData(1); act->setShortcut( Qt::Key_1 ); mapfuncActGrp->addAction( act ); mapfuncMenu->addAction( act ); mappingAct[2] = act = new QAction( tr( "Gamma 1.&8" ), this ); act->setCheckable(true); act->setData(2); act->setShortcut( Qt::Key_2 ); mapfuncActGrp->addAction( act ); mapfuncMenu->addAction( act ); mappingAct[3] = act = new QAction( tr( "Gamma 2.&2" ), this ); act->setCheckable(true); act->setData(3); act->setChecked( true ); act->setShortcut( Qt::Key_3 ); mapfuncActGrp->addAction( act ); mapfuncMenu->addAction( act ); mappingAct[4] = act = new QAction( tr( "Gamma 2.&6" ), this ); act->setCheckable(true); act->setData(4); act->setShortcut( Qt::Key_4 ); mapfuncActGrp->addAction( act ); mapfuncMenu->addAction( act ); mappingAct[5] = act = new QAction( tr( "L&ogarithmic" ), this ); act->setCheckable(true); act->setData(5); act->setShortcut( Qt::Key_O ); mapfuncActGrp->addAction( act ); mapfuncMenu->addAction( act ); connect( mapfuncActGrp, SIGNAL(triggered(QAction*)), this, SLOT(setLumMappingMethod(QAction*)) ); QMenu *helpMenu = menuBar()->addMenu( tr( "&Help" ) ); helpMenu->addAction( "&About", this, SLOT(showAboutdialog()) ); colorCoord = CC_RGB; //Window should not be larger than desktop // TODO: how to find desktop size - gnome taksbars // setMaximumSize( QApplication::desktop()->width(), QApplication::desktop()->height() ); try { if( !readNextFrame() ) throw PFSViewException(); if( window_min < window_max ) lumRange->setRangeWindowMinMax( window_min, window_max ); } catch( pfs::Exception ex ) { QMessageBox::critical( this, "pfsview error", ex.getMessage() ); throw PFSViewException(); } }
BufferWidget::BufferWidget(QWidget *parent) : AbstractBufferContainer(parent), _chatViewSearchController(new ChatViewSearchController(this)), _autoMarkerLine(true) { ui.setupUi(this); layout()->setContentsMargins(0, 0, 0, 0); layout()->setSpacing(0); // ui.searchBar->hide(); _chatViewSearchController->setCaseSensitive(ui.searchBar->caseSensitiveBox()->isChecked()); _chatViewSearchController->setSearchSenders(ui.searchBar->searchSendersBox()->isChecked()); _chatViewSearchController->setSearchMsgs(ui.searchBar->searchMsgsBox()->isChecked()); _chatViewSearchController->setSearchOnlyRegularMsgs(ui.searchBar->searchOnlyRegularMsgsBox()->isChecked()); connect(ui.searchBar, SIGNAL(searchChanged(const QString &)), _chatViewSearchController, SLOT(setSearchString(const QString &))); connect(ui.searchBar->caseSensitiveBox(), SIGNAL(toggled(bool)), _chatViewSearchController, SLOT(setCaseSensitive(bool))); connect(ui.searchBar->searchSendersBox(), SIGNAL(toggled(bool)), _chatViewSearchController, SLOT(setSearchSenders(bool))); connect(ui.searchBar->searchMsgsBox(), SIGNAL(toggled(bool)), _chatViewSearchController, SLOT(setSearchMsgs(bool))); connect(ui.searchBar->searchOnlyRegularMsgsBox(), SIGNAL(toggled(bool)), _chatViewSearchController, SLOT(setSearchOnlyRegularMsgs(bool))); connect(ui.searchBar->searchUpButton(), SIGNAL(clicked()), _chatViewSearchController, SLOT(highlightPrev())); connect(ui.searchBar->searchDownButton(), SIGNAL(clicked()), _chatViewSearchController, SLOT(highlightNext())); connect(ui.searchBar, SIGNAL(hidden()), this, SLOT(setFocus())); connect(_chatViewSearchController, SIGNAL(newCurrentHighlight(QGraphicsItem *)), this, SLOT(scrollToHighlight(QGraphicsItem *))); ActionCollection *coll = QtUi::actionCollection(); Action *zoomInChatview = coll->add<Action>("ZoomInChatView", this, SLOT(zoomIn())); zoomInChatview->setText(tr("Zoom In")); zoomInChatview->setIcon(SmallIcon("zoom-in")); zoomInChatview->setShortcut(QKeySequence::ZoomIn); Action *zoomOutChatview = coll->add<Action>("ZoomOutChatView", this, SLOT(zoomOut())); zoomOutChatview->setIcon(SmallIcon("zoom-out")); zoomOutChatview->setText(tr("Zoom Out")); zoomOutChatview->setShortcut(QKeySequence::ZoomOut); Action *zoomOriginalChatview = coll->add<Action>("ZoomOriginalChatView", this, SLOT(zoomOriginal())); zoomOriginalChatview->setIcon(SmallIcon("zoom-original")); zoomOriginalChatview->setText(tr("Actual Size")); //zoomOriginalChatview->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_0)); // used for RTS switching Action *setMarkerLine = coll->add<Action>("SetMarkerLineToBottom", this, SLOT(setMarkerLine())); setMarkerLine->setText(tr("Set Marker Line")); setMarkerLine->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_R)); Action *jumpToMarkerLine = QtUi::actionCollection("Navigation")->add<Action>("JumpToMarkerLine", this, SLOT(jumpToMarkerLine())); jumpToMarkerLine->setText(tr("Go to Marker Line")); jumpToMarkerLine->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_K)); ChatViewSettings s; s.initAndNotify("AutoMarkerLine", this, SLOT(setAutoMarkerLine(QVariant)), true); }
Player::Player(QWidget *parent) : QWidget(parent) , m_position(0) , m_isMeltedPlaying(-1) , m_zoomToggleFactor(Settings.playerZoom() == 0.0f? 1.0f : Settings.playerZoom()) , m_pauseAfterOpen(false) , m_monitorScreen(-1) , m_currentTransport(0) { setObjectName("Player"); Mlt::Controller::singleton(); setupActions(this); m_playIcon = actionPlay->icon(); m_pauseIcon = actionPause->icon(); // Create a layout. QVBoxLayout *vlayout = new QVBoxLayout(this); vlayout->setObjectName("playerLayout"); vlayout->setContentsMargins(0, 0, 0, 0); vlayout->setSpacing(4); // Add tab bar to indicate/select what is playing: clip, playlist, timeline. m_tabs = new QTabBar; m_tabs->setShape(QTabBar::RoundedSouth); m_tabs->addTab(tr("Source")); m_tabs->addTab(tr("Program")); m_tabs->setTabEnabled(ProgramTabIndex, false); QHBoxLayout* tabLayout = new QHBoxLayout; tabLayout->addWidget(m_tabs); tabLayout->addStretch(); connect(m_tabs, SIGNAL(tabBarClicked(int)), SLOT(onTabBarClicked(int))); // Add the layouts for managing video view, scroll bars, and audio controls. m_videoLayout = new QHBoxLayout; m_videoLayout->setSpacing(4); m_videoLayout->setContentsMargins(0, 0, 0, 0); vlayout->addLayout(m_videoLayout, 10); vlayout->addStretch(); m_videoScrollWidget = new QWidget; m_videoLayout->addWidget(m_videoScrollWidget, 10); m_videoLayout->addStretch(); QGridLayout* glayout = new QGridLayout(m_videoScrollWidget); glayout->setSpacing(0); glayout->setContentsMargins(0, 0, 0, 0); // Add the video widgets. m_videoWidget = QWidget::createWindowContainer(qobject_cast<QWindow*>(MLT.videoWidget())); m_videoWidget->setMinimumSize(QSize(320, 180)); glayout->addWidget(m_videoWidget, 0, 0); m_verticalScroll = new QScrollBar(Qt::Vertical); glayout->addWidget(m_verticalScroll, 0, 1); m_verticalScroll->hide(); m_horizontalScroll = new QScrollBar(Qt::Horizontal); glayout->addWidget(m_horizontalScroll, 1, 0); m_horizontalScroll->hide(); // Add the volume and signal level meter m_volumePopup = new QFrame(this, Qt::Popup); QVBoxLayout *volumeLayoutV = new QVBoxLayout(m_volumePopup); volumeLayoutV->setContentsMargins(0, 0, 0, 0); volumeLayoutV->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding)); QBoxLayout *volumeLayoutH = new QHBoxLayout; volumeLayoutH->setSpacing(0); volumeLayoutH->setContentsMargins(0, 0, 0, 0); volumeLayoutH->addWidget(new AudioScale); m_volumeSlider = new QSlider(Qt::Vertical); m_volumeSlider->setFocusPolicy(Qt::NoFocus); m_volumeSlider->setMinimumHeight(VOLUME_SLIDER_HEIGHT); m_volumeSlider->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); volumeLayoutH->addWidget(m_volumeSlider); volumeLayoutV->addLayout(volumeLayoutH); m_volumeSlider->setRange(0, 99); m_volumeSlider->setValue(Settings.playerVolume()); onVolumeChanged(m_volumeSlider->value()); m_savedVolume = MLT.volume(); m_volumeSlider->setToolTip(tr("Adjust the audio volume")); connect(m_volumeSlider, SIGNAL(valueChanged(int)), this, SLOT(onVolumeChanged(int))); // Add mute-volume buttons layout #ifdef Q_OS_MAC if (Settings.theme() == "system") volumeLayoutH = new QVBoxLayout; else #endif volumeLayoutH = new QHBoxLayout; volumeLayoutH->setContentsMargins(0, 0, 0, 0); volumeLayoutH->setSpacing(0); volumeLayoutV->addLayout(volumeLayoutH); // Add mute button QPushButton* muteButton = new QPushButton(this); muteButton->setFocusPolicy(Qt::NoFocus); muteButton->setObjectName(QString::fromUtf8("muteButton")); muteButton->setIcon(QIcon::fromTheme("dialog-cancel", QIcon(":/icons/oxygen/16x16/actions/dialog-cancel.png"))); muteButton->setToolTip(tr("Silence the audio")); muteButton->setCheckable(true); muteButton->setChecked(Settings.playerMuted()); onMuteButtonToggled(Settings.playerMuted()); volumeLayoutH->addWidget(muteButton); connect(muteButton, SIGNAL(toggled(bool)), this, SLOT(onMuteButtonToggled(bool))); // This hack realizes the volume popup geometry for on_actionVolume_triggered(). m_volumePopup->show(); m_volumePopup->hide(); // Add the scrub bar. m_scrubber = new ScrubBar(this); m_scrubber->setFocusPolicy(Qt::NoFocus); m_scrubber->setObjectName("scrubBar"); m_scrubber->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); vlayout->addWidget(m_scrubber); // Add toolbar for transport controls. QToolBar* toolbar = new QToolBar(tr("Transport Controls"), this); int s = style()->pixelMetric(QStyle::PM_SmallIconSize); toolbar->setIconSize(QSize(s, s)); toolbar->setContentsMargins(0, 0, 0, 0); QWidget *spacer = new QWidget(this); spacer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); m_positionSpinner = new TimeSpinBox(this); m_positionSpinner->setToolTip(tr("Current position")); m_positionSpinner->setEnabled(false); m_positionSpinner->setKeyboardTracking(false); m_durationLabel = new QLabel(this); m_durationLabel->setToolTip(tr("Total Duration")); m_durationLabel->setText(" / 00:00:00:00"); m_durationLabel->setFixedWidth(m_positionSpinner->width()); m_inPointLabel = new QLabel(this); m_inPointLabel->setText("--:--:--:--"); m_inPointLabel->setToolTip(tr("In Point")); m_inPointLabel->setFixedWidth(m_inPointLabel->width()); m_selectedLabel = new QLabel(this); m_selectedLabel->setText("--:--:--:--"); m_selectedLabel->setToolTip(tr("Selected Duration")); m_selectedLabel->setFixedWidth(m_selectedLabel->width()); toolbar->addWidget(m_positionSpinner); toolbar->addWidget(m_durationLabel); toolbar->addWidget(spacer); toolbar->addAction(actionSkipPrevious); toolbar->addAction(actionRewind); toolbar->addAction(actionPlay); toolbar->addAction(actionFastForward); toolbar->addAction(actionSkipNext); // Add zoom button to toolbar. m_zoomButton = new QToolButton; QMenu* zoomMenu = new QMenu(this); m_zoomFitAction = zoomMenu->addAction( QIcon::fromTheme("zoom-fit-best", QIcon(":/icons/oxygen/32x32/actions/zoom-fit-best")), tr("Zoom Fit"), this, SLOT(zoomFit())); m_zoomOriginalAction = zoomMenu->addAction( QIcon::fromTheme("zoom-original", QIcon(":/icons/oxygen/32x32/actions/zoom-original")), tr("Zoom 100%"), this, SLOT(zoomOriginal())); m_zoomOutAction = zoomMenu->addAction( QIcon::fromTheme("zoom-out", QIcon(":/icons/oxygen/32x32/actions/zoom-out")), tr("Zoom 50%"), this, SLOT(zoomOut())); m_zoomInAction = zoomMenu->addAction( QIcon::fromTheme("zoom-in", QIcon(":/icons/oxygen/32x32/actions/zoom-in")), tr("Zoom 200%"), this, SLOT(zoomIn())); connect(m_zoomButton, SIGNAL(toggled(bool)), SLOT(toggleZoom(bool))); m_zoomButton->setMenu(zoomMenu); m_zoomButton->setPopupMode(QToolButton::MenuButtonPopup); m_zoomButton->setCheckable(true); m_zoomButton->setToolTip(tr("Toggle zoom")); toolbar->addWidget(m_zoomButton); toolbar->addAction(actionVolume); m_volumeWidget = toolbar->widgetForAction(actionVolume); // Add in-point and selected duration labels to toolbar. spacer = new QWidget(this); spacer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); toolbar->addWidget(spacer); toolbar->addWidget(m_inPointLabel); toolbar->addWidget(m_selectedLabel); vlayout->addWidget(toolbar); vlayout->addLayout(tabLayout); connect(MLT.videoWidget(), SIGNAL(frameDisplayed(const SharedFrame&)), this, SLOT(onFrameDisplayed(const SharedFrame&))); connect(actionPlay, SIGNAL(triggered()), this, SLOT(togglePlayPaused())); connect(actionPause, SIGNAL(triggered()), this, SLOT(pause())); connect(actionFastForward, SIGNAL(triggered()), this, SLOT(fastForward())); connect(actionRewind, SIGNAL(triggered()), this, SLOT(rewind())); connect(m_scrubber, SIGNAL(seeked(int)), this, SLOT(seek(int))); connect(m_scrubber, SIGNAL(inChanged(int)), this, SLOT(onInChanged(int))); connect(m_scrubber, SIGNAL(outChanged(int)), this, SLOT(onOutChanged(int))); connect(m_positionSpinner, SIGNAL(valueChanged(int)), this, SLOT(seek(int))); connect(m_positionSpinner, SIGNAL(editingFinished()), this, SLOT(setFocus())); connect(this, SIGNAL(endOfStream()), this, SLOT(pause())); connect(this, SIGNAL(zoomChanged(float)), MLT.videoWidget(), SLOT(setZoom(float))); connect(m_horizontalScroll, SIGNAL(valueChanged(int)), MLT.videoWidget(), SLOT(setOffsetX(int))); connect(m_verticalScroll, SIGNAL(valueChanged(int)), MLT.videoWidget(), SLOT(setOffsetY(int))); setFocusPolicy(Qt::StrongFocus); }