#include "GUIApp.h" #include "outputApp.h" #include "json.hpp" using json = nlohmann::json; int window_width = 400; int window_height = 400; int window_position_x = 100; int window_position_y = 200; int prev_positionX; int prev_positionY; int prev_window_width; int prev_window_height; bool fullscreen = false; void GUIApp::loadSettingsFromFile( string file_path ) { // read a JSON file std::ifstream i( file_path ); if( !i ) { i.clear(); i.open( file_path, std::ios::out ); // Create using out if( !i ) { printf( "File doesn't exist." ); } i.close(); i.open( file_path ); // Open for I/O if( !i ) { printf( "Could not open file." ); } } else { try { json prevStateVars; // Create a place to store the variable values i >> prevStateVars; // Load the file values into the JSON gui0_equalizerEnable->setChecked( prevStateVars.at( "equalizerEnable" ) ); gui0_timeCoherent->setChecked( prevStateVars.at( "timeCoherent" ) ); // Change and update sweep mode sweep_mode = prevStateVars.at( "sweep_mode" ); // 0 - manual // 1 - automatic gui0_SweepMode->select( sweep_mode ); // Change and update sweep rate sweep_rate = prevStateVars.at( "sweep_rate" ); gui0_SweepRate->setValue( sweep_rate ); // Change and update sweep percentage sweep_percentage = prevStateVars.at( "sweep_percentage" ); gui0_SweepPercentage->setValue( sweep_percentage ); // Change and update output mode output_mode = prevStateVars.at( "output_mode" ); // 0 - all three together // 1 - all three separate gui0_outputModeDD->select( output_mode ); // Change and update output channel output_channel = prevStateVars.at( "output_channel" ); // 0 - all three on R // 1 - all three on G // 2 - all three on B gui0_outputChannelDD->select( output_channel ); gui0_outputChannelDD->setVisible( output_mode == 0 ); // Change and update output mixing mode shared_output_mixing_mode = prevStateVars.at( "shared_output_mixing_mode" ); // 0 - average with constant divisor // 1 - average with changing divisor based upon sum of amplitudes gui0_outputChannelDD->select( shared_output_mixing_mode ); gui0_mixingModeDD->setVisible( output_mode == 0 ); char temp_c_str[ 16 ]; // Update Green enable and green carrier frequency gui0_RedEnable->setChecked( prevStateVars.at( "red_enable" ) ); red_carrier_freq = prevStateVars.at( "red_carrier_freq" ); sprintf( temp_c_str, "%.2f", red_carrier_freq ); gui0_RedCarrierFrequency->setText( temp_c_str ); // Change red frequency variables gui0_RedMinFreq->setValue( prevStateVars.at( "red_min_freq" ) ); gui0_RedFreq->setValue( prevStateVars.at( "red_freq" ) ); gui0_RedMaxFreq->setValue( prevStateVars.at( "red_max_freq" ) ); gui0_RedAmp->setValue( prevStateVars.at( "red_amp" ) ); // Call helper function to change red min, max, and current frequencies in response to the carrier frequency carrier_freq_change_helper( gui0_RedMinFreq, red_carrier_freq ); carrier_freq_change_helper( gui0_RedMaxFreq, red_carrier_freq ); carrier_freq_change_helper( gui0_RedFreq, red_carrier_freq ); // Update Green enable and green carrier frequency gui0_GreenEnable->setChecked( prevStateVars.at( "green_enable" ) ); green_carrier_freq = prevStateVars.at( "green_carrier_freq" ); sprintf( temp_c_str, "%.2f", green_carrier_freq ); gui0_GreenCarrierFrequency->setText( temp_c_str ); // Change green frequency variables gui0_GreenMinFreq->setValue( prevStateVars.at( "green_min_freq" ) ); gui0_GreenFreq->setValue( prevStateVars.at( "green_freq" ) ); gui0_GreenMaxFreq->setValue( prevStateVars.at( "green_max_freq" ) ); gui0_GreenAmp->setValue( prevStateVars.at( "green_amp" ) ); // Call helper function to change green min, max, and current frequencies in response to the carrier frequency carrier_freq_change_helper( gui0_GreenMinFreq, green_carrier_freq ); carrier_freq_change_helper( gui0_GreenMaxFreq, green_carrier_freq ); carrier_freq_change_helper( gui0_GreenFreq, green_carrier_freq ); // Update Blue enable and blue carrier frequency gui0_BlueEnable->setChecked( prevStateVars.at( "blue_enable" ) ); blue_carrier_freq = prevStateVars.at( "blue_carrier_freq" ); sprintf( temp_c_str, "%.2f", blue_carrier_freq ); gui0_BlueCarrierFrequency->setText( temp_c_str ); // Change blue frequency variables gui0_BlueMinFreq->setValue( prevStateVars.at( "blue_min_freq" ) ); gui0_BlueFreq->setValue( prevStateVars.at( "blue_freq" ) ); gui0_BlueMaxFreq->setValue( prevStateVars.at( "blue_max_freq" ) ); gui0_BlueAmp->setValue( prevStateVars.at( "blue_amp" ) ); // Call helper function to change blue min, max, and current frequencies in response to the carrier frequency carrier_freq_change_helper( gui0_BlueMinFreq, blue_carrier_freq ); carrier_freq_change_helper( gui0_BlueMaxFreq, blue_carrier_freq ); carrier_freq_change_helper( gui0_BlueFreq, blue_carrier_freq ); // ofSetFullscreen( prevStateVars.at( "fullscreen" ) ); fullscreen = prevStateVars.at( "fullscreen" ); window_width = prevStateVars.at( "window_width" ); window_height = prevStateVars.at( "window_height" ); window_position_x = prevStateVars.at( "window_position_x" ); window_position_y = prevStateVars.at( "window_position_y" ); } catch( std::invalid_argument& ia ) { // Catch invalid files ia.what(); } catch( std::out_of_range& oor ) { // Catch out of range values oor.what(); } catch( std::domain_error& derr ) { // Catch domain errors derr.what(); } if( sweep_mode ) { // Make some slider options visible when changing to Automatic mode gui0_SweepRate->setVisible( true ); gui0_SweepPercentage->setVisible( true ); gui0_RedMinFreq->setVisible( true ); gui0_RedMaxFreq->setVisible( true ); gui0_GreenMinFreq->setVisible( true ); gui0_GreenMaxFreq->setVisible( true ); gui0_BlueMinFreq->setVisible( true ); gui0_BlueMaxFreq->setVisible( true ); } else {// Make some slider options invisible when changing to Manual mode gui0_SweepRate->setVisible( false ); gui0_SweepPercentage->setVisible( false ); gui0_RedMinFreq->setVisible( false ); gui0_RedMaxFreq->setVisible( false ); gui0_GreenMinFreq->setVisible( false ); gui0_GreenMaxFreq->setVisible( false ); gui0_BlueMinFreq->setVisible( false ); gui0_BlueMaxFreq->setVisible( false ); } // Call Event Functions to update GUI display gui0->onButtonEvent( this, &GUIApp::onButtonEvent ); gui0->onToggleEvent( this, &GUIApp::onToggleEvent ); gui0->onTextInputEvent( this, &GUIApp::onTextInputEvent ); gui0->onSliderEvent( this, &GUIApp::onSliderEvent ); gui0->onDropdownEvent( this, &GUIApp::onDropdownEvent ); alt_modifier = false; shift_modifier = false; ctrl_modifier = false; is_adjusting_min_max_freq = false; // Resize window if GUI options changed gui_window->setWindowShape( gui0->getWidth(), gui0->getHeight() + font.getLineHeight() ); } } void GUIApp::loadFile( string file_name ) { // This double call is neccessary in order to correctly load the freq variables loadSettingsFromFile( file_name ); loadSettingsFromFile( file_name ); } void GUIApp::toggleFullScreen() { fullscreen = !fullscreen; } bool GUIApp::getFullScreen() { return fullscreen; } void GUIApp::setOutputWidth( int width ) { // Set the width of the output window window_width = width; } void GUIApp::setOutputHeight( int height ) { // Set the height of the output window window_height = height; } void GUIApp::setPositionX( int positionX ) { // Set the X position of the output window window_position_x = positionX; } void GUIApp::setPositionY( int positionY ) { // Set the Y position of the output window window_position_y = positionY; } void GUIApp::setPreviousWidth( int width ) { prev_window_width = width; } void GUIApp::setPreviousHeight( int height ) { prev_window_height = height; } void GUIApp::setPreviousPositionX( int positionX ) { prev_positionX = positionX; } void GUIApp::setPreviousPositionY( int positionY ) { prev_positionY = positionY; } int GUIApp::getOutputWidth() { // Return the width of the output window return window_width; } int GUIApp::getOutputHeight() { // Return the height of the output window return window_height; } int GUIApp::getPositionX() { // Return the X position of the output window return window_position_x; } int GUIApp::getPositionY() { // Return the Y position of the output window return window_position_y; } void GUIApp::saveSettingsToFile( string file_path ) { json savedStateVars; // Create a place to store the variable values // Store variables based on a (key, value) system savedStateVars[ "equalizerEnable" ] = gui0_equalizerEnable->getChecked(); savedStateVars[ "timeCoherent" ] = gui0_timeCoherent->getChecked(); savedStateVars[ "sweep_mode" ] = sweep_mode; savedStateVars[ "sweep_rate" ] = sweep_rate; savedStateVars[ "sweep_percentage" ] = sweep_percentage; savedStateVars[ "output_mode" ] = output_mode; savedStateVars[ "output_channel" ] = output_channel; savedStateVars[ "shared_output_mixing_mode" ] = shared_output_mixing_mode; // Store red frequency variables savedStateVars[ "red_enable" ] = gui0_RedEnable->getChecked(); savedStateVars[ "red_carrier_freq" ] = red_carrier_freq; savedStateVars[ "red_min_freq" ] = red_min_freq; savedStateVars[ "red_freq" ] = gui0_RedFreq->getValue(); savedStateVars[ "red_max_freq" ] = red_max_freq; savedStateVars[ "red_amp" ] = gui0_RedAmp->getValue(); // Store green frequency variables savedStateVars[ "green_enable" ] = gui0_GreenEnable->getChecked(); savedStateVars[ "green_carrier_freq" ] = green_carrier_freq; savedStateVars[ "green_min_freq" ] = green_min_freq; savedStateVars[ "green_freq" ] = gui0_GreenFreq->getValue(); savedStateVars[ "green_max_freq" ] = green_max_freq; savedStateVars[ "green_amp" ] = gui0_GreenAmp->getValue(); // Store blue frequency variables savedStateVars[ "blue_enable" ] = gui0_BlueEnable->getChecked(); savedStateVars[ "blue_carrier_freq" ] = blue_carrier_freq; savedStateVars[ "blue_min_freq" ] = blue_min_freq; savedStateVars[ "blue_freq" ] = gui0_BlueFreq->getValue(); savedStateVars[ "blue_max_freq" ] = blue_max_freq; savedStateVars[ "blue_amp" ] = gui0_BlueAmp->getValue(); // Store Output window position, width, and height savedStateVars[ "fullscreen" ] = fullscreen; if( fullscreen ) { savedStateVars[ "window_position_x" ] = prev_positionX; savedStateVars[ "window_position_y" ] = prev_positionY; savedStateVars[ "window_width" ] = prev_window_width; savedStateVars[ "window_height" ] = prev_window_height; } else { savedStateVars[ "window_position_x" ] = window_position_x; savedStateVars[ "window_position_y" ] = window_position_y; savedStateVars[ "window_width" ] = window_width; savedStateVars[ "window_height" ] = window_height; } // write prettified JSON to file std::ofstream off_program_file( file_path ); off_program_file << std::setw( 20 ) << savedStateVars << std::endl; }