diff --git a/src/screen.h b/src/screen.h index a4b5c07e..0f1b6993 100644 --- a/src/screen.h +++ b/src/screen.h @@ -30,90 +30,89 @@ void scrollpadMouseButtonPressed(NC::Scrollpad *w, MEVENT me); /// An interface for various instantiations of Screen template class. Since C++ doesn't like /// comparison of two different instantiations of the same template class we need the most /// basic class to be non-template to allow it. -class BasicScreen +struct BasicScreen { - public: - /// Initializes all variables to zero - BasicScreen() : hasToBeResized(0), isInitialized(0) { } - - virtual ~BasicScreen() { } - - /// @see Screen::activeWindow() - virtual NC::Window *activeWindow() = 0; - - /// @see Screen::refresh() - virtual void refresh() = 0; - - /// @see Screen::refreshWindow() - virtual void refreshWindow() = 0; - - /// @see Screen::scroll() - virtual void scroll(NC::Where where) = 0; - - /// Method used for switching to screen - virtual void switchTo() = 0; - - /// Method that should resize screen - /// if requested by hasToBeResized - virtual void resize() = 0; - - /// @return title of the screen - virtual std::wstring title() = 0; - - /// If the screen contantly has to update itself - /// somehow, it should be called by this function. - virtual void update() = 0; - - /// Invoked after Enter was pressed - virtual void enterPressed() = 0; - - /// Invoked after Space was pressed - virtual void spacePressed() = 0; - - /// @see Screen::mouseButtonPressed() - virtual void mouseButtonPressed(MEVENT me) = 0; - - /// When this is overwritten with a function returning true, the - /// screen will be used in tab switching. - virtual bool isTabbable() = 0; - - /// @return true if screen is mergable, ie. can be "proper" subwindow - /// if one of the screens is locked. Screens that somehow resemble popups - /// will want to return false here. - virtual bool isMergable() = 0; - - /// Locks current screen. - /// @return true if lock was successful, false otherwise. Note that - /// if there is already locked screen, it'll not overwrite it. - bool lock(); - - /// Should be set to true each time screen needs resize - bool hasToBeResized; - - /// Unlocks a screen, ie. hides merged window (if there is one set). - static void unlock(); - - protected: - /// Since screens initialization is lazy, we don't want to do - /// this in the constructor. This function should be invoked - /// only once and after that isInitialized flag has to be set - /// to true to somehow avoid next attempt of initialization. - virtual void init() = 0; - - /// @return true if screen can be locked. Note that returning - /// false here doesn't neccesarily mean that screen is also not - /// mergable (eg. lyrics screen is not lockable since that wouldn't - /// make much sense, but it's perfectly fine to merge it). - virtual bool isLockable() = 0; - - /// Gets X offset and width of current screen to be used eg. in resize() function. - /// @param adjust_locked_screen indicates whether this function should - /// automatically adjust locked screen's dimensions (if there is one set) - /// if current screen is going to be subwindow. - void getWindowResizeParams(size_t &x_offset, size_t &width, bool adjust_locked_screen = true); - - /// Flag that inditates whether the screen is initialized or not - bool isInitialized; + /// Initializes all variables to zero + BasicScreen() : hasToBeResized(0), isInitialized(0) { } + + virtual ~BasicScreen() { } + + /// @see Screen::activeWindow() + virtual NC::Window *activeWindow() = 0; + + /// @see Screen::refresh() + virtual void refresh() = 0; + + /// @see Screen::refreshWindow() + virtual void refreshWindow() = 0; + + /// @see Screen::scroll() + virtual void scroll(NC::Where where) = 0; + + /// Method used for switching to screen + virtual void switchTo() = 0; + + /// Method that should resize screen + /// if requested by hasToBeResized + virtual void resize() = 0; + + /// @return title of the screen + virtual std::wstring title() = 0; + + /// If the screen contantly has to update itself + /// somehow, it should be called by this function. + virtual void update() = 0; + + /// Invoked after Enter was pressed + virtual void enterPressed() = 0; + + /// Invoked after Space was pressed + virtual void spacePressed() = 0; + + /// @see Screen::mouseButtonPressed() + virtual void mouseButtonPressed(MEVENT me) = 0; + + /// When this is overwritten with a function returning true, the + /// screen will be used in tab switching. + virtual bool isTabbable() = 0; + + /// @return true if screen is mergable, ie. can be "proper" subwindow + /// if one of the screens is locked. Screens that somehow resemble popups + /// will want to return false here. + virtual bool isMergable() = 0; + + /// Locks current screen. + /// @return true if lock was successful, false otherwise. Note that + /// if there is already locked screen, it'll not overwrite it. + bool lock(); + + /// Should be set to true each time screen needs resize + bool hasToBeResized; + + /// Unlocks a screen, ie. hides merged window (if there is one set). + static void unlock(); + +protected: + /// Since screens initialization is lazy, we don't want to do + /// this in the constructor. This function should be invoked + /// only once and after that isInitialized flag has to be set + /// to true to somehow avoid next attempt of initialization. + virtual void init() = 0; + + /// @return true if screen can be locked. Note that returning + /// false here doesn't neccesarily mean that screen is also not + /// mergable (eg. lyrics screen is not lockable since that wouldn't + /// make much sense, but it's perfectly fine to merge it). + virtual bool isLockable() = 0; + + /// Gets X offset and width of current screen to be used eg. in resize() function. + /// @param adjust_locked_screen indicates whether this function should + /// automatically adjust locked screen's dimensions (if there is one set) + /// if current screen is going to be subwindow. + void getWindowResizeParams(size_t &x_offset, size_t &width, bool adjust_locked_screen = true); + + /// Flag that inditates whether the screen is initialized or not + bool isInitialized; }; void applyToVisibleWindows(void (BasicScreen::*f)()); @@ -124,58 +123,57 @@ bool isVisible(BasicScreen *screen); /// for the screen to be working properly and assumes that we didn't forget /// about anything vital. /// -template class Screen : public BasicScreen +template struct Screen : public BasicScreen { - public: - typedef WindowT ScreenType; - - Screen() : w(0) { } - virtual ~Screen() { } - - /// Since some screens contain more that one window - /// it's useful to determine the one that is being - /// active - /// @return address to window object cast to void * - virtual NC::Window *activeWindow() OVERRIDE { - return w; - } - - /// Refreshes whole screen - virtual void refresh() OVERRIDE { - w->display(); - } - - /// Refreshes active window of the screen - virtual void refreshWindow() OVERRIDE { - w->display(); - } - - /// Scrolls the screen by given amount of lines and - /// if fancy scrolling feature is disabled, enters the - /// loop that holds main loop until user releases the key - /// @param where indicates where one wants to scroll - virtual void scroll(NC::Where where) OVERRIDE { - w->scroll(where); - } - - /// Invoked after there was one of mouse buttons pressed - /// @param me struct that contains coords of where the click - /// had its place and button actions - virtual void mouseButtonPressed(MEVENT me) OVERRIDE { - genericMouseButtonPressed(w, me); - } - - /// @return pointer to currently active window - WindowT *main() { - return w; - } - - protected: - /// Template parameter that should indicate the main type - /// of window used by the screen. What is more, it should - /// always be assigned to the currently active window (if - /// acreen contains more that one) - WindowT *w; + typedef WindowT ScreenType; + + Screen() : w(0) { } + virtual ~Screen() { } + + /// Since some screens contain more that one window + /// it's useful to determine the one that is being + /// active + /// @return address to window object cast to void * + virtual NC::Window *activeWindow() OVERRIDE { + return w; + } + + /// Refreshes whole screen + virtual void refresh() OVERRIDE { + w->display(); + } + + /// Refreshes active window of the screen + virtual void refreshWindow() OVERRIDE { + w->display(); + } + + /// Scrolls the screen by given amount of lines and + /// if fancy scrolling feature is disabled, enters the + /// loop that holds main loop until user releases the key + /// @param where indicates where one wants to scroll + virtual void scroll(NC::Where where) OVERRIDE { + w->scroll(where); + } + + /// Invoked after there was one of mouse buttons pressed + /// @param me struct that contains coords of where the click + /// had its place and button actions + virtual void mouseButtonPressed(MEVENT me) OVERRIDE { + genericMouseButtonPressed(w, me); + } + + /// @return pointer to currently active window + WindowT *main() { + return w; + } + +protected: + /// Template parameter that should indicate the main type + /// of window used by the screen. What is more, it should + /// always be assigned to the currently active window (if + /// acreen contains more that one) + WindowT *w; }; /// Specialization for Screen::mouseButtonPressed, that should diff --git a/src/settings.h b/src/settings.h index 6f17791b..9e48a08b 100644 --- a/src/settings.h +++ b/src/settings.h @@ -27,7 +27,7 @@ #include "actions.h" #include "strbuffer.h" -class BasicScreen; // forward declaration for screens sequence +struct BasicScreen; // forward declaration for screens sequence enum SortMode { smName, smMTime, smCustomFormat };