PageRecord::PageRecord(MainWindow* main_window) : QWidget(main_window->centralWidget()) { m_main_window = main_window; m_page_started = false; m_input_started = false; m_output_started = false; m_previewing = false; m_last_error_sound = std::numeric_limits<int64_t>::min(); QGroupBox *groupbox_recording = new QGroupBox(tr("Recording"), this); { m_pushbutton_start_pause = new QPushButton(groupbox_recording); m_checkbox_hotkey_enable = new QCheckBox(tr("Enable recording hotkey"), groupbox_recording); m_checkbox_sound_notifications_enable = new QCheckBox(tr("Enable sound notifications"), groupbox_recording); QLabel *label_hotkey = new QLabel(tr("Hotkey:"), groupbox_recording); m_checkbox_hotkey_ctrl = new QCheckBox(tr("Ctrl +"), groupbox_recording); m_checkbox_hotkey_shift = new QCheckBox(tr("Shift +"), groupbox_recording); m_checkbox_hotkey_alt = new QCheckBox(tr("Alt +"), groupbox_recording); m_checkbox_hotkey_super = new QCheckBox(tr("Super +"), groupbox_recording); m_combobox_hotkey_key = new QComboBox(groupbox_recording); m_combobox_hotkey_key->setToolTip(tr("The key that you have to press (combined with the given modifiers) to start or pause recording.\n" "The program that you are recording will not receive the key press.")); // Note: The choice of keys is currently rather limited, because capturing key presses session-wide is a bit harder than it looks. // For example, applications are not allowed to capture the F1-F12 keys (on Ubuntu at least). The A-Z keys don't have this limitation apparently. for(unsigned int i = 0; i < 26; ++i) { m_combobox_hotkey_key->addItem(QString('A' + i)); } connect(m_pushbutton_start_pause, SIGNAL(clicked()), this, SLOT(OnRecordStartPause())); connect(m_checkbox_hotkey_enable, SIGNAL(clicked()), this, SLOT(OnUpdateHotkeyFields())); connect(m_checkbox_sound_notifications_enable, SIGNAL(clicked()), this, SLOT(OnUpdateSoundNotifications())); connect(m_checkbox_hotkey_ctrl, SIGNAL(clicked()), this, SLOT(OnUpdateHotkey())); connect(m_checkbox_hotkey_shift, SIGNAL(clicked()), this, SLOT(OnUpdateHotkey())); connect(m_checkbox_hotkey_alt, SIGNAL(clicked()), this, SLOT(OnUpdateHotkey())); connect(m_checkbox_hotkey_super, SIGNAL(clicked()), this, SLOT(OnUpdateHotkey())); connect(m_combobox_hotkey_key, SIGNAL(activated(int)), this, SLOT(OnUpdateHotkey())); QVBoxLayout *layout = new QVBoxLayout(groupbox_recording); layout->addWidget(m_pushbutton_start_pause); { QHBoxLayout *layout2 = new QHBoxLayout(); layout->addLayout(layout2); layout2->addWidget(m_checkbox_hotkey_enable); layout2->addWidget(m_checkbox_sound_notifications_enable); } { QHBoxLayout *layout2 = new QHBoxLayout(); layout->addLayout(layout2); layout2->addWidget(label_hotkey); layout2->addWidget(m_checkbox_hotkey_ctrl); layout2->addWidget(m_checkbox_hotkey_shift); layout2->addWidget(m_checkbox_hotkey_alt); layout2->addWidget(m_checkbox_hotkey_super); layout2->addWidget(m_combobox_hotkey_key); } } QSplitter *splitter_vertical = new QSplitter(Qt::Vertical, this); { QSplitter *splitter_horizontal = new QSplitter(Qt::Horizontal, splitter_vertical); { QGroupBox *groupbox_information = new QGroupBox(tr("Information"), splitter_horizontal); { QLabel *label_total_time = new QLabel(tr("Total time:"), groupbox_information); m_label_info_total_time = new QLabel(groupbox_information); QLabel *label_frame_rate_in = new QLabel(tr("FPS in:"), groupbox_information); m_label_info_frame_rate_in = new QLabel(groupbox_information); QLabel *label_frame_rate_out = new QLabel(tr("FPS out:"), groupbox_information); m_label_info_frame_rate_out = new QLabel(groupbox_information); QLabel *label_size_in = new QLabel(tr("Size in:"), groupbox_information); m_label_info_size_in = new QLabel(groupbox_information); QLabel *label_size_out = new QLabel(tr("Size out:"), groupbox_information); m_label_info_size_out = new QLabel(groupbox_information); QLabel *label_file_name = new QLabel(tr("File name:"), groupbox_information); m_label_info_file_name = new ElidedLabel(QString(), Qt::ElideMiddle, groupbox_information); m_label_info_file_name->setMinimumWidth(100); QLabel *label_file_size = new QLabel(tr("File size:"), groupbox_information); m_label_info_file_size = new QLabel(groupbox_information); QLabel *label_bit_rate = new QLabel(tr("Bit rate:"), groupbox_information); m_label_info_bit_rate = new QLabel(groupbox_information); QGridLayout *layout = new QGridLayout(groupbox_information); layout->addWidget(label_total_time, 0, 0); layout->addWidget(m_label_info_total_time, 0, 1); layout->addWidget(label_frame_rate_in, 1, 0); layout->addWidget(m_label_info_frame_rate_in, 1, 1); layout->addWidget(label_frame_rate_out, 2, 0); layout->addWidget(m_label_info_frame_rate_out, 2, 1); layout->addWidget(label_size_in, 3, 0); layout->addWidget(m_label_info_size_in, 3, 1); layout->addWidget(label_size_out, 4, 0); layout->addWidget(m_label_info_size_out, 4, 1); layout->addWidget(label_file_name, 5, 0); layout->addWidget(m_label_info_file_name, 5, 1); layout->addWidget(label_file_size, 6, 0); layout->addWidget(m_label_info_file_size, 6, 1); layout->addWidget(label_bit_rate, 7, 0); layout->addWidget(m_label_info_bit_rate, 7, 1); layout->setColumnStretch(1, 1); layout->setRowStretch(8, 1); } QGroupBox *groupbox_preview = new QGroupBox(tr("Preview"), splitter_horizontal); { m_preview_page1 = new QWidget(groupbox_preview); { QLabel *label_preview_frame_rate = new QLabel(tr("Preview frame rate:"), m_preview_page1); m_spinbox_preview_frame_rate = new QSpinBox(m_preview_page1); m_spinbox_preview_frame_rate->setRange(1, 1000); m_spinbox_preview_frame_rate->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); QLabel *label_preview_note = new QLabel(tr("Note: Previewing requires extra CPU time (especially at high frame rates)."), m_preview_page1); label_preview_note->setWordWrap(true); label_preview_note->setAlignment(Qt::AlignLeft | Qt::AlignTop); label_preview_note->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::MinimumExpanding); QGridLayout *layout = new QGridLayout(m_preview_page1); layout->setMargin(0); layout->addWidget(label_preview_frame_rate, 0, 0); layout->addWidget(m_spinbox_preview_frame_rate, 0, 1); layout->addWidget(label_preview_note, 1, 0, 1, 2); } m_preview_page2 = new QWidget(groupbox_preview); { m_video_previewer = new VideoPreviewer(m_preview_page2); m_label_mic_icon = new QLabel(m_preview_page2); m_label_mic_icon->setPixmap(QIcon::fromTheme("audio-input-microphone").pixmap(24, 24)); m_audio_previewer = new AudioPreviewer(m_preview_page2); QVBoxLayout *layout = new QVBoxLayout(m_preview_page2); layout->setMargin(0); layout->addWidget(m_video_previewer); { QHBoxLayout *layout2 = new QHBoxLayout(); layout->addLayout(layout2); layout2->addStretch(); layout2->addWidget(m_label_mic_icon); layout2->addWidget(m_audio_previewer); layout2->addStretch(); } } m_pushbutton_preview_start_stop = new QPushButton(groupbox_preview); connect(m_pushbutton_preview_start_stop, SIGNAL(clicked()), this, SLOT(OnPreviewStartStop())); QVBoxLayout *layout = new QVBoxLayout(groupbox_preview); { m_stacked_layout_preview = new QStackedLayout(); layout->addLayout(m_stacked_layout_preview); m_stacked_layout_preview->addWidget(m_preview_page1); m_stacked_layout_preview->addWidget(m_preview_page2); } layout->addWidget(m_pushbutton_preview_start_stop); } splitter_horizontal->addWidget(groupbox_information); splitter_horizontal->addWidget(groupbox_preview); splitter_horizontal->setStretchFactor(0, 1); splitter_horizontal->setStretchFactor(1, 3); } QGroupBox *groupbox_log = new QGroupBox(tr("Log"), splitter_vertical); { m_textedit_log = new QTextEditSmall(groupbox_log); m_textedit_log->setReadOnly(true); QVBoxLayout *layout = new QVBoxLayout(groupbox_log); layout->addWidget(m_textedit_log); } splitter_vertical->addWidget(splitter_horizontal); splitter_vertical->addWidget(groupbox_log); splitter_vertical->setStretchFactor(0, 3); splitter_vertical->setStretchFactor(1, 1); } QPushButton *button_cancel = new QPushButton(QIcon::fromTheme("process-stop"), tr("Cancel recording"), this); QPushButton *button_save = new QPushButton(QIcon::fromTheme("document-save"), tr("Save recording"), this); if(g_option_systray) { m_systray_icon = new QSystemTrayIcon(g_icon_ssr, m_main_window); QMenu *menu = new QMenu(m_main_window); m_systray_action_start_pause = menu->addAction(QString(), this, SLOT(OnRecordStartPause())); m_systray_action_save = menu->addAction(tr("Save recording"), this, SLOT(OnSave())); m_systray_action_cancel = menu->addAction(tr("Cancel recording"), this, SLOT(OnCancel())); menu->addSeparator(); menu->addAction("Quit", m_main_window, SLOT(close())); m_systray_icon->setContextMenu(menu); } else { m_systray_icon = NULL; } connect(button_cancel, SIGNAL(clicked()), this, SLOT(OnCancel())); connect(button_save, SIGNAL(clicked()), this, SLOT(OnSave())); if(m_systray_icon != NULL) connect(m_systray_icon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), m_main_window, SLOT(OnSysTrayActivated(QSystemTrayIcon::ActivationReason))); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(groupbox_recording); layout->addWidget(splitter_vertical); { QHBoxLayout *layout2 = new QHBoxLayout(); layout->addLayout(layout2); layout2->addWidget(button_cancel); layout2->addWidget(button_save); } UpdateSysTray(); UpdateRecordPauseButton(); UpdatePreview(); m_timer_update_info = new QTimer(this); connect(m_timer_update_info, SIGNAL(timeout()), this, SLOT(OnUpdateInformation())); connect(&m_hotkey_start_pause, SIGNAL(Triggered()), this, SLOT(OnRecordStartPause())); connect(Logger::GetInstance(), SIGNAL(NewLine(Logger::enum_type,QString)), this, SLOT(OnNewLogLine(Logger::enum_type,QString)), Qt::QueuedConnection); if(m_systray_icon != NULL) m_systray_icon->show(); }
/* Implementation *************************************************************/ CServerDlg::CServerDlg ( CServer* pNServP, CSettings* pNSetP, const bool bStartMinimized, QWidget* parent, Qt::WindowFlags f ) : QDialog ( parent, f ), pServer ( pNServP ), pSettings ( pNSetP ), BitmapSystemTrayInactive ( QString::fromUtf8 ( ":/png/LEDs/res/CLEDGreyArrow.png" ) ), BitmapSystemTrayActive ( QString::fromUtf8 ( ":/png/LEDs/res/CLEDGreenArrow.png" ) ) { setupUi ( this ); // Add help text to controls ----------------------------------------------- // client list lvwClients->setWhatsThis ( tr ( "<b>Client List:</b> The client list " "shows all clients which are currently connected to this server. Some " "informations about the clients like the IP address and name are given " "for each connected client." ) ); lvwClients->setAccessibleName ( tr ( "Connected clients list view" ) ); // start minimized on operating system start chbStartOnOSStart->setWhatsThis ( tr ( "<b>Start Minimized on Operating " "System Start:</b> If the start minimized on operating system start " "check box is checked, the " ) + APP_NAME + tr ( " server will be " "started when the operating system starts up and is automatically " "minimized to a system task bar icon." ) ); // register server flag chbRegisterServer->setWhatsThis ( tr ( "<b>Register Server Status:</b> If " "the register server check box is checked, this server registers " "itself at the central server so that all " ) + APP_NAME + tr ( " users can see the server in the connect dialog server list and " "connect to it. The registering of the server is renewed periodically " "to make sure that all servers in the connect dialog server list are " "actually available." ) ); // central server address QString strCentrServAddr = tr ( "<b>Central Server Address:</b> The " "Central server address is the IP address or URL of the central server " "at which this server is registered. If the Default check box is " "checked, the default central server address is shown read-only." ); lblCentralServerAddress->setWhatsThis ( strCentrServAddr ); chbDefaultCentralServer->setWhatsThis ( strCentrServAddr ); edtCentralServerAddress->setWhatsThis ( strCentrServAddr ); chbDefaultCentralServer->setAccessibleName ( tr ( "Default central server check box" ) ); edtCentralServerAddress->setAccessibleName ( tr ( "Central server address line edit" ) ); // server name QString strServName = tr ( "<b>Server Name:</b> The server name identifies " "your server in the connect dialog server list at the clients. If no " "name is given, the IP address is shown instead." ); lblServerName->setWhatsThis ( strServName ); edtServerName->setWhatsThis ( strServName ); edtServerName->setAccessibleName ( tr ( "Server name line edit" ) ); // location city QString strLocCity = tr ( "<b>Location City:</b> The city in which this " "server is located can be set here. If a city name is entered, it " "will be shown in the connect dialog server list at the clients." ); lblLocationCity->setWhatsThis ( strLocCity ); edtLocationCity->setWhatsThis ( strLocCity ); edtLocationCity->setAccessibleName ( tr ( "City where the server is located line edit" ) ); // location country QString strLocCountry = tr ( "<b>Location country:</b> The country in " "which this server is located can be set here. If a country is " "entered, it will be shown in the connect dialog server list at the " "clients." ); lblLocationCountry->setWhatsThis ( strLocCountry ); cbxLocationCountry->setWhatsThis ( strLocCountry ); cbxLocationCountry->setAccessibleName ( tr ( "Country where the server is located combo box" ) ); // check if system tray icon can be used bSystemTrayIconAvaialbe = SystemTrayIcon.isSystemTrayAvailable(); // init system tray icon if ( bSystemTrayIconAvaialbe ) { // prepare context menu to be added to the system tray icon pSystemTrayIconMenu = new QMenu ( this ); pSystemTrayIconMenu->addAction ( tr ( "E&xit" ), this, SLOT ( OnSysTrayMenuExit() ) ); pSystemTrayIconMenu->addSeparator(); pSystemTrayIconMenu->addAction ( tr ( "&Hide " ) + APP_NAME + tr ( " server" ), this, SLOT ( OnSysTrayMenuHide() ) ); pSystemTrayIconMenu->setDefaultAction ( pSystemTrayIconMenu->addAction ( tr ( "&Open " ) + APP_NAME + tr ( " server" ), this, SLOT ( OnSysTrayMenuOpen() ) ) ); SystemTrayIcon.setContextMenu ( pSystemTrayIconMenu ); // set tool text SystemTrayIcon.setToolTip ( QString ( APP_NAME ) + tr ( " server" ) ); // show icon of state "inactive" SystemTrayIcon.setIcon ( QIcon ( BitmapSystemTrayInactive ) ); SystemTrayIcon.show(); } // act on "start minimized" flag (note, this has to be done after setting // the correct value for the system tray icon availablility) if ( bStartMinimized ) { showMinimized(); } // set text for version and application name lblNameVersion->setText ( QString ( APP_NAME ) + tr ( " server " ) + QString ( VERSION ) ); // set up list view for connected clients lvwClients->setColumnWidth ( 0, 170 ); lvwClients->setColumnWidth ( 1, 130 ); lvwClients->clear(); // TEST workaround for resize problem of window after iconize in task bar lvwClients->setMinimumWidth ( 170 + 130 + 60 + 205 ); lvwClients->setMinimumHeight ( 140 ); // insert items in reverse order because in Windows all of them are // always visible -> put first item on the top vecpListViewItems.Init ( MAX_NUM_CHANNELS ); for ( int i = MAX_NUM_CHANNELS - 1; i >= 0; i-- ) { vecpListViewItems[i] = new QTreeWidgetItem ( lvwClients ); vecpListViewItems[i]->setHidden ( true ); } // update default central server address check box if ( pServer->GetUseDefaultCentralServerAddress() ) { chbDefaultCentralServer->setCheckState ( Qt::Checked ); } else { chbDefaultCentralServer->setCheckState ( Qt::Unchecked ); } // update server name line edit edtServerName->setText ( pServer->GetServerName() ); // update server city line edit edtLocationCity->setText ( pServer->GetServerCity() ); // load country combo box with all available countries cbxLocationCountry->setInsertPolicy ( QComboBox::NoInsert ); cbxLocationCountry->clear(); for ( int iCurCntry = static_cast<int> ( QLocale::AnyCountry ); iCurCntry < static_cast<int> ( QLocale::LastCountry ); iCurCntry++ ) { // add all countries except of the "Default" country if ( static_cast<QLocale::Country> ( iCurCntry ) != QLocale::AnyCountry ) { // store the country enum index together with the string (this is // important since we sort the combo box items later on) cbxLocationCountry->addItem ( QLocale::countryToString ( static_cast<QLocale::Country> ( iCurCntry ) ), iCurCntry ); } } // sort country combo box items in alphabetical order cbxLocationCountry->model()->sort ( 0, Qt::AscendingOrder ); // select current country cbxLocationCountry->setCurrentIndex ( cbxLocationCountry->findData ( static_cast<int> ( pServer->GetServerCountry() ) ) ); // update register server check box if ( pServer->GetServerListEnabled() ) { chbRegisterServer->setCheckState ( Qt::Checked ); } else { chbRegisterServer->setCheckState ( Qt::Unchecked ); } // update start minimized check box (only available for Windows) #ifndef _WIN32 chbStartOnOSStart->setVisible ( false ); #else const bool bCurAutoStartMinState = pServer->GetAutoRunMinimized(); if ( bCurAutoStartMinState ) { chbStartOnOSStart->setCheckState ( Qt::Checked ); } else { chbStartOnOSStart->setCheckState ( Qt::Unchecked ); } // modify registry according to setting (this is just required in case a // user has changed the registry by hand) ModifyAutoStartEntry ( bCurAutoStartMinState ); #endif // update GUI dependencies UpdateGUIDependencies(); // set window title setWindowTitle ( APP_NAME + tr ( " Server" ) ); // View menu -------------------------------------------------------------- QMenu* pViewMenu = new QMenu ( "&Window", this ); pViewMenu->addAction ( tr ( "E&xit" ), this, SLOT ( close() ), QKeySequence ( Qt::CTRL + Qt::Key_Q ) ); // Main menu bar ----------------------------------------------------------- pMenu = new QMenuBar ( this ); pMenu->addMenu ( pViewMenu ); pMenu->addMenu ( new CHelpMenu ( this ) ); // Now tell the layout about the menu layout()->setMenuBar ( pMenu ); // Connections ------------------------------------------------------------- // check boxes QObject::connect ( chbRegisterServer, SIGNAL ( stateChanged ( int ) ), this, SLOT ( OnRegisterServerStateChanged ( int ) ) ); QObject::connect ( chbDefaultCentralServer, SIGNAL ( stateChanged ( int ) ), this, SLOT ( OnDefaultCentralServerStateChanged ( int ) ) ); QObject::connect ( chbStartOnOSStart, SIGNAL ( stateChanged ( int ) ), this, SLOT ( OnStartOnOSStartStateChanged ( int ) ) ); // line edits QObject::connect ( edtCentralServerAddress, SIGNAL ( editingFinished() ), this, SLOT ( OnCentralServerAddressEditingFinished() ) ); QObject::connect ( edtServerName, SIGNAL ( textChanged ( const QString& ) ), this, SLOT ( OnServerNameTextChanged ( const QString& ) ) ); QObject::connect ( edtLocationCity, SIGNAL ( textChanged ( const QString& ) ), this, SLOT ( OnLocationCityTextChanged ( const QString& ) ) ); // combo boxes QObject::connect ( cbxLocationCountry, SIGNAL ( activated ( int ) ), this, SLOT ( OnLocationCountryActivated ( int ) ) ); // timers QObject::connect ( &Timer, SIGNAL ( timeout() ), this, SLOT ( OnTimer() ) ); // other QObject::connect ( pServer, SIGNAL ( Started() ), this, SLOT ( OnServerStarted() ) ); QObject::connect ( pServer, SIGNAL ( Stopped() ), this, SLOT ( OnServerStopped() ) ); QObject::connect ( QCoreApplication::instance(), SIGNAL ( aboutToQuit() ), this, SLOT ( OnAboutToQuit() ) ); QObject::connect ( &SystemTrayIcon, SIGNAL ( activated ( QSystemTrayIcon::ActivationReason ) ), this, SLOT ( OnSysTrayActivated ( QSystemTrayIcon::ActivationReason ) ) ); // Timers ------------------------------------------------------------------ // start timer for GUI controls Timer.start ( GUI_CONTRL_UPDATE_TIME ); }