format: shorten date by simple truncation
[ncmpcpp.git] / src / screen.cpp
blob5c436941ae952c7f752a645f7b10d30b6e8e0eaf
1 /***************************************************************************
2 * Copyright (C) 2008-2014 by Andrzej Rybczak *
3 * electricityispower@gmail.com *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
19 ***************************************************************************/
21 #include <cassert>
23 #include "global.h"
24 #include "screen.h"
25 #include "settings.h"
27 using Global::myScreen;
28 using Global::myLockedScreen;
29 using Global::myInactiveScreen;
31 void drawSeparator(int x)
33 color_set(Config.main_color.pairNumber(), nullptr);
34 mvvline(Global::MainStartY, x, 0, Global::MainHeight);
35 standend();
36 refresh();
39 void genericMouseButtonPressed(NC::Window &w, MEVENT me)
41 if (me.bstate & BUTTON5_PRESSED)
43 if (Config.mouse_list_scroll_whole_page)
44 w.scroll(NC::Scroll::PageDown);
45 else
46 for (size_t i = 0; i < Config.lines_scrolled; ++i)
47 w.scroll(NC::Scroll::Down);
49 else if (me.bstate & BUTTON4_PRESSED)
51 if (Config.mouse_list_scroll_whole_page)
52 w.scroll(NC::Scroll::PageUp);
53 else
54 for (size_t i = 0; i < Config.lines_scrolled; ++i)
55 w.scroll(NC::Scroll::Up);
59 void scrollpadMouseButtonPressed(NC::Scrollpad &w, MEVENT me)
61 if (me.bstate & BUTTON5_PRESSED)
63 for (size_t i = 0; i < Config.lines_scrolled; ++i)
64 w.scroll(NC::Scroll::Down);
66 else if (me.bstate & BUTTON4_PRESSED)
68 for (size_t i = 0; i < Config.lines_scrolled; ++i)
69 w.scroll(NC::Scroll::Up);
73 /***********************************************************************/
75 void BaseScreen::getWindowResizeParams(size_t &x_offset, size_t &width, bool adjust_locked_screen)
77 width = COLS;
78 x_offset = 0;
79 if (myLockedScreen && myInactiveScreen)
81 size_t locked_width = COLS*Config.locked_screen_width_part;
82 if (myLockedScreen == this)
83 width = locked_width;
84 else
86 width = COLS-locked_width-1;
87 x_offset = locked_width+1;
89 if (adjust_locked_screen)
91 myLockedScreen->resize();
92 myLockedScreen->refresh();
93 drawSeparator(x_offset-1);
99 bool BaseScreen::lock()
101 assert(myLockedScreen == nullptr);
102 if (isLockable())
104 myLockedScreen = this;
105 return true;
107 else
108 return false;
111 void BaseScreen::unlock()
113 if (myInactiveScreen && myInactiveScreen != myLockedScreen)
114 myScreen = myInactiveScreen;
115 if (myScreen != myLockedScreen)
116 myLockedScreen->switchTo();
117 myLockedScreen = 0;
118 myInactiveScreen = 0;
121 /***********************************************************************/
123 void applyToVisibleWindows(std::function<void(BaseScreen *)> f)
125 if (myLockedScreen && myScreen->isMergable())
127 if (myScreen == myLockedScreen)
129 if (myInactiveScreen)
130 f(myInactiveScreen);
132 else
133 f(myLockedScreen);
135 f(myScreen);
138 void updateInactiveScreen(BaseScreen *screen_to_be_set)
140 if (myInactiveScreen && myLockedScreen != myInactiveScreen && myLockedScreen == screen_to_be_set)
142 // if we're here, the following conditions are (or at least should be) met:
143 // 1. screen is split (myInactiveScreen is not null)
144 // 2. current screen (myScreen) is not splittable, ie. is stacked on top of split screens
145 // 3. current screen was activated while master screen was active
146 // 4. we are returning to master screen
147 // in such case we want to keep slave screen visible, so we never set it to null
148 // as in "else" case. we also need to refresh it and redraw separator between
149 // them as stacked screen probably has overwritten part ot it.
150 myInactiveScreen->refresh();
151 drawSeparator(COLS*Config.locked_screen_width_part);
153 else
155 if (myLockedScreen == screen_to_be_set)
156 myInactiveScreen = 0;
157 else
158 myInactiveScreen = myLockedScreen;
162 bool isVisible(BaseScreen *screen)
164 assert(screen != 0);
165 if (myLockedScreen && myScreen->isMergable())
166 return screen == myScreen || screen == myInactiveScreen || screen == myLockedScreen;
167 else
168 return screen == myScreen;