std::string OMW::Engine::loadSettings (Settings::Manager & settings) { // Create the settings manager and load default settings file const std::string localdefault = mCfgMgr.getLocalPath().string() + "/settings-default.cfg"; const std::string globaldefault = mCfgMgr.getGlobalPath().string() + "/settings-default.cfg"; // prefer local if (boost::filesystem::exists(localdefault)) settings.loadDefault(localdefault); else if (boost::filesystem::exists(globaldefault)) settings.loadDefault(globaldefault); else throw std::runtime_error ("No default settings file found! Make sure the file \"settings-default.cfg\" was properly installed."); // load user settings if they exist const std::string settingspath = mCfgMgr.getUserConfigPath().string() + "/settings.cfg"; if (boost::filesystem::exists(settingspath)) settings.loadUser(settingspath); // load nif overrides NifOverrides::Overrides nifOverrides; std::string transparencyOverrides = "/transparency-overrides.cfg"; std::string materialOverrides = "/material-overrides.cfg"; if (boost::filesystem::exists(mCfgMgr.getLocalPath().string() + transparencyOverrides)) nifOverrides.loadTransparencyOverrides(mCfgMgr.getLocalPath().string() + transparencyOverrides); else if (boost::filesystem::exists(mCfgMgr.getGlobalPath().string() + transparencyOverrides)) nifOverrides.loadTransparencyOverrides(mCfgMgr.getGlobalPath().string() + transparencyOverrides); if (boost::filesystem::exists(mCfgMgr.getLocalPath().string() + materialOverrides)) nifOverrides.loadMaterialOverrides(mCfgMgr.getLocalPath().string() + materialOverrides); else if (boost::filesystem::exists(mCfgMgr.getGlobalPath().string() + materialOverrides)) nifOverrides.loadMaterialOverrides(mCfgMgr.getGlobalPath().string() + materialOverrides); return settingspath; }
void ScProcess::startLanguage (void) { if (state() != QProcess::NotRunning) { statusMessage(tr("Interpreter is already running.")); return; } Settings::Manager *settings = Main::settings(); settings->beginGroup("IDE/interpreter"); QString workingDirectory = settings->value("runtimeDir").toString(); QString configFile = settings->value("configFile").toString(); settings->endGroup(); QString sclangCommand; #ifdef Q_OS_MAC sclangCommand = standardDirectory(ScResourceDir) + "/../MacOS/sclang"; #else sclangCommand = "sclang"; #endif QStringList sclangArguments; if(!configFile.isEmpty()) sclangArguments << "-l" << configFile; sclangArguments << "-i" << "scqt"; if(!workingDirectory.isEmpty()) setWorkingDirectory(workingDirectory); QProcess::start(sclangCommand, sclangArguments); bool processStarted = QProcess::waitForStarted(); if (!processStarted) emit statusMessage(tr("Failed to start interpreter!")); }
void OMW::Engine::go() { assert (!mCellName.empty()); assert (!mMaster.empty()); assert (!mOgre); Settings::Manager settings; std::string settingspath; settingspath = loadSettings (settings); // Create encoder ToUTF8::Utf8Encoder encoder (mEncoding); mEncoder = &encoder; prepareEngine (settings); // Play some good 'ol tunes MWBase::Environment::get().getSoundManager()->playPlaylist(std::string("Explore")); if (!mStartupScript.empty()) MWBase::Environment::get().getWindowManager()->executeInConsole (mStartupScript); std::cout << "\nPress Q/ESC or close window to exit.\n"; // Start the main rendering loop mOgre->start(); // Save user settings settings.saveUser(settingspath); std::cout << "Quitting peacefully.\n"; }
void OMW::Engine::go() { assert (!mContentFiles.empty()); assert (!mOgre); Settings::Manager settings; std::string settingspath; settingspath = loadSettings (settings); // Create encoder ToUTF8::Utf8Encoder encoder (mEncoding); mEncoder = &encoder; prepareEngine (settings); // Play some good 'ol tunes MWBase::Environment::get().getSoundManager()->playPlaylist(std::string("Explore")); if (!mSaveGameFile.empty()) { MWBase::Environment::get().getStateManager()->loadGame(mSaveGameFile); } else if (!mSkipMenu) { // start in main menu MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_MainMenu); try { // Is there an ini setting for this filename or something? MWBase::Environment::get().getSoundManager()->streamMusic("Special/morrowind title.mp3"); std::string logo = mFallbackMap["Movies_Morrowind_Logo"]; if (!logo.empty()) MWBase::Environment::get().getWindowManager()->playVideo(logo, true); } catch (...) {} } else { MWBase::Environment::get().getStateManager()->newGame (!mNewGame); } // Start the main rendering loop Ogre::Timer timer; while (!MWBase::Environment::get().getStateManager()->hasQuitRequest()) { float dt = timer.getMilliseconds()/1000.f; dt = std::min(dt, 0.2f); timer.reset(); Ogre::Root::getSingleton().renderOneFrame(dt); } // Save user settings settings.saveUser(settingspath); std::cout << "Quitting peacefully." << std::endl; }
int main( int argc, char *argv[] ) { QApplication app(argc, argv); QStringList arguments (QApplication::arguments()); arguments.pop_front(); // application path // Pass files to existing instance and quit SingleInstanceGuard guard; if (guard.tryConnect(arguments)) return 0; // Set up translations QTranslator qtTranslator; qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); app.installTranslator(&qtTranslator); QTranslator scideTranslator; scideTranslator.load("scide_" + QLocale::system().name()); app.installTranslator(&scideTranslator); // Set up style app.setStyle( new ScIDE::Style(app.style()) ); // Go... Main * main = Main::instance(); MainWindow *win = new MainWindow(main); // NOTE: load session after GUI is created, so that GUI can respond Settings::Manager *settings = main->settings(); SessionManager *sessions = main->sessionManager(); QString startSessionName = settings->value("IDE/startWithSession").toString(); if (startSessionName == "last") { QString lastSession = sessions->lastSession(); if (!lastSession.isEmpty()) { sessions->openSession(lastSession); } } else if (!startSessionName.isEmpty()) { sessions->openSession(startSessionName); } if (!sessions->currentSession()) { win->restoreWindowState(); sessions->newSession(); } win->show(); foreach (QString argument, arguments) { main->documentManager()->open(argument); }
std::string OMW::Engine::loadSettings (Settings::Manager & settings) { // Create the settings manager and load default settings file const std::string localdefault = (mCfgMgr.getLocalPath() / "settings-default.cfg").string(); const std::string globaldefault = (mCfgMgr.getGlobalPath() / "settings-default.cfg").string(); // prefer local if (boost::filesystem::exists(localdefault)) settings.loadDefault(localdefault); else if (boost::filesystem::exists(globaldefault)) settings.loadDefault(globaldefault); else throw std::runtime_error ("No default settings file found! Make sure the file \"settings-default.cfg\" was properly installed."); // load user settings if they exist const std::string settingspath = (mCfgMgr.getUserConfigPath() / "settings.cfg").string(); if (boost::filesystem::exists(settingspath)) settings.loadUser(settingspath); return settingspath; }
std::string OMW::Engine::loadSettings (Settings::Manager & settings) { // Create the settings manager and load default settings file const std::string localdefault = mCfgMgr.getLocalPath().string() + "/settings-default.cfg"; const std::string globaldefault = mCfgMgr.getGlobalPath().string() + "/settings-default.cfg"; // prefer local if (boost::filesystem::exists(localdefault)) settings.loadDefault(localdefault); else if (boost::filesystem::exists(globaldefault)) settings.loadDefault(globaldefault); else throw std::runtime_error ("No default settings file found! Make sure the file \"settings-default.cfg\" was properly installed."); // load user settings if they exist, otherwise just load the default settings as user settings const std::string settingspath = mCfgMgr.getUserPath().string() + "/settings.cfg"; if (boost::filesystem::exists(settingspath)) settings.loadUser(settingspath); else if (boost::filesystem::exists(localdefault)) settings.loadUser(localdefault); else if (boost::filesystem::exists(globaldefault)) settings.loadUser(globaldefault); mFpsLevel = settings.getInt("fps", "HUD"); // load nif overrides NifOverrides::Overrides nifOverrides; if (boost::filesystem::exists(mCfgMgr.getLocalPath().string() + "/transparency-overrides.cfg")) nifOverrides.loadTransparencyOverrides(mCfgMgr.getLocalPath().string() + "/transparency-overrides.cfg"); else if (boost::filesystem::exists(mCfgMgr.getGlobalPath().string() + "/transparency-overrides.cfg")) nifOverrides.loadTransparencyOverrides(mCfgMgr.getGlobalPath().string() + "/transparency-overrides.cfg"); return settingspath; }
void OMW::Engine::go() { assert (!mContentFiles.empty()); assert (!mOgre); Settings::Manager settings; std::string settingspath; settingspath = loadSettings (settings); // Create encoder ToUTF8::Utf8Encoder encoder (mEncoding); mEncoder = &encoder; prepareEngine (settings); // Play some good 'ol tunes MWBase::Environment::get().getSoundManager()->playPlaylist(std::string("Explore")); if (!mStartupScript.empty()) MWBase::Environment::get().getWindowManager()->executeInConsole (mStartupScript); // start in main menu if (!mSkipMenu) MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_MainMenu); else MWBase::Environment::get().getStateManager()->newGame (true); // Start the main rendering loop while (!mEnvironment.get().getStateManager()->hasQuitRequest()) Ogre::Root::getSingleton().renderOneFrame(); // Save user settings settings.saveUser(settingspath); std::cout << "Quitting peacefully." << std::endl; }
void OMW::Engine::prepareEngine (Settings::Manager & settings) { mEnvironment.setStateManager ( new MWState::StateManager (mCfgMgr.getUserDataPath() / "saves", mContentFiles.at (0))); Nif::NIFFile::CacheLock cachelock; std::string renderSystem = settings.getString("render system", "Video"); if (renderSystem == "") { #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 renderSystem = "Direct3D9 Rendering Subsystem"; #else renderSystem = "OpenGL Rendering Subsystem"; #endif } mOgre = new OEngine::Render::OgreRenderer; mOgre->configure( mCfgMgr.getLogPath().string(), renderSystem, Settings::Manager::getString("opengl rtt mode", "Video")); // This has to be added BEFORE MyGUI is initialized, as it needs // to find core.xml here. //addResourcesDirectory(mResDir); addResourcesDirectory(mCfgMgr.getCachePath ().string()); addResourcesDirectory(mResDir / "mygui"); addResourcesDirectory(mResDir / "water"); addResourcesDirectory(mResDir / "shadows"); OEngine::Render::WindowSettings windowSettings; windowSettings.fullscreen = settings.getBool("fullscreen", "Video"); windowSettings.window_x = settings.getInt("resolution x", "Video"); windowSettings.window_y = settings.getInt("resolution y", "Video"); windowSettings.screen = settings.getInt("screen", "Video"); windowSettings.vsync = settings.getBool("vsync", "Video"); windowSettings.icon = "openmw.png"; std::string aa = settings.getString("antialiasing", "Video"); windowSettings.fsaa = (aa.substr(0, 4) == "MSAA") ? aa.substr(5, aa.size()-5) : "0"; SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, settings.getBool("minimize on focus loss", "Video") ? "1" : "0"); mOgre->createWindow("OpenMW", windowSettings); Bsa::registerResources (mFileCollections, mArchives, true, mFSStrict); // Create input and UI first to set up a bootstrapping environment for // showing a loading screen and keeping the window responsive while doing so std::string keybinderUser = (mCfgMgr.getUserConfigPath() / "input_v1.xml").string(); bool keybinderUserExists = boost::filesystem::exists(keybinderUser); MWInput::InputManager* input = new MWInput::InputManager (*mOgre, *this, keybinderUser, keybinderUserExists, mGrab); mEnvironment.setInputManager (input); MWGui::WindowManager* window = new MWGui::WindowManager( mExtensions, mFpsLevel, mOgre, mCfgMgr.getLogPath().string() + std::string("/"), mCfgMgr.getCachePath ().string(), mScriptConsoleMode, mTranslationDataStorage, mEncoding, mExportFonts); mEnvironment.setWindowManager (window); // Create sound system mEnvironment.setSoundManager (new MWSound::SoundManager(mUseSound)); if (!mSkipMenu) { std::string logo = mFallbackMap["Movies_Company_Logo"]; if (!logo.empty()) window->playVideo(logo, 1); } // Create the world mEnvironment.setWorld( new MWWorld::World (*mOgre, mFileCollections, mContentFiles, mResDir, mCfgMgr.getCachePath(), mEncoder, mFallbackMap, mActivationDistanceOverride, mCellName, mStartupScript)); MWBase::Environment::get().getWorld()->setupPlayer(); input->setPlayer(&mEnvironment.getWorld()->getPlayer()); window->initUI(); window->renderWorldMap(); //Load translation data mTranslationDataStorage.setEncoder(mEncoder); for (size_t i = 0; i < mContentFiles.size(); i++) mTranslationDataStorage.loadTranslationData(mFileCollections, mContentFiles[i]); Compiler::registerExtensions (mExtensions); // Create script system mScriptContext = new MWScript::CompilerContext (MWScript::CompilerContext::Type_Full); mScriptContext->setExtensions (&mExtensions); mEnvironment.setScriptManager (new MWScript::ScriptManager (MWBase::Environment::get().getWorld()->getStore(), mVerboseScripts, *mScriptContext, mWarningsMode, mScriptBlacklistUse ? mScriptBlacklist : std::vector<std::string>())); // Create game mechanics system MWMechanics::MechanicsManager* mechanics = new MWMechanics::MechanicsManager; mEnvironment.setMechanicsManager (mechanics); // Create dialog system mEnvironment.setJournal (new MWDialogue::Journal); mEnvironment.setDialogueManager (new MWDialogue::DialogueManager (mExtensions, mVerboseScripts, mTranslationDataStorage)); mOgre->getRoot()->addFrameListener (this); // scripts if (mCompileAll) { std::pair<int, int> result = MWBase::Environment::get().getScriptManager()->compileAll(); if (result.first) std::cout << "compiled " << result.second << " of " << result.first << " scripts (" << 100*static_cast<double> (result.second)/result.first << "%)" << std::endl; } }
void OMW::Engine::go() { assert (!mCellName.empty()); assert (!mMaster.empty()); assert (!mOgre); mOgre = new OEngine::Render::OgreRenderer; // Create the settings manager and load default settings file Settings::Manager settings; const std::string localdefault = mCfgMgr.getLocalPath().string() + "/settings-default.cfg"; const std::string globaldefault = mCfgMgr.getGlobalPath().string() + "/settings-default.cfg"; // prefer local if (boost::filesystem::exists(localdefault)) settings.loadDefault(localdefault); else if (boost::filesystem::exists(globaldefault)) settings.loadDefault(globaldefault); else throw std::runtime_error ("No default settings file found! Make sure the file \"settings-default.cfg\" was properly installed."); // load user settings if they exist, otherwise just load the default settings as user settings const std::string settingspath = mCfgMgr.getUserPath().string() + "/settings.cfg"; if (boost::filesystem::exists(settingspath)) settings.loadUser(settingspath); else if (boost::filesystem::exists(localdefault)) settings.loadUser(localdefault); else if (boost::filesystem::exists(globaldefault)) settings.loadUser(globaldefault); // Get the path for the keybinder xml file std::string keybinderUser = (mCfgMgr.getUserPath() / "input.xml").string(); bool keybinderUserExists = boost::filesystem::exists(keybinderUser); mFpsLevel = settings.getInt("fps", "HUD"); // load nif overrides NifOverrides::Overrides nifOverrides; if (boost::filesystem::exists(mCfgMgr.getLocalPath().string() + "/transparency-overrides.cfg")) nifOverrides.loadTransparencyOverrides(mCfgMgr.getLocalPath().string() + "/transparency-overrides.cfg"); else if (boost::filesystem::exists(mCfgMgr.getGlobalPath().string() + "/transparency-overrides.cfg")) nifOverrides.loadTransparencyOverrides(mCfgMgr.getGlobalPath().string() + "/transparency-overrides.cfg"); std::string renderSystem = settings.getString("render system", "Video"); if (renderSystem == "") { #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 renderSystem = "Direct3D9 Rendering Subsystem"; #else renderSystem = "OpenGL Rendering Subsystem"; #endif } mOgre->configure( mCfgMgr.getLogPath().string(), renderSystem, Settings::Manager::getString("opengl rtt mode", "Video"), false); // This has to be added BEFORE MyGUI is initialized, as it needs // to find core.xml here. //addResourcesDirectory(mResDir); addResourcesDirectory(mCfgMgr.getCachePath ().string()); addResourcesDirectory(mResDir / "mygui"); addResourcesDirectory(mResDir / "water"); addResourcesDirectory(mResDir / "gbuffer"); addResourcesDirectory(mResDir / "shadows"); addZipResource(mResDir / "mygui" / "Obliviontt.zip"); // Create the window OEngine::Render::WindowSettings windowSettings; windowSettings.fullscreen = settings.getBool("fullscreen", "Video"); windowSettings.window_x = settings.getInt("resolution x", "Video"); windowSettings.window_y = settings.getInt("resolution y", "Video"); windowSettings.vsync = settings.getBool("vsync", "Video"); std::string aa = settings.getString("antialiasing", "Video"); windowSettings.fsaa = (aa.substr(0, 4) == "MSAA") ? aa.substr(5, aa.size()-5) : "0"; mOgre->createWindow("OpenMW", windowSettings); loadBSA(); // cursor replacer (converts the cursor from the bsa so they can be used by mygui) MWGui::CursorReplace replacer; // Create the world mEnvironment.setWorld (new MWWorld::World (*mOgre, mFileCollections, mMaster, mResDir, mCfgMgr.getCachePath(), mNewGame, mEncoding, mFallbackMap)); //Load translation data mTranslationDataStorage.loadTranslationData(mFileCollections, mMaster); // Create window manager - this manages all the MW-specific GUI windows MWScript::registerExtensions (mExtensions); mEnvironment.setWindowManager (new MWGui::WindowManager( mExtensions, mFpsLevel, mNewGame, mOgre, mCfgMgr.getLogPath().string() + std::string("/"), mCfgMgr.getCachePath ().string(), mScriptConsoleMode, mTranslationDataStorage)); // Create sound system mEnvironment.setSoundManager (new MWSound::SoundManager(mUseSound)); // Create script system mScriptContext = new MWScript::CompilerContext (MWScript::CompilerContext::Type_Full); mScriptContext->setExtensions (&mExtensions); mEnvironment.setScriptManager (new MWScript::ScriptManager (MWBase::Environment::get().getWorld()->getStore(), mVerboseScripts, *mScriptContext)); // Create game mechanics system mEnvironment.setMechanicsManager (new MWMechanics::MechanicsManager); // Create dialog system mEnvironment.setJournal (new MWDialogue::Journal); mEnvironment.setDialogueManager (new MWDialogue::DialogueManager (mExtensions, mVerboseScripts)); // Sets up the input system mEnvironment.setInputManager (new MWInput::InputManager (*mOgre, MWBase::Environment::get().getWorld()->getPlayer(), *MWBase::Environment::get().getWindowManager(), mDebug, *this, keybinderUser, keybinderUserExists)); // load cell ESM::Position pos; pos.rot[0] = pos.rot[1] = pos.rot[2] = 0; pos.pos[2] = 0; mEnvironment.getWorld()->renderPlayer(); if (const ESM::Cell *exterior = MWBase::Environment::get().getWorld()->getExterior (mCellName)) { MWBase::Environment::get().getWorld()->indexToPosition (exterior->mData.mX, exterior->mData.mY, pos.pos[0], pos.pos[1], true); MWBase::Environment::get().getWorld()->changeToExteriorCell (pos); } else { pos.pos[0] = pos.pos[1] = 0; MWBase::Environment::get().getWorld()->changeToInteriorCell (mCellName, pos); } std::cout << "\nPress Q/ESC or close window to exit.\n"; mOgre->getRoot()->addFrameListener (this); // Play some good 'ol tunes MWBase::Environment::get().getSoundManager()->playPlaylist(std::string("Explore")); // scripts if (mCompileAll) { std::pair<int, int> result = MWBase::Environment::get().getScriptManager()->compileAll(); if (result.first) std::cout << "compiled " << result.second << " of " << result.first << " scripts (" << 100*static_cast<double> (result.second)/result.first << "%)" << std::endl; } if (!mStartupScript.empty()) MWBase::Environment::get().getWindowManager()->executeInConsole (mStartupScript); // Start the main rendering loop mOgre->start(); // Save user settings settings.saveUser(settingspath); std::cout << "Quitting peacefully.\n"; }
void OMW::Engine::go() { assert (!mContentFiles.empty()); mViewer = new osgViewer::Viewer; osg::ref_ptr<osgViewer::StatsHandler> statshandler = new osgViewer::StatsHandler; statshandler->setKeyEventTogglesOnScreenStats(osgGA::GUIEventAdapter::KEY_F3); statshandler->addUserStatsLine("Script", osg::Vec4f(1.f, 1.f, 1.f, 1.f), osg::Vec4f(1.f, 1.f, 1.f, 1.f), "script_time_taken", 1000.0, true, false, "script_time_begin", "script_time_end", 10000); statshandler->addUserStatsLine("Mechanics", osg::Vec4f(1.f, 1.f, 1.f, 1.f), osg::Vec4f(1.f, 1.f, 1.f, 1.f), "mechanics_time_taken", 1000.0, true, false, "mechanics_time_begin", "mechanics_time_end", 10000); statshandler->addUserStatsLine("Physics", osg::Vec4f(1.f, 1.f, 1.f, 1.f), osg::Vec4f(1.f, 1.f, 1.f, 1.f), "physics_time_taken", 1000.0, true, false, "physics_time_begin", "physics_time_end", 10000); mViewer->addEventHandler(statshandler); Settings::Manager settings; std::string settingspath; settingspath = loadSettings (settings); mScreenCaptureHandler = new osgViewer::ScreenCaptureHandler(new WriteScreenshotToFileOperation(mCfgMgr.getUserDataPath().string(), Settings::Manager::getString("screenshot format", "General"))); mViewer->addEventHandler(mScreenCaptureHandler); // Create encoder ToUTF8::Utf8Encoder encoder (mEncoding); mEncoder = &encoder; prepareEngine (settings); if (!mSaveGameFile.empty()) { mEnvironment.getStateManager()->loadGame(mSaveGameFile); } else if (!mSkipMenu) { mEnvironment.getWorld()->preloadCommonAssets(); // start in main menu mEnvironment.getWindowManager()->pushGuiMode (MWGui::GM_MainMenu); try { // Is there an ini setting for this filename or something? mEnvironment.getSoundManager()->streamMusic("Special/morrowind title.mp3"); std::string logo = mFallbackMap["Movies_Morrowind_Logo"]; if (!logo.empty()) mEnvironment.getWindowManager()->playVideo(logo, true); } catch (...) {} } else { mEnvironment.getStateManager()->newGame (!mNewGame); } // Start the main rendering loop osg::Timer frameTimer; double simulationTime = 0.0; float framerateLimit = Settings::Manager::getFloat("framerate limit", "Video"); while (!mViewer->done() && !mEnvironment.getStateManager()->hasQuitRequest()) { double dt = frameTimer.time_s(); frameTimer.setStartTick(); dt = std::min(dt, 0.2); bool guiActive = mEnvironment.getWindowManager()->isGuiMode(); if (!guiActive) simulationTime += dt; mViewer->advance(simulationTime); frame(dt); if (!mEnvironment.getInputManager()->isWindowVisible()) { OpenThreads::Thread::microSleep(5000); continue; } else { mViewer->eventTraversal(); mViewer->updateTraversal(); mViewer->renderingTraversals(); } if (framerateLimit > 0.f) { double thisFrameTime = frameTimer.time_s(); double minFrameTime = 1.0 / framerateLimit; if (thisFrameTime < minFrameTime) { OpenThreads::Thread::microSleep(1000*1000*(minFrameTime-thisFrameTime)); } } } // Save user settings settings.saveUser(settingspath); std::cout << "Quitting peacefully." << std::endl; }
void OMW::Engine::createWindow(Settings::Manager& settings) { int screen = settings.getInt("screen", "Video"); int width = settings.getInt("resolution x", "Video"); int height = settings.getInt("resolution y", "Video"); bool fullscreen = settings.getBool("fullscreen", "Video"); bool windowBorder = settings.getBool("window border", "Video"); bool vsync = settings.getBool("vsync", "Video"); int antialiasing = settings.getInt("antialiasing", "Video"); int pos_x = SDL_WINDOWPOS_CENTERED_DISPLAY(screen), pos_y = SDL_WINDOWPOS_CENTERED_DISPLAY(screen); if(fullscreen) { pos_x = SDL_WINDOWPOS_UNDEFINED_DISPLAY(screen); pos_y = SDL_WINDOWPOS_UNDEFINED_DISPLAY(screen); } Uint32 flags = SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN|SDL_WINDOW_RESIZABLE; if(fullscreen) flags |= SDL_WINDOW_FULLSCREEN; if (!windowBorder) flags |= SDL_WINDOW_BORDERLESS; SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, settings.getBool("minimize on focus loss", "Video") ? "1" : "0"); checkSDLError(SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8)); checkSDLError(SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8)); checkSDLError(SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8)); checkSDLError(SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 0)); checkSDLError(SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24)); if (antialiasing > 0) { checkSDLError(SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1)); checkSDLError(SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, antialiasing)); } while (!mWindow) { mWindow = SDL_CreateWindow("OpenMW", pos_x, pos_y, width, height, flags); if (!mWindow) { // Try with a lower AA if (antialiasing > 0) { std::cout << "Note: " << antialiasing << "x antialiasing not supported, trying " << antialiasing/2 << std::endl; antialiasing /= 2; Settings::Manager::setInt("antialiasing", "Video", antialiasing); checkSDLError(SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, antialiasing)); continue; } else { std::stringstream error; error << "Failed to create SDL window: " << SDL_GetError() << std::endl; throw std::runtime_error(error.str()); } } } setWindowIcon(); osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; SDL_GetWindowPosition(mWindow, &traits->x, &traits->y); SDL_GetWindowSize(mWindow, &traits->width, &traits->height); traits->windowName = SDL_GetWindowTitle(mWindow); traits->windowDecoration = !(SDL_GetWindowFlags(mWindow)&SDL_WINDOW_BORDERLESS); traits->screenNum = SDL_GetWindowDisplayIndex(mWindow); // FIXME: Some way to get these settings back from the SDL window? traits->red = 8; traits->green = 8; traits->blue = 8; traits->alpha = 0; // set to 0 to stop ScreenCaptureHandler reading the alpha channel traits->depth = 24; traits->stencil = 8; traits->vsync = vsync; traits->doubleBuffer = true; traits->inheritedWindowData = new SDLUtil::GraphicsWindowSDL2::WindowData(mWindow); osg::ref_ptr<SDLUtil::GraphicsWindowSDL2> graphicsWindow = new SDLUtil::GraphicsWindowSDL2(traits); if(!graphicsWindow->valid()) throw std::runtime_error("Failed to create GraphicsContext"); osg::ref_ptr<osg::Camera> camera = mViewer->getCamera(); camera->setGraphicsContext(graphicsWindow); camera->setViewport(0, 0, width, height); mViewer->realize(); }
void OMW::Engine::prepareEngine (Settings::Manager & settings) { mEnvironment.setStateManager ( new MWState::StateManager (mCfgMgr.getUserDataPath() / "saves", mContentFiles.at (0))); Nif::NIFFile::CacheLock cachelock; std::string renderSystem = settings.getString("render system", "Video"); if (renderSystem == "") { #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 renderSystem = "Direct3D9 Rendering Subsystem"; #else renderSystem = "OpenGL Rendering Subsystem"; #endif } mOgre = new OEngine::Render::OgreRenderer; mOgre->configure( mCfgMgr.getLogPath().string(), renderSystem, Settings::Manager::getString("opengl rtt mode", "Video")); // This has to be added BEFORE MyGUI is initialized, as it needs // to find core.xml here. //addResourcesDirectory(mResDir); addResourcesDirectory(mCfgMgr.getCachePath ().string()); addResourcesDirectory(mResDir / "mygui"); addResourcesDirectory(mResDir / "water"); addResourcesDirectory(mResDir / "shadows"); OEngine::Render::WindowSettings windowSettings; windowSettings.fullscreen = settings.getBool("fullscreen", "Video"); windowSettings.window_x = settings.getInt("resolution x", "Video"); windowSettings.window_y = settings.getInt("resolution y", "Video"); windowSettings.screen = settings.getInt("screen", "Video"); windowSettings.vsync = settings.getBool("vsync", "Video"); windowSettings.icon = "openmw.png"; std::string aa = settings.getString("antialiasing", "Video"); windowSettings.fsaa = (aa.substr(0, 4) == "MSAA") ? aa.substr(5, aa.size()-5) : "0"; mOgre->createWindow("OpenMW", windowSettings); loadBSA(); // Create input and UI first to set up a bootstrapping environment for // showing a loading screen and keeping the window responsive while doing so std::string keybinderUser = (mCfgMgr.getUserConfigPath() / "input.xml").string(); bool keybinderUserExists = boost::filesystem::exists(keybinderUser); MWInput::InputManager* input = new MWInput::InputManager (*mOgre, *this, keybinderUser, keybinderUserExists, mGrab); mEnvironment.setInputManager (input); MWGui::WindowManager* window = new MWGui::WindowManager( mExtensions, mFpsLevel, mOgre, mCfgMgr.getLogPath().string() + std::string("/"), mCfgMgr.getCachePath ().string(), mScriptConsoleMode, mTranslationDataStorage, mEncoding); mEnvironment.setWindowManager (window); // Create the world mEnvironment.setWorld( new MWWorld::World (*mOgre, mFileCollections, mContentFiles, mResDir, mCfgMgr.getCachePath(), mEncoder, mFallbackMap, mActivationDistanceOverride)); MWBase::Environment::get().getWorld()->setupPlayer(); input->setPlayer(&mEnvironment.getWorld()->getPlayer()); window->initUI(); window->renderWorldMap(); //Load translation data mTranslationDataStorage.setEncoder(mEncoder); for (size_t i = 0; i < mContentFiles.size(); i++) mTranslationDataStorage.loadTranslationData(mFileCollections, mContentFiles[i]); Compiler::registerExtensions (mExtensions); // Create sound system mEnvironment.setSoundManager (new MWSound::SoundManager(mUseSound)); // Create script system mScriptContext = new MWScript::CompilerContext (MWScript::CompilerContext::Type_Full); mScriptContext->setExtensions (&mExtensions); mEnvironment.setScriptManager (new MWScript::ScriptManager (MWBase::Environment::get().getWorld()->getStore(), mVerboseScripts, *mScriptContext)); // Create game mechanics system MWMechanics::MechanicsManager* mechanics = new MWMechanics::MechanicsManager; mEnvironment.setMechanicsManager (mechanics); // Create dialog system mEnvironment.setJournal (new MWDialogue::Journal); mEnvironment.setDialogueManager (new MWDialogue::DialogueManager (mExtensions, mVerboseScripts, mTranslationDataStorage)); mEnvironment.getWorld()->renderPlayer(); mechanics->buildPlayer(); window->updatePlayer(); // load cell ESM::Position pos; MWBase::World *world = MWBase::Environment::get().getWorld(); if (!mCellName.empty()) { if (world->findExteriorPosition(mCellName, pos)) { world->changeToExteriorCell (pos); } else { world->findInteriorPosition(mCellName, pos); world->changeToInteriorCell (mCellName, pos); } } else { pos.pos[0] = pos.pos[1] = pos.pos[2] = 0; pos.rot[0] = pos.rot[1] = pos.pos[2] = 0; world->changeToExteriorCell (pos); } Ogre::FrameEvent event; event.timeSinceLastEvent = 0; event.timeSinceLastFrame = 0; frameRenderingQueued(event); mOgre->getRoot()->addFrameListener (this); // scripts if (mCompileAll) { std::pair<int, int> result = MWBase::Environment::get().getScriptManager()->compileAll(); if (result.first) std::cout << "compiled " << result.second << " of " << result.first << " scripts (" << 100*static_cast<double> (result.second)/result.first << "%)" << std::endl; } }
void ScCodeEditor::blinkCode( const QTextCursor & c ) { if( !c.document() || !c.hasSelection() ) return; Settings::Manager *settings = Main::settings(); QTextCharFormat evalCodeTextFormat = settings->getThemeVal("evaluatedCode"); QTextDocument *doc = c.document(); int startPos = c.selectionStart(); int endPos = c.selectionEnd(); QTextBlock startBlock = doc->findBlock(startPos); QTextBlock endBlock = doc->findBlock(endPos); startPos -= startBlock.position(); endPos -= endBlock.position(); // Get the bounds of visible blocks within the cursor's selection: QTextBlock block = firstVisibleBlock(); int idx = block.blockNumber(); int sidx = startBlock.blockNumber(); QTextBlock firstBlock, lastBlock; firstBlock = lastBlock = block; QRectF geom = blockBoundingGeometry(block).translated(contentOffset()); qreal top = geom.top(); qreal bottom = top; qreal width=0; while(block.isValid() && bottom < viewport()->rect().height()) { if(block.isVisible()) { QTextLayout *l = block.layout(); QRectF r = l->boundingRect(); bottom += r.height(); if(idx < sidx) { // Block not within the selection. Will skip it. top = bottom; } else { // Block within the selection. width = qMax(width, l->maximumWidth() + r.left()); } } if(block == endBlock) break; block = block.next(); ++idx; if(top == bottom) firstBlock = block; } lastBlock = block; if(bottom == top) { //qDebug("no visible block."); return; } // Construct a pixmap to render the code on: QPixmap pix( QSize(qCeil(width), qCeil(bottom - top)) ); pix.fill(QColor(0,0,0,0)); // Render the visible blocks: QPainter painter(&pix); QVector<QTextLayout::FormatRange> selections; block = firstBlock; int y=0; while( block.isValid() ) { if (block.isVisible()) { QRectF blockRect = block.layout()->boundingRect(); // Use extra char formatting to hide code outside of selection // and modify the appearance of selected code: QTextLayout::FormatRange range; selections.clear(); int start = 0; if(block == startBlock) { range.start = 0; range.length = startPos; range.format.setForeground(QColor(0,0,0,0)); range.format.setBackground(Qt::NoBrush); selections.append(range); start = startPos; } range.start = start; range.length = (block == endBlock ? endPos : block.length() - 1) - range.start; range.format = evalCodeTextFormat; selections.append(range); if(block == endBlock) { range.start = range.start + range.length; range.length = block.length() - 1 - range.start; range.format.setForeground(QColor(0,0,0,0)); range.format.setBackground(Qt::NoBrush); selections.append(range); } block.layout()->draw(&painter, QPointF(0,y), selections); y += blockRect.height(); } if(block == lastBlock) break; block = block.next(); } // Create an overlay item to display the pixmap, and animate it: CodeFragmentOverlay *item = new CodeFragmentOverlay(); item->setPixmap(pix); item->setPos(geom.left(), top); mOverlay->addItem(item); QPropertyAnimation *anim = new QPropertyAnimation(item, "opacity", item); anim->setDuration(mBlinkDuration); anim->setStartValue(1.0); anim->setEndValue(0.0); anim->setEasingCurve( QEasingCurve::InCubic ); anim->start(); connect(anim, SIGNAL(finished()), item, SLOT(deleteLater())); }
void OMW::Engine::go() { assert (!mContentFiles.empty()); Log(Debug::Info) << "OSG version: " << osgGetVersion(); // Load settings Settings::Manager settings; std::string settingspath; settingspath = loadSettings (settings); // Create encoder ToUTF8::Utf8Encoder encoder (mEncoding); mEncoder = &encoder; // Setup viewer mViewer = new osgViewer::Viewer; mViewer->setReleaseContextAtEndOfFrameHint(false); mScreenCaptureOperation = new WriteScreenshotToFileOperation(mCfgMgr.getUserDataPath().string(), Settings::Manager::getString("screenshot format", "General")); mScreenCaptureHandler = new osgViewer::ScreenCaptureHandler(mScreenCaptureOperation); mViewer->addEventHandler(mScreenCaptureHandler); mEnvironment.setFrameRateLimit(Settings::Manager::getFloat("framerate limit", "Video")); prepareEngine (settings); // Setup profiler osg::ref_ptr<Resource::Profiler> statshandler = new Resource::Profiler; statshandler->addUserStatsLine("Script", osg::Vec4f(1.f, 1.f, 1.f, 1.f), osg::Vec4f(1.f, 1.f, 1.f, 1.f), "script_time_taken", 1000.0, true, false, "script_time_begin", "script_time_end", 10000); statshandler->addUserStatsLine("Mechanics", osg::Vec4f(1.f, 1.f, 1.f, 1.f), osg::Vec4f(1.f, 1.f, 1.f, 1.f), "mechanics_time_taken", 1000.0, true, false, "mechanics_time_begin", "mechanics_time_end", 10000); statshandler->addUserStatsLine("Physics", osg::Vec4f(1.f, 1.f, 1.f, 1.f), osg::Vec4f(1.f, 1.f, 1.f, 1.f), "physics_time_taken", 1000.0, true, false, "physics_time_begin", "physics_time_end", 10000); mViewer->addEventHandler(statshandler); osg::ref_ptr<Resource::StatsHandler> resourceshandler = new Resource::StatsHandler; mViewer->addEventHandler(resourceshandler); // Start the game if (!mSaveGameFile.empty()) { mEnvironment.getStateManager()->loadGame(mSaveGameFile); } else if (!mSkipMenu) { // start in main menu mEnvironment.getWindowManager()->pushGuiMode (MWGui::GM_MainMenu); try { // Is there an ini setting for this filename or something? mEnvironment.getSoundManager()->streamMusic("Special/morrowind title.mp3"); std::string logo = mFallbackMap["Movies_Morrowind_Logo"]; if (!logo.empty()) mEnvironment.getWindowManager()->playVideo(logo, true); } catch (...) {} } else { mEnvironment.getStateManager()->newGame (!mNewGame); } // Start the main rendering loop osg::Timer frameTimer; double simulationTime = 0.0; while (!mViewer->done() && !mEnvironment.getStateManager()->hasQuitRequest()) { double dt = frameTimer.time_s(); frameTimer.setStartTick(); dt = std::min(dt, 0.2); mViewer->advance(simulationTime); if (!frame(dt)) { OpenThreads::Thread::microSleep(5000); continue; } else { mViewer->eventTraversal(); mViewer->updateTraversal(); mEnvironment.getWorld()->updateWindowManager(); mViewer->renderingTraversals(); bool guiActive = mEnvironment.getWindowManager()->isGuiMode(); if (!guiActive) simulationTime += dt; } mEnvironment.limitFrameRate(frameTimer.time_s()); } // Save user settings settings.saveUser(settingspath); Log(Debug::Info) << "Quitting peacefully."; }
void OMW::Engine::prepareEngine (Settings::Manager & settings) { Nif::NIFFile::CacheLock cachelock; std::string renderSystem = settings.getString("render system", "Video"); if (renderSystem == "") { #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 renderSystem = "Direct3D9 Rendering Subsystem"; #else renderSystem = "OpenGL Rendering Subsystem"; #endif } mOgre = new OEngine::Render::OgreRenderer; mOgre->configure( mCfgMgr.getLogPath().string(), renderSystem, Settings::Manager::getString("opengl rtt mode", "Video"), false); // This has to be added BEFORE MyGUI is initialized, as it needs // to find core.xml here. //addResourcesDirectory(mResDir); addResourcesDirectory(mCfgMgr.getCachePath ().string()); addResourcesDirectory(mResDir / "mygui"); addResourcesDirectory(mResDir / "water"); addResourcesDirectory(mResDir / "gbuffer"); addResourcesDirectory(mResDir / "shadows"); addZipResource(mResDir / "mygui" / "Obliviontt.zip"); // Create the window OEngine::Render::WindowSettings windowSettings; windowSettings.fullscreen = settings.getBool("fullscreen", "Video"); windowSettings.window_x = settings.getInt("resolution x", "Video"); windowSettings.window_y = settings.getInt("resolution y", "Video"); windowSettings.vsync = settings.getBool("vsync", "Video"); std::string aa = settings.getString("antialiasing", "Video"); windowSettings.fsaa = (aa.substr(0, 4) == "MSAA") ? aa.substr(5, aa.size()-5) : "0"; mOgre->createWindow("OpenMW", windowSettings); loadBSA(); // cursor replacer (converts the cursor from the bsa so they can be used by mygui) MWGui::CursorReplace replacer; // Create the world mEnvironment.setWorld (new MWWorld::World (*mOgre, mFileCollections, mMaster, mResDir, mCfgMgr.getCachePath(), mNewGame, mEncoder, mFallbackMap, mActivationDistanceOverride)); //Load translation data mTranslationDataStorage.setEncoder(mEncoder); mTranslationDataStorage.loadTranslationData(mFileCollections, mMaster); // Create window manager - this manages all the MW-specific GUI windows MWScript::registerExtensions (mExtensions); mEnvironment.setWindowManager (new MWGui::WindowManager( mExtensions, mFpsLevel, mNewGame, mOgre, mCfgMgr.getLogPath().string() + std::string("/"), mCfgMgr.getCachePath ().string(), mScriptConsoleMode, mTranslationDataStorage)); // Create sound system mEnvironment.setSoundManager (new MWSound::SoundManager(mUseSound)); // Create script system mScriptContext = new MWScript::CompilerContext (MWScript::CompilerContext::Type_Full); mScriptContext->setExtensions (&mExtensions); mEnvironment.setScriptManager (new MWScript::ScriptManager (MWBase::Environment::get().getWorld()->getStore(), mVerboseScripts, *mScriptContext)); // Create game mechanics system mEnvironment.setMechanicsManager (new MWMechanics::MechanicsManager); // Create dialog system mEnvironment.setJournal (new MWDialogue::Journal); mEnvironment.setDialogueManager (new MWDialogue::DialogueManager (mExtensions, mVerboseScripts, mTranslationDataStorage)); // Sets up the input system // Get the path for the keybinder xml file std::string keybinderUser = (mCfgMgr.getUserPath() / "input.xml").string(); bool keybinderUserExists = boost::filesystem::exists(keybinderUser); mEnvironment.setInputManager (new MWInput::InputManager (*mOgre, MWBase::Environment::get().getWorld()->getPlayer(), *MWBase::Environment::get().getWindowManager(), mDebug, *this, keybinderUser, keybinderUserExists)); // load cell ESM::Position pos; pos.rot[0] = pos.rot[1] = pos.rot[2] = 0; pos.pos[2] = 0; mEnvironment.getWorld()->renderPlayer(); if (const ESM::Cell *exterior = MWBase::Environment::get().getWorld()->getExterior (mCellName)) { MWBase::Environment::get().getWorld()->indexToPosition (exterior->mData.mX, exterior->mData.mY, pos.pos[0], pos.pos[1], true); MWBase::Environment::get().getWorld()->changeToExteriorCell (pos); } else { pos.pos[0] = pos.pos[1] = 0; MWBase::Environment::get().getWorld()->changeToInteriorCell (mCellName, pos); } mOgre->getRoot()->addFrameListener (this); // scripts if (mCompileAll) { std::pair<int, int> result = MWBase::Environment::get().getScriptManager()->compileAll(); if (result.first) std::cout << "compiled " << result.second << " of " << result.first << " scripts (" << 100*static_cast<double> (result.second)/result.first << "%)" << std::endl; } }
void OMW::Engine::go() { assert (!mCellName.empty()); assert (!mMaster.empty()); assert (!mOgre); mOgre = new OEngine::Render::OgreRenderer; //we need to ensure the path to the configuration exists before creating an //instance of ogre root so that Ogre doesn't raise an exception when trying to //access it const boost::filesystem::path configPath = mCfgMgr.getOgreConfigPath().parent_path(); if ( !boost::filesystem::exists(configPath) ) { boost::filesystem::create_directories(configPath); } // Create the settings manager and load default settings file Settings::Manager settings; const std::string localdefault = mCfgMgr.getLocalPath().string() + "/settings-default.cfg"; const std::string globaldefault = mCfgMgr.getGlobalPath().string() + "/settings-default.cfg"; // prefer local if (boost::filesystem::exists(localdefault)) settings.loadDefault(localdefault); else if (boost::filesystem::exists(globaldefault)) settings.loadDefault(globaldefault); // load user settings if they exist, otherwise just load the default settings as user settings const std::string settingspath = mCfgMgr.getUserPath().string() + "/settings.cfg"; if (boost::filesystem::exists(settingspath)) settings.loadUser(settingspath); else if (boost::filesystem::exists(localdefault)) settings.loadUser(localdefault); else if (boost::filesystem::exists(globaldefault)) settings.loadUser(globaldefault); mFpsLevel = settings.getInt("fps", "HUD"); // load nif overrides NifOverrides::Overrides nifOverrides; if (boost::filesystem::exists(mCfgMgr.getLocalPath().string() + "/transparency-overrides.cfg")) nifOverrides.loadTransparencyOverrides(mCfgMgr.getLocalPath().string() + "/transparency-overrides.cfg"); else if (boost::filesystem::exists(mCfgMgr.getGlobalPath().string() + "/transparency-overrides.cfg")) nifOverrides.loadTransparencyOverrides(mCfgMgr.getGlobalPath().string() + "/transparency-overrides.cfg"); mOgre->configure(!boost::filesystem::is_regular_file(mCfgMgr.getOgreConfigPath()), mCfgMgr.getOgreConfigPath().string(), mCfgMgr.getLogPath().string(), mCfgMgr.getPluginsConfigPath().string(), false); // This has to be added BEFORE MyGUI is initialized, as it needs // to find core.xml here. //addResourcesDirectory(mResDir); addResourcesDirectory(mResDir / "mygui"); addResourcesDirectory(mResDir / "water"); addResourcesDirectory(mResDir / "gbuffer"); addResourcesDirectory(mResDir / "shadows"); // Create the window mOgre->createWindow("OpenMW"); loadBSA(); // cursor replacer (converts the cursor from the bsa so they can be used by mygui) MWGui::CursorReplace replacer; // Create the world mEnvironment.setWorld (new MWWorld::World (*mOgre, mFileCollections, mMaster, mResDir, mNewGame, mEncoding, mFallbackMap)); // Create window manager - this manages all the MW-specific GUI windows MWScript::registerExtensions (mExtensions); mEnvironment.setWindowManager (new MWGui::WindowManager( mExtensions, mFpsLevel, mNewGame, mOgre, mCfgMgr.getLogPath().string() + std::string("/"))); // Create sound system mEnvironment.setSoundManager (new MWSound::SoundManager(mUseSound)); // Create script system mScriptContext = new MWScript::CompilerContext (MWScript::CompilerContext::Type_Full); mScriptContext->setExtensions (&mExtensions); mEnvironment.setScriptManager (new MWScript::ScriptManager (MWBase::Environment::get().getWorld()->getStore(), mVerboseScripts, *mScriptContext)); // Create game mechanics system mEnvironment.setMechanicsManager (new MWMechanics::MechanicsManager); // Create dialog system mEnvironment.setJournal (new MWDialogue::Journal); mEnvironment.setDialogueManager (new MWDialogue::DialogueManager (mExtensions)); // load cell ESM::Position pos; pos.rot[0] = pos.rot[1] = pos.rot[2] = 0; pos.pos[2] = 0; if (const ESM::Cell *exterior = MWBase::Environment::get().getWorld()->getExterior (mCellName)) { MWBase::Environment::get().getWorld()->indexToPosition (exterior->data.gridX, exterior->data.gridY, pos.pos[0], pos.pos[1], true); MWBase::Environment::get().getWorld()->changeToExteriorCell (pos); } else { pos.pos[0] = pos.pos[1] = 0; MWBase::Environment::get().getWorld()->changeToInteriorCell (mCellName, pos); } // Sets up the input system mEnvironment.setInputManager (new MWInput::MWInputManager (*mOgre, MWBase::Environment::get().getWorld()->getPlayer(), *MWBase::Environment::get().getWindowManager(), mDebug, *this)); std::cout << "\nPress Q/ESC or close window to exit.\n"; mOgre->getRoot()->addFrameListener (this); // Play some good 'ol tunes MWBase::Environment::get().getSoundManager()->playPlaylist(std::string("Explore")); // scripts if (mCompileAll) { std::pair<int, int> result = MWBase::Environment::get().getScriptManager()->compileAll(); if (result.first) std::cout << "compiled " << result.second << " of " << result.first << " scripts (" << 100*static_cast<double> (result.second)/result.first << "%)" << std::endl; } // Start the main rendering loop mOgre->start(); // Save user settings settings.saveUser(settingspath); std::cout << "Quitting peacefully.\n"; }
TextFindReplacePanel::TextFindReplacePanel( QWidget * parent ): QWidget(parent), mMode((Mode) 0), // a hack so that first setMode() works mEditor(0), mSearchPosition(-1) { mFindField = new QLineEdit; mReplaceField = new QLineEdit; mNextBtn = new QToolButton(); mNextBtn->setIcon( style()->standardIcon( QStyle::SP_ArrowForward ) ); mNextBtn->setToolTip( tr("Find Next") ); mPrevBtn = new QToolButton(); mPrevBtn->setIcon( style()->standardIcon( QStyle::SP_ArrowBack ) ); mPrevBtn->setToolTip( tr("Find Previous") ); mReplaceBtn = new QToolButton(); mReplaceBtn->setText(tr("Replace")); mReplaceAllBtn = new QToolButton(); mReplaceAllBtn->setText(tr("Replace All")); mOptionsBtn = new QToolButton(); mOptionsBtn->setText(tr("Options")); mOptionsBtn->setIcon( QIcon::fromTheme("preferences-other") ); mOptionsBtn->setPopupMode(QToolButton::InstantPopup); QMenu *optMenu = new QMenu(this); mMatchCaseAction = optMenu->addAction(tr("Match Case")); mMatchCaseAction->setCheckable(true); mRegExpAction = optMenu->addAction(tr("Regular Expression")); mRegExpAction->setCheckable(true); mWholeWordAction = optMenu->addAction(tr("Whole Words")); mWholeWordAction->setCheckable(true); mOptionsBtn->setMenu(optMenu); mFindLabel = new QLabel(tr("Find:")); mFindLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); mReplaceLabel = new QLabel(tr("Replace:")); mReplaceLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); mGrid = new QGridLayout(); mGrid->setContentsMargins(0,0,0,0); mGrid->setSpacing(2); QHBoxLayout *findBtnLayout = new QHBoxLayout(); findBtnLayout->setContentsMargins(0,0,0,0); findBtnLayout->setSpacing(1); findBtnLayout->addWidget(mPrevBtn); findBtnLayout->addWidget(mNextBtn); findBtnLayout->addStretch(0); findBtnLayout->addWidget(mOptionsBtn); mGrid->addWidget(mFindLabel, 0, 0); mGrid->addWidget(mFindField, 0, 1); mGrid->addLayout(findBtnLayout, 0, 2); QHBoxLayout *replaceBtnLayout = new QHBoxLayout(); replaceBtnLayout->setContentsMargins(0,0,0,0); replaceBtnLayout->setSpacing(1); replaceBtnLayout->addWidget(mReplaceBtn); replaceBtnLayout->addWidget(mReplaceAllBtn); replaceBtnLayout->addStretch(0); mGrid->addWidget(mReplaceLabel, 1, 0); mGrid->addWidget(mReplaceField, 1, 1); mGrid->addLayout(replaceBtnLayout, 1, 2); mGrid->setColumnStretch(1,1); setLayout(mGrid); setMode(Find); setFocusProxy(mFindField); QWidget::setTabOrder(mFindField, mReplaceField); mFindField->installEventFilter(this); connect(mNextBtn, SIGNAL(clicked()), this, SLOT(findNext())); connect(mPrevBtn, SIGNAL(clicked()), this, SLOT(findPrevious())); connect(mReplaceBtn, SIGNAL(clicked()), this, SLOT(replace())); connect(mReplaceAllBtn, SIGNAL(clicked()), this, SLOT(replaceAll())); connect(mFindField, SIGNAL(returnPressed()), this, SLOT(onFindFieldReturn())); connect(mFindField, SIGNAL(textChanged(QString)), this, SLOT(onFindFieldTextChanged())); connect(mReplaceField, SIGNAL(returnPressed()), this, SLOT(replace())); // Update search results when options change: connect(optMenu, SIGNAL(triggered(QAction*)), this, SLOT(findAll())); Settings::Manager *settings = Main::settings(); QAction *action; action = mActions[FindNext] = new QAction(tr("Find Next"), this); action->setShortcut(tr("Ctrl+G", "Find Next")); connect( action, SIGNAL(triggered()), this, SLOT(findNext()) ); settings->addAction( action, "editor-find-next", tr("Text Editor") ); action = mActions[FindPrevious] = new QAction(tr("Find Previous"), this); action->setShortcut(tr("Ctrl+Shift+G", "Find Previous")); connect( action, SIGNAL(triggered()), this, SLOT(findPrevious()) ); settings->addAction( action, "editor-find-previous", tr("Text Editor") ); }
void OMW::Engine::createWindow(Settings::Manager& settings) { int screen = settings.getInt("screen", "Video"); int width = settings.getInt("resolution x", "Video"); int height = settings.getInt("resolution y", "Video"); bool fullscreen = settings.getBool("fullscreen", "Video"); bool windowBorder = settings.getBool("window border", "Video"); bool vsync = settings.getBool("vsync", "Video"); int antialiasing = settings.getInt("antialiasing", "Video"); int pos_x = SDL_WINDOWPOS_CENTERED_DISPLAY(screen), pos_y = SDL_WINDOWPOS_CENTERED_DISPLAY(screen); if(fullscreen) { pos_x = SDL_WINDOWPOS_UNDEFINED_DISPLAY(screen); pos_y = SDL_WINDOWPOS_UNDEFINED_DISPLAY(screen); } Uint32 flags = SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN|SDL_WINDOW_RESIZABLE; if(fullscreen) flags |= SDL_WINDOW_FULLSCREEN; if (!windowBorder) flags |= SDL_WINDOW_BORDERLESS; SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, settings.getBool("minimize on focus loss", "Video") ? "1" : "0"); checkSDLError(SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8)); checkSDLError(SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8)); checkSDLError(SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8)); checkSDLError(SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 0)); checkSDLError(SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24)); if (antialiasing > 0) { checkSDLError(SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1)); checkSDLError(SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, antialiasing)); } while (!mWindow) { mWindow = SDL_CreateWindow("OpenMW", pos_x, pos_y, width, height, flags); if (!mWindow) { // Try with a lower AA if (antialiasing > 0) { Log(Debug::Warning) << "Warning: " << antialiasing << "x antialiasing not supported, trying " << antialiasing/2; antialiasing /= 2; Settings::Manager::setInt("antialiasing", "Video", antialiasing); checkSDLError(SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, antialiasing)); continue; } else { std::stringstream error; error << "Failed to create SDL window: " << SDL_GetError(); throw std::runtime_error(error.str()); } } } setWindowIcon(); osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; SDL_GetWindowPosition(mWindow, &traits->x, &traits->y); SDL_GetWindowSize(mWindow, &traits->width, &traits->height); traits->windowName = SDL_GetWindowTitle(mWindow); traits->windowDecoration = !(SDL_GetWindowFlags(mWindow)&SDL_WINDOW_BORDERLESS); traits->screenNum = SDL_GetWindowDisplayIndex(mWindow); // We tried to get rid of the hardcoding but failed: https://github.com/OpenMW/openmw/pull/1771 // Here goes kcat's quote: // It's ultimately a chicken and egg problem, and the reason why the code is like it was in the first place. // It needs a context to get the current attributes, but it needs the attributes to set up the context. // So it just specifies the same values that were given to SDL in the hopes that it's good enough to what the window eventually gets. traits->red = 8; traits->green = 8; traits->blue = 8; traits->alpha = 0; // set to 0 to stop ScreenCaptureHandler reading the alpha channel traits->depth = 24; traits->stencil = 8; traits->vsync = vsync; traits->doubleBuffer = true; traits->inheritedWindowData = new SDLUtil::GraphicsWindowSDL2::WindowData(mWindow); osg::ref_ptr<SDLUtil::GraphicsWindowSDL2> graphicsWindow = new SDLUtil::GraphicsWindowSDL2(traits); if(!graphicsWindow->valid()) throw std::runtime_error("Failed to create GraphicsContext"); osg::ref_ptr<osg::Camera> camera = mViewer->getCamera(); camera->setGraphicsContext(graphicsWindow); camera->setViewport(0, 0, width, height); mViewer->realize(); mViewer->getEventQueue()->getCurrentEventState()->setWindowRectangle(0, 0, width, height); }
void MainWindow::createMenus() { Settings::Manager *s = mMain->settings(); s->beginGroup("IDE/shortcuts"); new QShortcut( s->shortcut("cmdLineFocus"), this, SLOT(toggleComandLineFocus()) ); QAction *act; // File mActions[Quit] = act = new QAction( QIcon::fromTheme("application-exit"), tr("&Quit..."), this); act->setShortcut(s->shortcut("quit")); act->setStatusTip(tr("Quit SuperCollider IDE")); QObject::connect( act, SIGNAL(triggered()), this, SLOT(onQuit()) ); // View mActions[ShowDocList] = act = new QAction(tr("&Documents"), this); act->setStatusTip(tr("Show/Hide the Documents dock")); act->setCheckable(true); connect(act, SIGNAL(triggered(bool)), mDocListDock, SLOT(setVisible(bool))); connect(mDocListDock, SIGNAL(visibilityChanged(bool)), act, SLOT(setChecked(bool))); // Language mActions[EvaluateCurrentFile] = act = new QAction( QIcon::fromTheme("media-playback-start"), tr("Evaluate &File"), this); act->setStatusTip(tr("Evaluate current File")); connect(act, SIGNAL(triggered()), this, SLOT(evaluateCurrentFile())); mActions[EvaluateSelection] = act = new QAction( QIcon::fromTheme("media-playback-start"), tr("&Evaluate Selection"), this); act->setShortcut(s->shortcut("evaluateSelection")); act->setStatusTip(tr("Evaluate selection or current line")); connect(act, SIGNAL(triggered()), this, SLOT(evaluateSelection())); mActions[EvaluateRegion] = act = new QAction( QIcon::fromTheme("media-playback-start"), tr("&Evaluate Region"), this); act->setShortcut(s->shortcut("evaluateRegion")); act->setStatusTip(tr("Evaluate current region")); connect(act, SIGNAL(triggered()), this, SLOT(evaluateRegion())); mMain->scProcess()->action(ScIDE::SCProcess::StopMain) ->setShortcut(s->shortcut("stopMain")); // Settings mActions[ShowSettings] = act = new QAction(tr("&Configure IDE..."), this); act->setStatusTip(tr("Show configuration dialog")); connect(act, SIGNAL(triggered()), this, SLOT(showSettings())); // Help mActions[BrowseHelp] = act = new QAction( QIcon::fromTheme("system-help"), tr("&Browse Help"), this); act->setStatusTip(tr("Open help browser on the Browse page.")); //connect(act, SIGNAL(triggered()), this, SLOT(browseHelp())); mCodeEvalMapper.setMapping(act, "HelpBrowser.openBrowsePage"); connect(act, SIGNAL(triggered()), &mCodeEvalMapper, SLOT(map())); mActions[SearchHelp] = act = new QAction( QIcon::fromTheme("system-help"), tr("&Search Help"), this); act->setStatusTip(tr("Open help browser on the Search page.")); //connect(act, SIGNAL(triggered()), this, SLOT(searchHelp())); mCodeEvalMapper.setMapping(act, "HelpBrowser.openSearchPage"); connect(act, SIGNAL(triggered()), &mCodeEvalMapper, SLOT(map())); mActions[HelpForSelection] = act = new QAction( QIcon::fromTheme("system-help"), tr("&Help for Selection"), this); act->setShortcut(s->shortcut("helpForSelection")); act->setStatusTip(tr("Find help for selected text")); connect(act, SIGNAL(triggered()), this, SLOT(helpForSelection())); s->endGroup(); // IDE/shortcuts; QMenu *menu; QMenu *submenu; menu = new QMenu(tr("&File"), this); menu->addAction( mEditors->action(MultiEditor::DocNew) ); menu->addAction( mEditors->action(MultiEditor::DocOpen) ); menu->addAction( mEditors->action(MultiEditor::DocSave) ); menu->addAction( mEditors->action(MultiEditor::DocSaveAs) ); menu->addSeparator(); menu->addAction( mEditors->action(MultiEditor::DocClose) ); menu->addSeparator(); menu->addAction( mActions[Quit] ); menuBar()->addMenu(menu); menu = new QMenu(tr("&Edit"), this); menu->addAction( mEditors->action(MultiEditor::Undo) ); menu->addAction( mEditors->action(MultiEditor::Redo) ); menu->addSeparator(); menu->addAction( mEditors->action(MultiEditor::Cut) ); menu->addAction( mEditors->action(MultiEditor::Copy) ); menu->addAction( mEditors->action(MultiEditor::Paste) ); menu->addSeparator(); menu->addAction( mEditors->action(MultiEditor::Find) ); menu->addAction( mEditors->action(MultiEditor::Replace) ); menu->addSeparator(); menu->addAction( mEditors->action(MultiEditor::IndentMore) ); menu->addAction( mEditors->action(MultiEditor::IndentLess) ); menu->addSeparator(); menu->addAction( mEditors->action(MultiEditor::OpenClassDefinition) ); menuBar()->addMenu(menu); menu = new QMenu(tr("&View"), this); submenu = new QMenu(tr("&Docks"), this); submenu->addAction( mActions[ShowDocList] ); menu->addMenu(submenu); menu->addSeparator(); menu->addAction( mEditors->action(MultiEditor::EnlargeFont) ); menu->addAction( mEditors->action(MultiEditor::ShrinkFont) ); menu->addSeparator(); menu->addAction( mEditors->action(MultiEditor::ShowWhitespace) ); menuBar()->addMenu(menu); menu = new QMenu(tr("&Language"), this); menu->addAction( mMain->scProcess()->action(SCProcess::StartSCLang) ); menu->addAction( mMain->scProcess()->action(SCProcess::RecompileClassLibrary) ); menu->addAction( mMain->scProcess()->action(SCProcess::StopSCLang) ); menu->addSeparator(); menu->addAction( mActions[EvaluateCurrentFile] ); menu->addAction( mActions[EvaluateRegion] ); menu->addAction( mActions[EvaluateSelection] ); menu->addSeparator(); menu->addAction( mMain->scProcess()->action(ScIDE::SCProcess::RunMain) ); menu->addAction( mMain->scProcess()->action(ScIDE::SCProcess::StopMain) ); menuBar()->addMenu(menu); menu = new QMenu(tr("&Settings"), this); menu->addAction( mActions[ShowSettings] ); menuBar()->addMenu(menu); menu = new QMenu(tr("&Help"), this); menu->addAction( mActions[BrowseHelp] ); menu->addAction( mActions[SearchHelp] ); menu->addAction( mActions[HelpForSelection] ); menuBar()->addMenu(menu); }
void Document::resetDefaultFont() { Settings::Manager *settings = Main::settings(); setDefaultFont( settings->codeFont() ); }
int main( int argc, char *argv[] ) { QApplication app(argc, argv); QStringList arguments (QApplication::arguments()); arguments.pop_front(); // application path // Pass files to existing instance and quit SingleInstanceGuard guard; if (guard.tryConnect(arguments)) return 0; // Set up translations QTranslator qtTranslator; qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); app.installTranslator(&qtTranslator); char resourcePath[PATH_MAX]; sc_GetResourceDirectory(resourcePath, PATH_MAX); QString ideTranslationPath = QString(resourcePath) + "/translations"; bool translationLoaded; // Load fallback translator that only handles plural forms in English QTranslator fallbackTranslator; translationLoaded = fallbackTranslator.load( "scide", ideTranslationPath ); app.installTranslator(&fallbackTranslator); if (!translationLoaded) qWarning("scide warning: Failed to load fallback translation file."); // Load translator for locale QString ideTranslationFile = "scide_" + QLocale::system().name(); QTranslator scideTranslator; scideTranslator.load( ideTranslationFile, ideTranslationPath ); app.installTranslator(&scideTranslator); // Set up style app.setStyle( new ScIDE::Style(app.style()) ); // Go... Main * main = Main::instance(); MainWindow *win = new MainWindow(main); // NOTE: load session after GUI is created, so that GUI can respond Settings::Manager *settings = main->settings(); SessionManager *sessions = main->sessionManager(); // NOTE: window has to be shown before restoring its geometry, // or else restoring maximized state will fail, if it has ever before // been saved un-maximized. win->show(); QString startSessionName = settings->value("IDE/startWithSession").toString(); if (startSessionName == "last") { QString lastSession = sessions->lastSession(); if (!lastSession.isEmpty()) { sessions->openSession(lastSession); } } else if (!startSessionName.isEmpty()) { sessions->openSession(startSessionName); } if (!sessions->currentSession()) { win->restoreWindowState(); sessions->newSession(); } foreach (QString argument, arguments) { main->documentManager()->open(argument); }