OSDN Git Service

[Qt][Draw][GL] SCREEN: Display even minify zooming.
[csp-qt/common_source_project-fm7.git] / source / src / qt / gui / menu_screen.cpp
1 /*
2  * Common Source code Project:
3  * Ui->Qt->gui->menu_main for generic.
4  * (C) 2015 K.Ohta <whatisthis.sowhat _at_ gmail.com>
5  *   License : GPLv2
6  *   History :
7  * Jan 14, 2015 : Initial, moved from qt/x1turboz/MainWindow.cpp .
8  */
9
10 #include <QtCore/QVariant>
11 #include <QtGui>
12 #include "commonclasses.h"
13 #include "mainwidget.h"
14 //#include "menuclasses.h"
15 #include "emu.h"
16 #include "qt_main.h"
17 #include "qt_gldraw.h"
18
19 QT_BEGIN_NAMESPACE
20
21 #if (SCREEN_WIDTH > 320)
22 const static float screen_multiply_table[] = {0.5, 1.0, 1.5, 2.0, 2.25, 2.5, 3.0, 3.5, 4.0, 5.0, 6.0, 8.0, 0.0};
23 #else
24 const static float screen_multiply_table[] = {0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 5.0, 6.0, 7.5, 10.0, 12.0, 15.0, 0.0};
25 #endif
26 void Object_Menu_Control::set_screen_aspect(void) {
27         int num = getValue1();
28         emit sig_screen_aspect(num);
29 }
30
31 void Object_Menu_Control::set_screen_size(void) {
32         int w, h;
33         float nd;
34         config.window_mode = getNumber();
35         nd = (float)getDoubleValue();
36         w = (int)(nd * (double)SCREEN_WIDTH);
37         h = (int)(nd * (double)SCREEN_HEIGHT);
38 #if defined(USE_CRT_MONITOR_4_3)
39         if(config.stretch_type == 1) {
40                 h = (int)((double)h * ((double)SCREEN_WIDTH / (double)SCREEN_HEIGHT * 3.0 / 4.0));
41         } else if(config.stretch_type == 2) {
42                 w = (int)((double)w * (4.0 / (3.0 * (double)SCREEN_WIDTH / (double)SCREEN_HEIGHT)));
43         }
44 #endif
45         emit sig_screen_size(w, h);
46         emit sig_screen_multiply(nd);
47 }
48
49 void Ui_MainWindow::set_gl_scan_line_vert(bool f)
50 {
51         config.opengl_scanline_vert = f;
52 }
53
54 void Ui_MainWindow::set_gl_scan_line_horiz(bool f)
55 {
56         config.opengl_scanline_horiz = f;
57 }
58
59 void Ui_MainWindow::ConfigScreenMenu_List(void)
60 {
61         int w, h;
62         QString tmps;
63         int i;
64         
65         actionGroup_ScreenSize = new QActionGroup(this);
66         actionGroup_ScreenSize->setExclusive(true);
67         screen_mode_count = 0;
68         for(i = 0; i < _SCREEN_MODE_NUM; i++) {
69                 w = (int)(screen_multiply_table[i] * (double)SCREEN_WIDTH);
70                 h = (int)(screen_multiply_table[i] * (double)SCREEN_HEIGHT);
71                 if((w <= 0) || (h <= 0)) {
72                         break;
73                 }
74                 screen_mode_count++;
75                 tmps = QString::number(i);
76                 actionScreenSize[i] = new Action_Control(this);
77                 actionScreenSize[i]->setObjectName(QString::fromUtf8("actionScreenSize", -1) + tmps);
78                 actionScreenSize[i]->setCheckable(true);
79                 actionScreenSize[i]->binds->setNumber(i);
80
81                 if(i == config.window_mode)  actionScreenSize[i]->setChecked(true);  // OK?
82
83                 actionGroup_ScreenSize->addAction(actionScreenSize[i]);
84                 actionScreenSize[i]->binds->setDoubleValue(screen_multiply_table[i]);
85                 
86                 connect(actionScreenSize[i], SIGNAL(triggered()),
87                         actionScreenSize[i]->binds, SLOT(set_screen_size()));
88
89                 connect(actionScreenSize[i]->binds, SIGNAL(sig_screen_size(int, int)),
90                         this, SLOT(set_screen_size(int, int)));
91         }
92         for(; i < _SCREEN_MODE_NUM; i++) {
93                 actionScreenSize[i] = NULL;
94         }
95 }
96   
97 void Ui_MainWindow::ConfigScreenMenu(void)
98 {
99         actionZoom = new Action_Control(this);
100         actionZoom->setObjectName(QString::fromUtf8("actionZoom"));
101         actionDisplay_Mode = new Action_Control(this);
102         actionDisplay_Mode->setObjectName(QString::fromUtf8("actionDisplay_Mode"));
103         
104 #ifdef USE_SCANLINE
105         actionScanLine = new Action_Control(this);
106         actionScanLine->setObjectName(QString::fromUtf8("actionScanLine"));
107         actionScanLine->setCheckable(true);
108         if(config.scan_line != 0) {
109                 actionScanLine->setChecked(true);
110         } else {
111                 actionScanLine->setChecked(false);
112         }
113         connect(actionScanLine, SIGNAL(toggled(bool)),
114                 this, SLOT(set_scan_line(bool)));
115 #endif
116 #if !defined(ONE_BOARD_MICRO_COMPUTER) && !defined(MAX_BUTTONS)
117         actionGLScanLineHoriz = new Action_Control(this);
118         actionGLScanLineHoriz->setObjectName(QString::fromUtf8("actionGLScanLineHoriz"));
119         actionGLScanLineHoriz->setCheckable(true);
120         if(config.opengl_scanline_horiz != 0) {
121                 actionGLScanLineHoriz->setChecked(true);
122         } else {
123                 actionGLScanLineHoriz->setChecked(false);
124         }
125         connect(actionGLScanLineHoriz, SIGNAL(toggled(bool)),
126                         this, SLOT(set_gl_scan_line_horiz(bool)));
127 # if defined(USE_VERTICAL_PIXEL_LINES)  
128         actionGLScanLineVert = new Action_Control(this);
129         actionGLScanLineVert->setObjectName(QString::fromUtf8("actionGLScanLineVert"));
130         actionGLScanLineVert->setCheckable(true);
131         if(config.opengl_scanline_vert != 0) {
132                 actionGLScanLineVert->setChecked(true);
133         } else {
134                 actionGLScanLineVert->setChecked(false);
135         }
136         connect(actionGLScanLineVert, SIGNAL(toggled(bool)),
137                         this, SLOT(set_gl_scan_line_vert(bool)));
138 # endif
139 #endif  
140 #ifdef USE_SCREEN_ROTATE
141         actionRotate = new Action_Control(this);
142         actionRotate->setObjectName(QString::fromUtf8("actionScanLine"));
143         actionRotate->setCheckable(true);
144         if(config.rotate_type) {
145                 actionRotate->setChecked(true);
146         } else {
147                 actionRotate->setChecked(false);
148         }
149         connect(actionRotate, SIGNAL(toggled(bool)),
150                 this, SLOT(set_screen_rotate(bool)));
151 #endif
152         
153 #ifdef USE_CRT_FILTER
154         actionCRT_Filter = new Action_Control(this);
155         actionCRT_Filter->setObjectName(QString::fromUtf8("actionCRT_Filter"));
156         actionCRT_Filter->setEnabled(true);
157         actionCRT_Filter->setCheckable(true);
158         if(config.crt_filter == 0) actionCRT_Filter->setChecked(true);
159         connect(actionCRT_Filter, SIGNAL(toggled(bool)), this, SLOT(set_crt_filter(bool)));
160 #endif
161         actionOpenGL_Filter = new Action_Control(this);
162         actionOpenGL_Filter->setObjectName(QString::fromUtf8("actionOpenGL_Filter"));
163         actionOpenGL_Filter->setEnabled(true);
164         actionOpenGL_Filter->setCheckable(true);
165         if(config.use_opengl_filters) actionOpenGL_Filter->setChecked(true);
166         connect(actionOpenGL_Filter, SIGNAL(toggled(bool)), this, SLOT(set_gl_crt_filter(bool)));
167
168 #if defined(USE_CRT_MONITOR_4_3)        
169         actionDot_by_Dot = new Action_Control(this);
170         actionDot_by_Dot->setObjectName(QString::fromUtf8("actionDot_by_Dot"));
171         actionDot_by_Dot->setCheckable(true);
172         if(config.stretch_type == 0) actionDot_by_Dot->setChecked(true);
173         actionDot_by_Dot->binds->setValue1(0);
174         
175         actionKeep_Aspect = new Action_Control(this);
176         actionKeep_Aspect->setObjectName(QString::fromUtf8("actionKeep_Aspect"));
177         actionKeep_Aspect->setCheckable(true);
178         actionKeep_Aspect->binds->setValue1(1);
179         if(config.stretch_type == 1) actionKeep_Aspect->setChecked(true);
180         
181         actionFill_Display = new Action_Control(this);
182         actionFill_Display->setObjectName(QString::fromUtf8("actionFill_Display"));
183         actionFill_Display->setCheckable(true);
184         actionFill_Display->binds->setValue1(2);
185         if(config.stretch_type == 2) actionFill_Display->setChecked(true);
186
187         actionGroup_Stretch = new QActionGroup(this);
188         actionGroup_Stretch->setExclusive(true);
189         actionGroup_Stretch->addAction(actionDot_by_Dot);
190         actionGroup_Stretch->addAction(actionKeep_Aspect);
191         actionGroup_Stretch->addAction(actionFill_Display);
192         connect(actionDot_by_Dot,   SIGNAL(triggered()), actionDot_by_Dot->binds,   SLOT(set_screen_aspect()));
193         connect(actionDot_by_Dot->binds,   SIGNAL(sig_screen_aspect(int)), this,    SLOT(set_screen_aspect(int)));
194         
195         connect(actionKeep_Aspect,  SIGNAL(triggered()), actionKeep_Aspect->binds,  SLOT(set_screen_aspect()));
196         connect(actionKeep_Aspect->binds,  SIGNAL(sig_screen_aspect(int)), this,    SLOT(set_screen_aspect(int)));
197         
198         connect(actionFill_Display, SIGNAL(triggered()), actionFill_Display->binds, SLOT(set_screen_aspect()));
199         connect(actionFill_Display->binds, SIGNAL(sig_screen_aspect(int)), this, SLOT(set_screen_aspect(int)));
200 #endif  
201         actionCapture_Screen = new Action_Control(this);
202         actionCapture_Screen->setObjectName(QString::fromUtf8("actionCapture_Screen"));
203
204         actionStart_Record_Movie = new Action_Control(this);
205         actionStart_Record_Movie->setObjectName(QString::fromUtf8("actionStart_Record_Movie"));
206         actionStart_Record_Movie->setCheckable(true);
207         
208         actionStop_Record_Movie = new Action_Control(this);
209         actionStop_Record_Movie->setObjectName(QString::fromUtf8("actionStop_Record_Movie"));
210         actionStop_Record_Movie->setCheckable(false);
211
212         ConfigScreenMenu_List();  
213 }
214
215 void Ui_MainWindow::CreateScreenMenu(void)
216 {
217         int i;
218         menuScreen = new QMenu(menubar);
219         menuScreen->setObjectName(QString::fromUtf8("menuScreen"));
220 #if defined(USE_CRT_MONITOR_4_3)        
221         menuStretch_Mode = new QMenu(menuScreen);
222         menuStretch_Mode->setObjectName(QString::fromUtf8("menuStretch_Mode"));
223 #endif
224         menuScreenSize = new QMenu(menuScreen);
225         menuScreenSize->setObjectName(QString::fromUtf8("menuScreen_Size"));
226         menuScreen->addSeparator();
227         menuRecord_as_movie = new QMenu(menuScreen);
228         menuRecord_as_movie->setObjectName(QString::fromUtf8("menuRecord_as_movie"));
229
230         menuScreen->addAction(actionZoom);
231         menuScreen->addAction(menuScreenSize->menuAction());
232         for(i = 0; i < _SCREEN_MODE_NUM; i++) {
233                 if(actionScreenSize[i] == NULL) continue;
234                 menuScreenSize->addAction(actionScreenSize[i]);
235                 actionScreenSize[i]->setVisible(true);
236         }
237 #if defined(USE_CRT_MONITOR_4_3)        
238         menuScreen->addSeparator();
239         menuScreen->addAction(menuStretch_Mode->menuAction());
240
241         menuStretch_Mode->addAction(actionDot_by_Dot);
242         menuStretch_Mode->addAction(actionKeep_Aspect);
243         menuStretch_Mode->addAction(actionFill_Display);
244 #endif
245         menuScreen->addSeparator();
246 #ifdef USE_SCANLINE
247         menuScreen->addAction(actionScanLine);
248 #endif
249 #if !defined(ONE_BOARD_MICRO_COMPUTER) && !defined(MAX_BUTTONS)
250         menuScreen->addAction(actionGLScanLineHoriz);
251 # ifdef USE_VERTICAL_PIXEL_LINES        
252         menuScreen->addAction(actionGLScanLineVert);
253 # endif
254 #endif  
255 #ifdef USE_SCREEN_ROTATE
256         menuScreen->addAction(actionRotate);
257 #endif
258 #ifdef USE_CRT_FILTER
259         menuScreen->addAction(actionCRT_Filter);
260 #endif   
261         menuScreen->addAction(actionOpenGL_Filter);
262         menuScreen->addAction(actionCapture_Screen);
263         menuScreen->addSeparator();
264         menuScreen->addAction(menuRecord_as_movie->menuAction());
265         menuRecord_as_movie->addAction(actionStart_Record_Movie);
266         menuRecord_as_movie->addAction(actionStop_Record_Movie);
267 }
268
269 void Ui_MainWindow::retranslateScreenMenu(void)
270 {
271         int i;
272         QString tmps;
273         int w, h;
274         actionZoom->setText(QApplication::translate("MainWindow", "Zoom Screen", 0));
275         actionDisplay_Mode->setText(QApplication::translate("MainWindow", "Display Mode", 0));
276 #ifdef USE_SCANLINE
277         actionScanLine->setText(QApplication::translate("MainWindow", "Set ScanLine", 0));
278 #endif
279 #ifdef USE_SCREEN_ROTATE
280         actionRotate->setText(QApplication::translate("MainWindow", "Rotate Screen", 0));
281 #endif   
282 #ifdef USE_CRT_FILTER
283         actionCRT_Filter->setText(QApplication::translate("MainWindow", "CRT Filter", 0));
284 #endif
285 #if !defined(ONE_BOARD_MICRO_COMPUTER) && !defined(MAX_BUTTONS)
286         actionGLScanLineHoriz->setText(QApplication::translate("MainWindow", "OpenGL Scan Line", 0));
287 # if defined(USE_VERTICAL_PIXEL_LINES)  
288         actionGLScanLineVert->setText(QApplication::translate("MainWindow", "OpenGL Pixel Line", 0));
289 # endif
290 #endif
291         actionOpenGL_Filter->setText(QApplication::translate("MainWindow", "OpenGL Filter", 0));
292 #if defined(USE_CRT_MONITOR_4_3)        
293         actionDot_by_Dot->setText(QApplication::translate("MainWindow", "Dot by Dot", 0));
294         actionKeep_Aspect->setText(QApplication::translate("MainWindow", "Keep Aspect: Refer to X", 0));
295         actionFill_Display->setText(QApplication::translate("MainWindow", "Keep Aspect: Refer to Y", 0));
296 #endif  
297         actionCapture_Screen->setText(QApplication::translate("MainWindow", "Capture Screen", 0));
298
299         menuScreen->setTitle(QApplication::translate("MainWindow", "Screen", 0));
300 #if defined(USE_CRT_MONITOR_4_3)        
301         menuStretch_Mode->setTitle(QApplication::translate("MainWindow", "Stretch Mode", 0));
302 #endif
303         
304         actionStart_Record_Movie->setText(QApplication::translate("MainWindow", "Start Record Movie", 0));
305         actionStop_Record_Movie->setText(QApplication::translate("MainWindow", "Stop Record Movie", 0));
306
307         menuRecord_as_movie->setTitle(QApplication::translate("MainWindow", "Record as movie", 0));
308
309
310         menuScreenSize->setTitle(QApplication::translate("MainWindow", "Screen size", 0));
311         double s_mul;
312         for(i = 0; i < _SCREEN_MODE_NUM; i++) {
313                 if(actionScreenSize[i] == NULL) continue;
314                 s_mul = screen_multiply_table[i];
315                 if(s_mul <= 0) break;
316                 tmps = QString::number(s_mul);
317                 tmps = QString::fromUtf8("x", -1) + tmps;
318                 actionScreenSize[i]->setText(tmps);
319         }
320 }
321