void Stack::setMargins(int footer, int header) { m_footer_margin = footer; m_header_margin = header; m_footer_visible = (m_footer_visible != 0) ? -m_footer_margin : 0; m_header_visible = (m_header_visible != 0) ? m_header_margin : 0; updateMargin(); updateBackground(); updateMask(); showHeader(); }
void Stack::themeSelected(const Theme& theme) { m_theme = theme; if (m_symbols_dialog) { m_symbols_dialog->setPreviewFont(m_theme.textFont()); } updateMargin(); updateBackground(); for (Document* document : m_documents) { document->loadTheme(theme); } }
Window::Window() : m_toolbar(0), m_fullscreen(true), m_typewriter_sounds(true), m_auto_save(true), m_save_positions(true), m_goal_type(0), m_time_goal(0), m_wordcount_goal(0), m_current_time(0), m_current_wordcount(0) { setAcceptDrops(true); setAttribute(Qt::WA_DeleteOnClose); setContextMenuPolicy(Qt::NoContextMenu); setWindowIcon(QIcon(":/focuswriter.png")); // Set up icons if (QIcon::themeName().isEmpty()) { QIcon::setThemeName("hicolor"); setIconSize(QSize(22,22)); } // Create window contents first so they stack behind documents menuBar(); m_toolbar = new QToolBar(this); m_toolbar->setFloatable(false); m_toolbar->setMovable(false); addToolBar(m_toolbar); QWidget* contents = new QWidget(this); setCentralWidget(contents); // Create documents m_documents = new Stack(this); m_sessions = new SessionManager(this); m_timers = new TimerManager(m_documents, this); m_load_screen = new LoadScreen(this); connect(m_documents, SIGNAL(footerVisible(bool)), m_timers->display(), SLOT(setVisible(bool))); connect(m_documents, SIGNAL(formattingEnabled(bool)), this, SLOT(setFormattingEnabled(bool))); connect(m_documents, SIGNAL(updateFormatActions()), this, SLOT(updateFormatActions())); connect(m_documents, SIGNAL(updateFormatAlignmentActions()), this, SLOT(updateFormatAlignmentActions())); connect(m_documents, SIGNAL(updateFormatHeadingActions()), this, SLOT(updateFormatHeadingActions())); connect(m_sessions, SIGNAL(themeChanged(Theme)), m_documents, SLOT(themeSelected(Theme))); // Set up menubar and toolbar initMenus(); // Set up details m_footer = new QWidget(contents); QWidget* details = new QWidget(m_footer); m_wordcount_label = new QLabel(tr("Words: 0"), details); m_page_label = new QLabel(tr("Pages: 0"), details); m_paragraph_label = new QLabel(tr("Paragraphs: 0"), details); m_character_label = new QLabel(tr("Characters: 0"), details); m_progress_label = new QLabel(tr("0% of daily goal"), details); m_clock_label = new QLabel(details); updateClock(); // Set up clock m_clock_timer = new QTimer(this); m_clock_timer->setInterval(60000); connect(m_clock_timer, SIGNAL(timeout()), this, SLOT(updateClock())); connect(m_clock_timer, SIGNAL(timeout()), m_timers, SLOT(saveTimers())); int delay = (60 - QTime::currentTime().second()) * 1000; QTimer::singleShot(delay, m_clock_timer, SLOT(start())); QTimer::singleShot(delay, this, SLOT(updateClock())); // Set up tabs m_tabs = new QTabBar(m_footer); m_tabs->setShape(QTabBar::RoundedSouth); m_tabs->setDocumentMode(true); m_tabs->setExpanding(false); m_tabs->setMovable(true); m_tabs->setTabsClosable(true); m_tabs->setUsesScrollButtons(true); connect(m_tabs, SIGNAL(currentChanged(int)), this, SLOT(tabClicked(int))); connect(m_tabs, SIGNAL(tabCloseRequested(int)), this, SLOT(tabClosed(int))); connect(m_tabs, SIGNAL(tabMoved(int, int)), this, SLOT(tabMoved(int, int))); new QShortcut(QKeySequence::NextChild, this, SLOT(nextDocument())); new QShortcut(QKeySequence::PreviousChild, this, SLOT(previousDocument())); // Lay out details QHBoxLayout* clock_layout = new QHBoxLayout; clock_layout->setMargin(0); clock_layout->setSpacing(6); clock_layout->addWidget(m_timers->display(), 0, Qt::AlignCenter); clock_layout->addWidget(m_clock_label); QHBoxLayout* details_layout = new QHBoxLayout(details); details_layout->setSpacing(25); details_layout->setMargin(6); details_layout->addWidget(m_wordcount_label); details_layout->addWidget(m_page_label); details_layout->addWidget(m_paragraph_label); details_layout->addWidget(m_character_label); details_layout->addStretch(); details_layout->addWidget(m_progress_label); details_layout->addStretch(); details_layout->addLayout(clock_layout); // Lay out footer QVBoxLayout* footer_layout = new QVBoxLayout(m_footer); footer_layout->setSpacing(0); footer_layout->setMargin(0); footer_layout->addWidget(details); footer_layout->addWidget(m_tabs); // Lay out window QVBoxLayout* layout = new QVBoxLayout(contents); layout->setSpacing(0); layout->setMargin(0); layout->addStretch(); layout->addWidget(m_footer); // Load current daily progress QSettings settings; if (settings.value("Progress/Date").toDate() != QDate::currentDate()) { settings.remove("Progress"); } settings.setValue("Progress/Date", QDate::currentDate().toString(Qt::ISODate)); m_current_wordcount = settings.value("Progress/Words", 0).toInt(); m_current_time = settings.value("Progress/Time", 0).toInt(); updateProgress(); // Load settings Preferences preferences; loadPreferences(preferences); m_documents->themeSelected(settings.value("ThemeManager/Theme").toString()); // Restore window geometry setMinimumSize(640, 480); resize(800, 600); restoreGeometry(settings.value("Window/Geometry").toByteArray()); m_fullscreen = !settings.value("Window/Fullscreen", true).toBool(); toggleFullscreen(); m_actions["Fullscreen"]->setChecked(m_fullscreen); show(); // Update themes m_load_screen->setText(tr("Loading themes")); Theme::copyBackgrounds(); // Load sounds m_load_screen->setText(tr("Loading sounds")); m_key_sound = new Sound("keyany.wav", this); m_enter_key_sound = new Sound("keyenter.wav", this); // Update margin m_tabs->blockSignals(true); m_tabs->addTab(tr("Untitled")); updateMargin(); m_tabs->removeTab(0); m_tabs->blockSignals(false); // Open previous documents QString session = settings.value("SessionManager/Session").toString(); QStringList files = QApplication::arguments().mid(1); if (!files.isEmpty()) { session.clear(); settings.setValue("Save/Current", files); settings.setValue("Save/Positions", QStringList()); settings.setValue("Save/Active", 0); } m_sessions->setCurrent(session); }