#pragma once #include "common/Singleton.hpp" #include "singletons/Resources.hpp" #include #include namespace chatterino { class TwitchServer; class PubSub; class CommandController; class HighlightController; class IgnoreController; class TaggedUsersController; class AccountController; class ModerationActions; class NotificationController; class Theme; class WindowManager; class Logging; class Paths; class AccountManager; class Emotes; class Settings; class Fonts; class Resources; class Application { std::vector> singletons_; int argc_; char **argv_; public: static Application *instance; Application(Settings &settings, Paths &paths); void initialize(Settings &settings, Paths &paths); void load(); void save(); int run(QApplication &qtApp); friend void test(); Settings *const settings{}; Paths *const paths{}; Resources2 *const resources; Theme *const themes{}; Fonts *const fonts{}; Emotes *const emotes{}; WindowManager *const windows{}; AccountController *const accounts{}; CommandController *const commands{}; HighlightController *const highlights{}; NotificationController *const notifications{}; IgnoreController *const ignores{}; TaggedUsersController *const taggedUsers{}; ModerationActions *const moderationActions{}; TwitchServer *const twitch2{}; /*[[deprecated]]*/ Logging *const logging{}; /// Provider-specific struct { /*[[deprecated("use twitch2 instead")]]*/ TwitchServer *server{}; /*[[deprecated("use twitch2->pubsub instead")]]*/ PubSub *pubsub{}; } twitch; private: void addSingleton(Singleton *singleton); void initPubsub(); void initNm(); template ::value>> T &emplace() { auto t = new T; this->singletons_.push_back(std::unique_ptr(t)); return *t; } }; Application *getApp(); } // namespace chatterino