Freeciv-3.4
Loading...
Searching...
No Matches
mpgui_qt.cpp
Go to the documentation of this file.
1/***********************************************************************
2 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2, or (at your option)
6 any later version.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12***********************************************************************/
13
14#ifdef HAVE_CONFIG_H
15#include <fc_config.h>
16#endif
17
18// Qt
19#include <QApplication>
20#include <QCloseEvent>
21#include <QHBoxLayout>
22#include <QHeaderView>
23#include <QLabel>
24#include <QLineEdit>
25#include <QMainWindow>
26#include <QMessageBox>
27#include <QProgressBar>
28#include <QPushButton>
29#include <QTableWidget>
30#include <QVBoxLayout>
31
32// utility
33#include "executable.h"
34#include "fc_cmdline.h"
35#include "fciconv.h"
36#include "fcintl.h"
37#include "log.h"
38
39// common
40#include "version.h"
41
42// tools
43#include "download.h"
44#include "mpcmdline.h"
45#include "mpdb.h"
46#include "mpgui_qt_worker.h"
47#include "modinst.h"
48
49#include "mpgui_qt.h"
50
51struct fcmp_params fcmp = { MODPACK_LIST_URL, nullptr, nullptr };
52
53static mpgui *gui;
54
55static mpqt_worker *worker = nullptr;
56
57static int mpcount = 0;
58
59#define ML_COL_NAME 0
60#define ML_COL_VER 1
61#define ML_COL_INST 2
62#define ML_COL_TYPE 3
63#define ML_COL_SUBTYPE 4
64#define ML_COL_LIC 5
65#define ML_COL_URL 6
66
67#define ML_TYPE 7
68
69#define ML_COL_COUNT 8
70
71static void setup_modpack_list(const char *name, const char *URL,
72 const char *version, const char *license,
73 enum modpack_type type, const char *subtype,
74 const char *notes);
75static void msg_callback(const char *msg);
76static void msg_callback_thr(const char *msg);
77static void progress_callback_thr(int downloaded, int max);
78
79static void gui_download_modpack(QString URL);
80
81/**********************************************************************/
84int main(int argc, char **argv)
85{
86 int ui_options;
87
89
90 fcmp_init();
91
92 // This modifies argv!
94
95 if (ui_options != -1) {
96 int i;
97
98 for (i = 1; i <= ui_options; i++) {
99 if (is_option("--help", argv[i])) {
101 _("This modpack installer accepts the standard Qt command-line options\n"
102 "after '--'. See the Qt documentation.\n\n"));
103
104 // TRANS: No full stop after the URL, could cause confusion.
105 fc_fprintf(stderr, _("Report bugs at %s\n"), BUG_URL);
106
107 ui_options = -1;
108 }
109 }
110 }
111
112 if (ui_options != -1) {
115 QWidget *central;
116 const char *errmsg;
117 QPixmap *pm;
118 const char *full_icon_path = fileinfoname(get_data_dirs(), "freeciv-modpack.png");
120
122
124 central = new QWidget;
125 main_window = new mpgui_main(qapp, central);
126
127 pm = new QPixmap;
128 pm->load(fip);
129 qapp->setWindowIcon(QIcon(*pm));
130
131 main_window->setGeometry(0, 30, 640, 60);
132 main_window->setWindowTitle(QString::fromUtf8(_("Freeciv modpack installer (Qt)")));
133
134 gui = new mpgui;
135
136 gui->setup(central, &fcmp);
137
138 main_window->setCentralWidget(central);
139 main_window->setVisible(true);
140
142 if (errmsg != nullptr) {
144 }
145
146 qapp->exec();
147
148 if (worker != nullptr) {
149 if (worker->isRunning()) {
150 worker->wait();
151 }
152 delete worker;
153 }
154
155 delete gui;
156 delete qapp;
157
158 close_mpdbs();
159 }
160
161 fcmp_deinit();
163
164 return EXIT_SUCCESS;
165}
166
167/**********************************************************************/
170static void msg_callback(const char *msg)
171{
172 gui->display_msg(msg);
173}
174
175/**********************************************************************/
178static void msg_callback_thr(const char *msg)
179{
180 gui->display_msg_thr(msg);
181}
182
183/**********************************************************************/
186static void progress_callback_thr(int downloaded, int max)
187{
189}
190
191/**********************************************************************/
194void mpgui::setup(QWidget *central, struct fcmp_params *params)
195{
196#define URL_LABEL_TEXT N_("Modpack URL")
197 QVBoxLayout *main_layout = new QVBoxLayout();
198 QHBoxLayout *hl = new QHBoxLayout();
199 QPushButton *install_button = new QPushButton(QString::fromUtf8(_("Install modpack")));
201 QLabel *URL_label;
202 QLabel *version_label;
203 char verbuf[2048];
204 const char *rev_ver;
205 const char *mode;
206
208
209#if defined(FC_QT6X_MODE)
210 mode = R__("built in Qt6x mode.");
211#else // FC_QT6X_MODE
212 mode = R__("built in Qt6 mode.");
213#endif // FC_QT6X_MODE
214
215 if (rev_ver == nullptr) {
216 fc_snprintf(verbuf, sizeof(verbuf), "%s%s\n%s", word_version(),
217 VERSION_STRING, mode);
218 } else {
219 fc_snprintf(verbuf, sizeof(verbuf), _("%s%s\ncommit: %s\n%s"),
221 }
222
223 version_label = new QLabel(QString::fromUtf8(verbuf));
224 version_label->setAlignment(Qt::AlignHCenter);
225 version_label->setParent(central);
226 version_label->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
227 main_layout->addWidget(version_label);
228
229 mplist_table = new QTableWidget();
230 mplist_table->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
231 mplist_table->setColumnCount(ML_COL_COUNT);
232 headers << QString::fromUtf8(_("Name")) << QString::fromUtf8(_("Version"));
233 headers << QString::fromUtf8(_("Installed")) << QString::fromUtf8(Q_("?modpack:Type"));
234 headers << QString::fromUtf8(_("Subtype")) << QString::fromUtf8(_("License"));
235 headers << QString::fromUtf8(_("URL")) << "typeint";
236 mplist_table->setHorizontalHeaderLabels(headers);
237 mplist_table->verticalHeader()->setVisible(false);
238 mplist_table->setEditTriggers(QAbstractItemView::NoEditTriggers);
239 mplist_table->setSelectionBehavior(QAbstractItemView::SelectRows);
240 mplist_table->setSelectionMode(QAbstractItemView::SingleSelection);
241 mplist_table->hideColumn(ML_TYPE);
242
243 connect(mplist_table, SIGNAL(cellClicked(int, int)), this, SLOT(row_selected(int, int)));
246 connect(this, SIGNAL(progress_thr_signal(int, int)), this, SLOT(progress(int, int)));
248
249 main_layout->addWidget(mplist_table);
250
251 URL_label = new QLabel(QString::fromUtf8(_(URL_LABEL_TEXT)));
252 URL_label->setParent(central);
253 hl->addWidget(URL_label);
254
255 URLedit = new QLineEdit(central);
256 if (params->autoinstall == nullptr) {
257 URLedit->setText(DEFAULT_URL_START);
258 } else {
259 URLedit->setText(QString::fromUtf8(params->autoinstall));
260 }
261 URLedit->setFocus();
262
263 connect(URLedit, SIGNAL(returnPressed()), this, SLOT(URL_given()));
264
265 hl->addWidget(URLedit);
266 main_layout->addLayout(hl);
267
268 connect(install_button, SIGNAL(pressed()), this, SLOT(URL_given()));
269 main_layout->addWidget(install_button);
270
271 bar = new QProgressBar(central);
272 main_layout->addWidget(bar);
273
274 msg_dspl = new QLabel(QString::fromUtf8(_("Select modpack to install")));
275 msg_dspl->setParent(central);
276 main_layout->addWidget(msg_dspl);
277
278 msg_dspl->setAlignment(Qt::AlignHCenter);
279
280 central->setLayout(main_layout);
281}
282
283/**********************************************************************/
287{
288 QByteArray msg_bytes = msg.toLocal8Bit();
289
290 log_verbose("%s", msg_bytes.data());
291 msg_dspl->setText(msg);
292}
293
294/**********************************************************************/
297void mpgui::display_msg_thr(const char *msg)
298{
299 emit display_msg_thr_signal(QString::fromUtf8(msg));
300}
301
302/**********************************************************************/
305void mpgui::progress(int downloaded, int max)
306{
307 bar->setMaximum(max);
308 bar->setValue(downloaded);
309}
310
311/**********************************************************************/
315{
317}
318
319/**********************************************************************/
323{
324 if (worker != nullptr) {
325 if (worker->isRunning()) {
326 gui->display_msg(_("Another download already active"));
327 return;
328 }
329 } else {
330 worker = new mpqt_worker;
331 }
332
334}
335
336/**********************************************************************/
340{
342}
343
344/**********************************************************************/
348{
349 for (int i = 0; i < mpcount; i++) {
351 int type_int;
352 const char *new_inst;
353 enum modpack_type type;
355
356 name_str = mplist_table->item(i, ML_COL_NAME)->text();
357 type_int = mplist_table->item(i, ML_TYPE)->text().toInt();
358 type = (enum modpack_type) type_int;
359 name_bytes = name_str.toUtf8();
361
362 if (new_inst == nullptr) {
363 new_inst = _("Not installed");
364 }
365
366 mplist_table->item(i, ML_COL_INST)->setText(QString::fromUtf8(new_inst));
367 }
368
369 mplist_table->resizeColumnsToContents();
370}
371
372/**********************************************************************/
379
380/**********************************************************************/
383void mpgui::setup_list(const char *name, const char *URL,
384 const char *version, const char *license,
385 enum modpack_type type, const char *subtype,
386 const char *notes)
387{
388 const char *type_str;
389 const char *lic_str;
390 const char *inst_str;
393
396 } else {
397 // TRANS: Unknown modpack type
398 type_str = _("?");
399 }
400
401 if (license != nullptr) {
403 } else {
404 // TRANS: License of modpack is not known
405 lic_str = Q_("?license:Unknown");
406 }
407
409 if (inst_str == nullptr) {
410 inst_str = _("Not installed");
411 }
412
413 mplist_table->setRowCount(mpcount+1);
414
415 item = new QTableWidgetItem(QString::fromUtf8(name));
416 item->setToolTip(QString::fromUtf8(notes));
418 item = new QTableWidgetItem(QString::fromUtf8(version));
419 item->setToolTip(QString::fromUtf8(notes));
421 item = new QTableWidgetItem(QString::fromUtf8(inst_str));
422 item->setToolTip(QString::fromUtf8(notes));
424 item = new QTableWidgetItem(QString::fromUtf8(type_str));
425 item->setToolTip(QString::fromUtf8(notes));
427 item = new QTableWidgetItem(QString::fromUtf8(subtype));
428 item->setToolTip(QString::fromUtf8(notes));
430 item = new QTableWidgetItem(QString::fromUtf8(lic_str));
431 item->setToolTip(QString::fromUtf8(notes));
433 item = new QTableWidgetItem(QString::fromUtf8(URL));
434 item->setToolTip(QString::fromUtf8(notes));
436
437 type_nbr.setNum(type);
439 item->setToolTip(notes);
440 mplist_table->setItem(mpcount, ML_TYPE, item);
441
442 mplist_table->resizeColumnsToContents();
443 mpcount++;
444}
445
446/**********************************************************************/
449static void setup_modpack_list(const char *name, const char *URL,
450 const char *version, const char *license,
451 enum modpack_type type, const char *subtype,
452 const char *notes)
453{
454 // Just call setup_list for gui singleton
455 gui->setup_list(name, URL, version, license, type, subtype, notes);
456}
457
458/**********************************************************************/
462{
463 QString URL = mplist_table->item(row, ML_COL_URL)->text();
464
465 URLedit->setText(URL);
466}
467
468/**********************************************************************/
472{
473 QString URL = mplist_table->item(index.row(), ML_COL_URL)->text();
474
475 URLedit->setText(URL);
476
477 URL_given();
478}
479
480/**********************************************************************/
484{
485 qapp = qapp_in;
487}
488
489/**********************************************************************/
493{
494 QMessageBox ask(central);
495 int ret;
496
497 ask.setText(_("Modpack installation in progress.\nAre you sure you want to quit?"));
498 ask.setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
499 ask.setDefaultButton(QMessageBox::Cancel);
500 ask.setIcon(QMessageBox::Warning);
501 ask.setWindowTitle(_("Quit?"));
502 ret = ask.exec();
503
504 switch (ret) {
505 case QMessageBox::Cancel:
506 return;
507 break;
508 case QMessageBox::Ok:
509 qapp->quit();
510 break;
511 }
512}
513
514/**********************************************************************/
518{
519 if (worker != nullptr && worker->isRunning()) {
520 // Download in progress. Confirm quit from user.
522 event->ignore();
523 }
524}
void popup_quit_dialog()
Definition mpgui_qt.cpp:492
QApplication * qapp
Definition mpgui_qt.h:42
mpgui_main(QApplication *qapp_in, QWidget *central_in)
Definition mpgui_qt.cpp:483
QWidget * central
Definition mpgui_qt.h:43
void closeEvent(QCloseEvent *event)
Definition mpgui_qt.cpp:517
void refresh_list_versions_thr()
Definition mpgui_qt.cpp:375
void row_selected(int, int)
Definition mpgui_qt.cpp:461
QLineEdit * URLedit
Definition mpgui_qt.h:79
void display_msg(QString msg)
Definition mpgui_qt.cpp:286
void row_download(const QModelIndex &)
Definition mpgui_qt.cpp:471
void display_msg_thr_signal(QString msg)
void display_msg_thr(const char *msg)
Definition mpgui_qt.cpp:297
void refresh_list_versions_thr_signal()
void URL_given()
Definition mpgui_qt.cpp:339
void progress_thr_signal(int downloaded, int max)
QTableWidget * mplist_table
Definition mpgui_qt.h:82
void progress_thr(int downloaded, int max)
Definition mpgui_qt.cpp:314
void setup_list(const char *name, const char *URL, const char *version, const char *license, enum modpack_type type, const char *subtype, const char *notes)
Definition mpgui_qt.cpp:383
QLabel * msg_dspl
Definition mpgui_qt.h:80
void refresh_list_versions()
Definition mpgui_qt.cpp:347
QProgressBar * bar
Definition mpgui_qt.h:81
void setup(QWidget *central, struct fcmp_params *fcmp)
Definition mpgui_qt.cpp:194
void progress(int downloaded, int max)
Definition mpgui_qt.cpp:305
void download(QString URL_in, class mpgui *gui_in, struct fcmp_params *fcmp_in, dl_msg_callback msg_callback_in, dl_pb_callback pb_callback_in)
char * incite_cost
Definition comments.c:76
const char * download_modpack_list(const struct fcmp_params *fcmp, modpack_list_setup_cb cb, dl_msg_callback mcb)
Definition download.c:427
enum event_type event
Definition events.c:81
void executable_init(void)
Definition executable.c:34
bool is_option(const char *option_name, char *option)
Definition fc_cmdline.c:112
void cmdline_option_values_free(void)
Definition fc_cmdline.c:97
void fc_fprintf(FILE *stream, const char *format,...) fc__attribute((__format__(__printf__
#define Q_(String)
Definition fcintl.h:70
#define _(String)
Definition fcintl.h:67
#define R__(String)
Definition fcintl.h:75
GType type
Definition repodlgs.c:1313
static QApplication * qapp
Definition gui_main.cpp:69
const char * name
Definition inputfile.c:127
#define log_verbose(message,...)
Definition log.h:110
void load_install_info_lists(struct fcmp_params *fcmp)
Definition modinst.c:44
void fcmp_deinit(void)
Definition modinst.c:98
void fcmp_init(void)
Definition modinst.c:82
#define DEFAULT_URL_START
Definition modinst.h:32
#define MODPACK_LIST_URL
Definition modinst.h:30
int fcmp_parse_cmdline(int argc, char *argv[])
Definition mpcmdline.c:45
const char * mpdb_installed_version(const char *name, enum modpack_type type)
Definition mpdb.c:253
void close_mpdbs(void)
Definition mpdb.c:202
#define ML_COL_SUBTYPE
Definition mpgui_gtk3.c:59
#define ML_TYPE
Definition mpgui_gtk3.c:65
#define ML_COL_NAME
Definition mpgui_gtk3.c:55
#define ML_COL_LIC
Definition mpgui_gtk3.c:60
static void gui_download_modpack(const char *URL)
Definition mpgui_gtk3.c:280
#define ML_COL_TYPE
Definition mpgui_gtk3.c:58
#define ML_COL_INST
Definition mpgui_gtk3.c:57
#define ML_COL_URL
Definition mpgui_gtk3.c:61
#define ML_COL_VER
Definition mpgui_gtk3.c:56
#define ML_COL_COUNT
Definition mpgui_gtk3.c:63
static mpgui * gui
Definition mpgui_qt.cpp:53
static int mpcount
Definition mpgui_qt.cpp:57
static void progress_callback_thr(int downloaded, int max)
Definition mpgui_qt.cpp:186
int main(int argc, char **argv)
Definition mpgui_qt.cpp:84
static void msg_callback_thr(const char *msg)
Definition mpgui_qt.cpp:178
static void gui_download_modpack(QString URL)
Definition mpgui_qt.cpp:322
#define URL_LABEL_TEXT
struct fcmp_params fcmp
Definition mpgui_qt.cpp:51
static mpqt_worker * worker
Definition mpgui_qt.cpp:55
static void setup_modpack_list(const char *name, const char *URL, const char *version, const char *license, enum modpack_type type, const char *subtype, const char *notes)
Definition mpgui_qt.cpp:449
static void msg_callback(const char *msg)
Definition mpgui_qt.cpp:170
const char * fileinfoname(const struct strvec *dirs, const char *filename)
Definition shared.c:1094
const struct strvec * get_data_dirs(void)
Definition shared.c:886
const char * autoinstall
Definition modinst.h:20
Definition climisc.h:82
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:960
const char * fc_git_revision(void)
Definition version.c:75
const char * word_version(void)
Definition version.c:62
#define VERSION_STRING
Definition version_gen.h:14