2 Bacula® - The Network Backup Solution
4 Copyright (C) 2007-2009 Free Software Foundation Europe e.V.
6 The main author of Bacula is Kern Sibbald, with contributions from
7 many others, a complete list can be found in the file AUTHORS.
8 This program is Free Software; you can redistribute it and/or
9 modify it under the terms of version two of the GNU General Public
10 License as published by the Free Software Foundation and included
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 Bacula® is a registered trademark of Kern Sibbald.
24 The licensor of Bacula is the Free Software Foundation Europe
25 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26 Switzerland, email:ftf@fsfeurope.org.
32 * Main Window control for bat (qt-console)
34 * Kern Sibbald, January MMVII
40 #include "joblist/joblist.h"
41 #include "storage/storage.h"
42 #include "fileset/fileset.h"
43 #include "label/label.h"
46 #include "restore/restore.h"
47 #include "medialist/medialist.h"
48 #include "joblist/joblist.h"
49 #include "clients/clients.h"
50 #include "restore/restoretree.h"
51 #include "help/help.h"
52 #include "jobs/jobs.h"
54 #include "jobgraphs/jobplot.h"
56 #include "status/dirstat.h"
57 #include "util/fmtwidgetitem.h"
60 * Daemon message callback
62 void message_callback(int /* type */, char *msg)
64 QMessageBox::warning(mainWin, "Bat", msg, QMessageBox::Ok);
67 MainWin::MainWin(QWidget *parent) : QMainWindow(parent)
70 m_dtformat = "yyyy-MM-dd HH:mm:ss";
72 setupUi(this); /* Setup UI defined by main.ui (designer) */
73 register_message_callback(message_callback);
76 treeWidget->setColumnCount(1);
77 treeWidget->setHeaderLabel( tr("Select Page") );
78 treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
87 actionJobPlot->setEnabled(false);
88 actionJobPlot->setVisible(false);
95 foreach(Console *console, m_consoleHash) {
96 console->connect_dir();
98 m_currentConsole = (Console*)getFromHash(m_firstItem);
99 m_currentConsole->setCurrent();
100 connectConsoleSignals();
102 QString directoryResourceName;
103 m_currentConsole->getDirResName(directoryResourceName);
104 Pmsg1(100, "Setting initial window to %s\n", directoryResourceName.toUtf8().data());
108 void MainWin::createPages()
111 QTreeWidgetItem *item, *topItem;
115 foreach_res(dir, R_DIRECTOR) {
117 /* Create console tree stacked widget item */
118 m_currentConsole = new Console(stackedWidget);
119 m_currentConsole->setDirRes(dir);
120 m_currentConsole->readSettings();
122 /* The top tree item representing the director */
123 topItem = new QTreeWidgetItem(treeWidget);
124 topItem->setText(0, dir->name());
125 topItem->setIcon(0, QIcon(":images/server.png"));
126 /* Set background to grey for ease of identification of inactive Director */
127 QBrush greyBrush(Qt::lightGray);
128 topItem->setBackground(0, greyBrush);
129 m_currentConsole->setDirectorTreeItem(topItem);
130 m_consoleHash.insert(topItem, m_currentConsole);
132 /* Create Tree Widget Item */
133 item = new QTreeWidgetItem(topItem);
134 item->setText(0, tr("Console"));
135 if (!m_firstItem){ m_firstItem = item; }
136 item->setIcon(0,QIcon(QString::fromUtf8(":images/utilities-terminal.png")));
138 /* insert the cosole and tree widget item into the hashes */
139 hashInsert(item, m_currentConsole);
141 /* Set Color of treeWidgetItem for the console
142 * It will be set to green in the console class if the connection is made.
144 QBrush redBrush(Qt::red);
145 item->setForeground(0, redBrush);
146 m_currentConsole->dockPage();
149 * Create instances in alphabetic order of the rest
150 * of the classes that will by default exist under each Director.
156 createPageJobList("", "", "", "", NULL);
161 new JobPlot(NULL, pass);
170 treeWidget->expandItem(topItem);
171 stackedWidget->setCurrentWidget(m_currentConsole);
177 * create an instance of the the joblist class on the stack
179 void MainWin::createPageJobList(const QString &media, const QString &client,
180 const QString &job, const QString &fileset, QTreeWidgetItem *parentTreeWidgetItem)
182 QTreeWidgetItem *holdItem;
184 /* save current tree widget item in case query produces no results */
185 holdItem = treeWidget->currentItem();
186 JobList* joblist = new JobList(media, client, job, fileset, parentTreeWidgetItem);
187 /* If this is a query of jobs on a specific media */
188 if ((media != "") || (client != "") || (job != "") || (fileset != "")) {
189 joblist->setCurrent();
190 /* did query produce results, if not close window and set back to hold */
191 if (joblist->m_resultCount == 0) {
192 joblist->closeStackPage();
193 treeWidget->setCurrentItem(holdItem);
199 * Handle up and down arrow keys for the command line
202 void MainWin::keyPressEvent(QKeyEvent *event)
204 if (m_cmd_history.size() == 0) {
208 switch (event->key()) {
210 if (m_cmd_last < 0 || m_cmd_last >= (m_cmd_history.size()-1)) {
217 if (m_cmd_last == 0) {
221 if (m_cmd_last < 0 || m_cmd_last > (m_cmd_history.size()-1)) {
222 m_cmd_last = m_cmd_history.size() - 1;
231 lineEdit->setText(m_cmd_history[m_cmd_last]);
234 void MainWin::connectSignals()
236 /* Connect signals to slots */
237 connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(input_line()));
238 connect(actionAbout_bat, SIGNAL(triggered()), this, SLOT(about()));
239 connect(actionBat_Help, SIGNAL(triggered()), this, SLOT(help()));
240 connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
241 connect(treeWidget, SIGNAL( currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
242 connect(stackedWidget, SIGNAL(currentChanged(int)), this, SLOT(stackItemChanged(int)));
243 connect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows()));
244 connect(actionLabel, SIGNAL(triggered()), this, SLOT(labelButtonClicked()));
245 connect(actionRun, SIGNAL(triggered()), this, SLOT(runButtonClicked()));
246 connect(actionEstimate, SIGNAL(triggered()), this, SLOT(estimateButtonClicked()));
247 connect(actionBrowse, SIGNAL(triggered()), this, SLOT(browseButtonClicked()));
248 connect(actionStatusDirPage, SIGNAL(triggered()), this, SLOT(statusPageButtonClicked()));
250 connect(actionJobPlot, SIGNAL(triggered()), this, SLOT(jobPlotButtonClicked()));
252 connect(actionRestore, SIGNAL(triggered()), this, SLOT(restoreButtonClicked()));
253 connect(actionUndock, SIGNAL(triggered()), this, SLOT(undockWindowButton()));
254 connect(actionToggleDock, SIGNAL(triggered()), this, SLOT(toggleDockContextWindow()));
255 connect(actionClosePage, SIGNAL(triggered()), this, SLOT(closePage()));
256 connect(actionPreferences, SIGNAL(triggered()), this, SLOT(setPreferences()));
259 void MainWin::disconnectSignals()
261 /* Connect signals to slots */
262 disconnect(lineEdit, SIGNAL(returnPressed()), this, SLOT(input_line()));
263 disconnect(actionAbout_bat, SIGNAL(triggered()), this, SLOT(about()));
264 disconnect(actionBat_Help, SIGNAL(triggered()), this, SLOT(help()));
265 disconnect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
266 disconnect(treeWidget, SIGNAL( currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
267 disconnect(stackedWidget, SIGNAL(currentChanged(int)), this, SLOT(stackItemChanged(int)));
268 disconnect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows()));
269 disconnect(actionLabel, SIGNAL(triggered()), this, SLOT(labelButtonClicked()));
270 disconnect(actionRun, SIGNAL(triggered()), this, SLOT(runButtonClicked()));
271 disconnect(actionEstimate, SIGNAL(triggered()), this, SLOT(estimateButtonClicked()));
272 disconnect(actionBrowse, SIGNAL(triggered()), this, SLOT(browseButtonClicked()));
273 disconnect(actionStatusDirPage, SIGNAL(triggered()), this, SLOT(statusPageButtonClicked()));
275 disconnect(actionJobPlot, SIGNAL(triggered()), this, SLOT(jobPlotButtonClicked()));
277 disconnect(actionRestore, SIGNAL(triggered()), this, SLOT(restoreButtonClicked()));
278 disconnect(actionUndock, SIGNAL(triggered()), this, SLOT(undockWindowButton()));
279 disconnect(actionToggleDock, SIGNAL(triggered()), this, SLOT(toggleDockContextWindow()));
280 disconnect(actionClosePage, SIGNAL(triggered()), this, SLOT(closePage()));
281 disconnect(actionPreferences, SIGNAL(triggered()), this, SLOT(setPreferences()));
287 void MainWin::waitEnter()
289 app->setOverrideCursor(QCursor(Qt::WaitCursor));
296 void MainWin::waitExit()
298 app->restoreOverrideCursor();
302 void MainWin::connectConsoleSignals()
304 connect(actionConnect, SIGNAL(triggered()), m_currentConsole, SLOT(connect_dir()));
305 connect(actionSelectFont, SIGNAL(triggered()), m_currentConsole, SLOT(set_font()));
306 connect(actionStatusDir, SIGNAL(triggered()), m_currentConsole, SLOT(status_dir()));
307 connect(actionMessages, SIGNAL(triggered()), m_currentConsole, SLOT(messages()));
310 void MainWin::disconnectConsoleSignals(Console *console)
312 disconnect(actionConnect, SIGNAL(triggered()), console, SLOT(connect_dir()));
313 disconnect(actionStatusDir, SIGNAL(triggered()), console, SLOT(status_dir()));
314 disconnect(actionMessages, SIGNAL(triggered()), console, SLOT(messages()));
315 disconnect(actionSelectFont, SIGNAL(triggered()), console, SLOT(set_font()));
319 * Reimplementation of QWidget closeEvent virtual function
321 void MainWin::closeEvent(QCloseEvent *event)
325 /* close all non console pages, this will call settings in destructors */
326 while (m_consoleHash.count() < m_pagehash.count()) {
327 foreach(Pages *page, m_pagehash) {
328 if (page != page->console()) {
329 QTreeWidgetItem* pageSelectorTreeWidgetItem = mainWin->getFromHash(page);
330 if (pageSelectorTreeWidgetItem->childCount() == 0) {
331 page->console()->setCurrent();
332 page->closeStackPage();
337 foreach(Console *console, m_consoleHash){
338 console->writeSettings();
339 console->terminate();
340 console->closeStackPage();
345 void MainWin::writeSettings()
347 QSettings settings("bacula.org", "bat");
349 settings.beginGroup("MainWin");
350 settings.setValue("winSize", size());
351 settings.setValue("winPos", pos());
352 settings.setValue("state", saveState());
356 void MainWin::readSettings()
358 QSettings settings("bacula.org", "bat");
360 settings.beginGroup("MainWin");
361 resize(settings.value("winSize", QSize(1041, 801)).toSize());
362 move(settings.value("winPos", QPoint(200, 150)).toPoint());
363 restoreState(settings.value("state").toByteArray());
368 * This subroutine is called with an item in the Page Selection window
371 void MainWin::treeItemClicked(QTreeWidgetItem *item, int /*column*/)
373 /* Is this a page that has been inserted into the hash */
374 if (getFromHash(item)) {
375 Pages* page = getFromHash(item);
376 int stackindex=stackedWidget->indexOf(page);
378 if (stackindex >= 0) {
379 stackedWidget->setCurrentWidget(page);
381 /* run the virtual function in case this class overrides it */
382 page->PgSeltreeWidgetClicked();
387 * Called with a change of the highlighed tree widget item in the page selector.
389 void MainWin::treeItemChanged(QTreeWidgetItem *currentitem, QTreeWidgetItem *previousitem)
391 if (m_isClosing) return; /* if closing the application, do nothing here */
393 Pages *previousPage, *nextPage;
394 Console *previousConsole = NULL;
395 Console *nextConsole;
397 /* remove all actions before adding actions appropriate for new page */
398 foreach(QAction* pageAction, treeWidget->actions()) {
399 treeWidget->removeAction(pageAction);
402 /* first determine the next item */
404 /* knowing the treeWidgetItem, get the page from the hash */
405 nextPage = getFromHash(currentitem);
406 nextConsole = m_consoleHash.value(currentitem);
407 /* Is this a page that has been inserted into the hash */
409 nextConsole = nextPage->console();
410 /* then is it a treeWidgetItem representing a director */
411 } else if (nextConsole) {
412 /* let the next page BE the console */
413 nextPage = nextConsole;
415 /* Should never get here */
420 /* The Previous item */
422 /* this condition prevents a segfault. The first time there is no previousitem*/
424 /* knowing the treeWidgetItem, get the page from the hash */
425 previousPage = getFromHash(previousitem);
426 previousConsole = m_consoleHash.value(previousitem);
428 previousConsole = previousPage->console();
429 } else if (previousConsole) {
430 previousPage = previousConsole;
432 if ((previousPage) || (previousConsole)) {
433 if (nextConsole != previousConsole) {
434 /* remove connections to the current console */
435 disconnectConsoleSignals(previousConsole);
436 QTreeWidgetItem *dirItem = previousConsole->directorTreeItem();
437 QBrush greyBrush(Qt::lightGray);
438 dirItem->setBackground(0, greyBrush);
443 /* process the current (next) item */
445 if ((nextPage) || (nextConsole)) {
446 if (nextConsole != previousConsole) {
447 /* make connections to the current console */
448 m_currentConsole = nextConsole;
449 connectConsoleSignals();
451 /* Set director's tree widget background to magenta for ease of identification */
452 QTreeWidgetItem *dirItem = m_currentConsole->directorTreeItem();
453 QBrush magentaBrush(Qt::magenta);
454 dirItem->setBackground(0, magentaBrush);
456 /* set the value for the currently active console */
457 int stackindex = stackedWidget->indexOf(nextPage);
459 /* Is this page currently on the stack or is it undocked */
460 if (stackindex >= 0) {
461 /* put this page on the top of the stack */
462 stackedWidget->setCurrentIndex(stackindex);
464 /* it is undocked, raise it to the front */
467 /* for the page selectors menu action to dock or undock, set the text */
468 nextPage->setContextMenuDockText();
470 treeWidget->addAction(actionToggleDock);
471 /* if this page is closeable, and it has no childern, then add that action */
472 if ((nextPage->isCloseable()) && (currentitem->child(0) == NULL))
473 treeWidget->addAction(actionClosePage);
475 /* Add the actions to the Page Selectors tree widget that are part of the
476 * current items list of desired actions regardless of whether on top of stack*/
477 treeWidget->addActions(nextPage->m_contextActions);
481 void MainWin::labelButtonClicked()
486 void MainWin::runButtonClicked()
491 void MainWin::estimateButtonClicked()
496 void MainWin::browseButtonClicked()
501 void MainWin::statusPageButtonClicked()
503 /* if one exists, then just set it current */
505 foreach(Pages *page, m_pagehash) {
506 if (m_currentConsole == page->console()) {
507 if (page->name() == tr("Director Status")) {
517 void MainWin::restoreButtonClicked()
519 new prerestorePage();
522 void MainWin::jobPlotButtonClicked()
527 new JobPlot(NULL, pass);
532 * The user just finished typing a line in the command line edit box
534 void MainWin::input_line()
536 QString cmdStr = lineEdit->text(); /* Get the text */
537 lineEdit->clear(); /* clear the lineEdit box */
538 if (m_currentConsole->is_connected()) {
539 /* Use consoleInput to allow typing anything */
540 m_currentConsole->consoleInput(cmdStr);
542 set_status(tr("Director not connected. Click on connect button."));
544 m_cmd_history.append(cmdStr);
546 if (treeWidget->currentItem() != getFromHash(m_currentConsole))
547 m_currentConsole->setCurrent();
551 void MainWin::about()
553 QMessageBox::about(this, tr("About bat"),
554 tr("<br><h2>bat %1 (%2), by Dirk H Bartley and Kern Sibbald</h2>"
555 "<p>Copyright © 2007-%3 Free Software Foundation Europe e.V."
556 "<p>The <b>bat</b> is an administrative console"
557 " interface to the Director.").arg(VERSION).arg(BDATE).arg(BYEAR));
562 Help::displayFile("index.html");
565 void MainWin::set_statusf(const char *fmt, ...)
570 va_start(arg_ptr, fmt);
571 len = bvsnprintf(buf, sizeof(buf), fmt, arg_ptr);
576 void MainWin::set_status_ready()
578 set_status(tr(" Ready"));
581 void MainWin::set_status(const QString &str)
583 statusBar()->showMessage(str);
586 void MainWin::set_status(const char *buf)
588 statusBar()->showMessage(buf);
592 * Function to respond to the button bar button to undock
594 void MainWin::undockWindowButton()
596 Pages* page = (Pages*)stackedWidget->currentWidget();
597 page->togglePageDocking();
601 * Function to respond to action on page selector context menu to toggle the
602 * dock status of the window associated with the page selectors current
605 void MainWin::toggleDockContextWindow()
607 QTreeWidgetItem *currentitem = treeWidget->currentItem();
609 /* Is this a page that has been inserted into the hash */
610 if (getFromHash(currentitem)) {
611 Pages* page = getFromHash(currentitem);
612 page->togglePageDocking();
617 * This function is called when the stack item is changed. Call
618 * the virtual function here. Avoids a window being undocked leaving
619 * a window at the top of the stack unpopulated.
621 void MainWin::stackItemChanged(int)
623 if (m_isClosing) return; /* if closing the application, do nothing here */
624 Pages* page = (Pages*)stackedWidget->currentWidget();
625 /* run the virtual function in case this class overrides it */
626 page->currentStackItem();
630 * Function to simplify insertion of QTreeWidgetItem <-> Page association
631 * into a double direction hash.
633 void MainWin::hashInsert(QTreeWidgetItem *item, Pages *page)
635 m_pagehash.insert(item, page);
636 m_widgethash.insert(page, item);
640 * Function to simplify removal of QTreeWidgetItem <-> Page association
641 * into a double direction hash.
643 void MainWin::hashRemove(QTreeWidgetItem *item, Pages *page)
645 /* I had all sorts of return status checking code here. Do we have a log
646 * level capability in bat. I would have left it in but it used printf's
647 * and it should really be some kind of log level facility ???
648 * ******FIXME********/
649 m_pagehash.remove(item);
650 m_widgethash.remove(page);
654 * Function to retrieve a Page* when the item in the page selector's tree is
657 Pages* MainWin::getFromHash(QTreeWidgetItem *item)
659 return m_pagehash.value(item);
663 * Function to retrieve the page selectors tree widget item when the page is
666 QTreeWidgetItem* MainWin::getFromHash(Pages *page)
668 return m_widgethash.value(page);
672 * Function to respond to action on page selector context menu to close the
675 void MainWin::closePage()
677 QTreeWidgetItem *currentitem = treeWidget->currentItem();
679 /* Is this a page that has been inserted into the hash */
680 if (getFromHash(currentitem)) {
681 Pages* page = getFromHash(currentitem);
682 if (page->isCloseable()) {
683 page->closeStackPage();
688 /* Quick function to return the current console */
689 Console *MainWin::currentConsole()
691 return m_currentConsole;
693 /* Quick function to return the tree item for the director */
694 QTreeWidgetItem *MainWin::currentTopItem()
696 return m_currentConsole->directorTreeItem();
699 /* Preferences menu item clicked */
700 void MainWin::setPreferences()
703 prefs.commDebug->setCheckState(m_commDebug ? Qt::Checked : Qt::Unchecked);
704 prefs.connDebug->setCheckState(m_connDebug ? Qt::Checked : Qt::Unchecked);
705 prefs.displayAll->setCheckState(m_displayAll ? Qt::Checked : Qt::Unchecked);
706 prefs.sqlDebug->setCheckState(m_sqlDebug ? Qt::Checked : Qt::Unchecked);
707 prefs.commandDebug->setCheckState(m_commandDebug ? Qt::Checked : Qt::Unchecked);
708 prefs.miscDebug->setCheckState(m_miscDebug ? Qt::Checked : Qt::Unchecked);
709 prefs.recordLimit->setCheckState(m_recordLimitCheck ? Qt::Checked : Qt::Unchecked);
710 prefs.recordSpinBox->setValue(m_recordLimitVal);
711 prefs.daysLimit->setCheckState(m_daysLimitCheck ? Qt::Checked : Qt::Unchecked);
712 prefs.daysSpinBox->setValue(m_daysLimitVal);
713 prefs.checkMessages->setCheckState(m_checkMessages ? Qt::Checked : Qt::Unchecked);
714 prefs.checkMessagesSpin->setValue(m_checkMessagesInterval);
715 prefs.refreshStatusDir->setCheckState(m_refreshStatusDir ? Qt::Checked : Qt::Unchecked);
716 prefs.refreshStatusDirSpin->setValue(m_refreshStatusDirInterval);
717 prefs.executeLongCheckBox->setCheckState(m_longList ? Qt::Checked : Qt::Unchecked);
718 prefs.rtPopDirCheckBox->setCheckState(m_rtPopDirDebug ? Qt::Checked : Qt::Unchecked);
719 prefs.rtDirCurICCheckBox->setCheckState(m_rtDirCurICDebug ? Qt::Checked : Qt::Unchecked);
720 prefs.rtDirICCheckBox->setCheckState(m_rtDirICDebug ? Qt::Checked : Qt::Unchecked);
721 prefs.rtFileTabICCheckBox->setCheckState(m_rtFileTabICDebug ? Qt::Checked : Qt::Unchecked);
722 prefs.rtVerTabICCheckBox->setCheckState(m_rtVerTabICDebug ? Qt::Checked : Qt::Unchecked);
723 prefs.rtUpdateFTCheckBox->setCheckState(m_rtUpdateFTDebug ? Qt::Checked : Qt::Unchecked);
724 prefs.rtUpdateVTCheckBox->setCheckState(m_rtUpdateVTDebug ? Qt::Checked : Qt::Unchecked);
725 prefs.rtChecksCheckBox->setCheckState(m_rtChecksDebug ? Qt::Checked : Qt::Unchecked);
726 prefs.rtIconStateCheckBox->setCheckState(m_rtIconStateDebug ? Qt::Checked : Qt::Unchecked);
727 prefs.rtRestore1CheckBox->setCheckState(m_rtRestore1Debug ? Qt::Checked : Qt::Unchecked);
728 prefs.rtRestore2CheckBox->setCheckState(m_rtRestore2Debug ? Qt::Checked : Qt::Unchecked);
729 prefs.rtRestore3CheckBox->setCheckState(m_rtRestore3Debug ? Qt::Checked : Qt::Unchecked);
730 switch (ItemFormatterBase::getBytesConversion()) {
731 case ItemFormatterBase::BYTES_CONVERSION_NONE:
732 prefs.radioConvertOff->setChecked(Qt::Checked);
734 case ItemFormatterBase::BYTES_CONVERSION_IEC:
735 prefs.radioConvertIEC->setChecked(Qt::Checked);
738 prefs.radioConvertStandard->setChecked(Qt::Checked);
741 prefs.openPlotCheckBox->setCheckState(m_openPlot ? Qt::Checked : Qt::Unchecked);
743 prefs.openPlotCheckBox->setVisible(false);
745 prefs.openBrowserCheckBox->setCheckState(m_openBrowser ? Qt::Checked : Qt::Unchecked);
746 prefs.openDirStatCheckBox->setCheckState(m_openDirStat ? Qt::Checked : Qt::Unchecked);
750 /* Preferences dialog */
751 prefsDialog::prefsDialog()
756 void prefsDialog::accept()
759 mainWin->m_commDebug = this->commDebug->checkState() == Qt::Checked;
760 mainWin->m_connDebug = this->connDebug->checkState() == Qt::Checked;
761 mainWin->m_displayAll = this->displayAll->checkState() == Qt::Checked;
762 mainWin->m_sqlDebug = this->sqlDebug->checkState() == Qt::Checked;
763 mainWin->m_commandDebug = this->commandDebug->checkState() == Qt::Checked;
764 mainWin->m_miscDebug = this->miscDebug->checkState() == Qt::Checked;
765 mainWin->m_recordLimitCheck = this->recordLimit->checkState() == Qt::Checked;
766 mainWin->m_recordLimitVal = this->recordSpinBox->value();
767 mainWin->m_daysLimitCheck = this->daysLimit->checkState() == Qt::Checked;
768 mainWin->m_daysLimitVal = this->daysSpinBox->value();
769 mainWin->m_checkMessages = this->checkMessages->checkState() == Qt::Checked;
770 mainWin->m_checkMessagesInterval = this->checkMessagesSpin->value();
771 mainWin->m_refreshStatusDir = this->refreshStatusDir->checkState() == Qt::Checked;
772 mainWin->m_refreshStatusDirInterval = this->refreshStatusDirSpin->value();
773 mainWin->m_longList = this->executeLongCheckBox->checkState() == Qt::Checked;
775 mainWin->m_rtPopDirDebug = this->rtPopDirCheckBox->checkState() == Qt::Checked;
776 mainWin->m_rtDirCurICDebug = this->rtDirCurICCheckBox->checkState() == Qt::Checked;
777 mainWin->m_rtDirICDebug = this->rtDirICCheckBox->checkState() == Qt::Checked;
778 mainWin->m_rtFileTabICDebug = this->rtFileTabICCheckBox->checkState() == Qt::Checked;
779 mainWin->m_rtVerTabICDebug = this->rtVerTabICCheckBox->checkState() == Qt::Checked;
780 mainWin->m_rtUpdateFTDebug = this->rtUpdateFTCheckBox->checkState() == Qt::Checked;
781 mainWin->m_rtUpdateVTDebug = this->rtUpdateVTCheckBox->checkState() == Qt::Checked;
782 mainWin->m_rtChecksDebug = this->rtChecksCheckBox->checkState() == Qt::Checked;
783 mainWin->m_rtIconStateDebug = this->rtIconStateCheckBox->checkState() == Qt::Checked;
784 mainWin->m_rtRestore1Debug = this->rtRestore1CheckBox->checkState() == Qt::Checked;
785 mainWin->m_rtRestore2Debug = this->rtRestore2CheckBox->checkState() == Qt::Checked;
786 mainWin->m_rtRestore3Debug = this->rtRestore3CheckBox->checkState() == Qt::Checked;
787 if (this->radioConvertOff->isChecked()) {
788 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_NONE);
789 } else if (this->radioConvertIEC->isChecked()){
790 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_IEC);
792 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_SI);
794 mainWin->m_openPlot = this->openPlotCheckBox->checkState() == Qt::Checked;
795 mainWin->m_openBrowser = this->openBrowserCheckBox->checkState() == Qt::Checked;
796 mainWin->m_openDirStat = this->openDirStatCheckBox->checkState() == Qt::Checked;
798 QSettings settings("www.bacula.org", "bat");
799 settings.beginGroup("Debug");
800 settings.setValue("commDebug", mainWin->m_commDebug);
801 settings.setValue("connDebug", mainWin->m_connDebug);
802 settings.setValue("displayAll", mainWin->m_displayAll);
803 settings.setValue("sqlDebug", mainWin->m_sqlDebug);
804 settings.setValue("commandDebug", mainWin->m_commandDebug);
805 settings.setValue("miscDebug", mainWin->m_miscDebug);
807 settings.beginGroup("JobList");
808 settings.setValue("recordLimitCheck", mainWin->m_recordLimitCheck);
809 settings.setValue("recordLimitVal", mainWin->m_recordLimitVal);
810 settings.setValue("daysLimitCheck", mainWin->m_daysLimitCheck);
811 settings.setValue("daysLimitVal", mainWin->m_daysLimitVal);
813 settings.beginGroup("Timers");
814 settings.setValue("checkMessages", mainWin->m_checkMessages);
815 settings.setValue("checkMessagesInterval", mainWin->m_checkMessagesInterval);
816 settings.setValue("refreshStatusDir", mainWin->m_refreshStatusDir);
817 settings.setValue("refreshStatusDirInterval", mainWin->m_refreshStatusDirInterval);
819 settings.beginGroup("Misc");
820 settings.setValue("longList", mainWin->m_longList);
821 settings.setValue("byteConvert", ItemFormatterBase::getBytesConversion());
822 settings.setValue("openplot", mainWin->m_openPlot);
823 settings.setValue("openbrowser", mainWin->m_openBrowser);
824 settings.setValue("opendirstat", mainWin->m_openDirStat);
826 settings.beginGroup("RestoreTree");
827 settings.setValue("rtPopDirDebug", mainWin->m_rtPopDirDebug);
828 settings.setValue("rtDirCurICDebug", mainWin->m_rtDirCurICDebug);
829 settings.setValue("rtDirCurICRetDebug", mainWin->m_rtDirICDebug);
830 settings.setValue("rtFileTabICDebug", mainWin->m_rtFileTabICDebug);
831 settings.setValue("rtVerTabICDebug", mainWin->m_rtVerTabICDebug);
832 settings.setValue("rtUpdateFTDebug", mainWin->m_rtUpdateFTDebug);
833 settings.setValue("rtUpdateVTDebug", mainWin->m_rtUpdateVTDebug);
834 settings.setValue("rtChecksDebug", mainWin->m_rtChecksDebug);
835 settings.setValue("rtIconStateDebug", mainWin->m_rtIconStateDebug);
836 settings.setValue("rtRestore1Debug", mainWin->m_rtRestore1Debug);
837 settings.setValue("rtRestore2Debug", mainWin->m_rtRestore2Debug);
838 settings.setValue("rtRestore3Debug", mainWin->m_rtRestore3Debug);
842 void prefsDialog::reject()
845 mainWin->set_status(tr("Canceled"));
848 /* read preferences for the prefences dialog box */
849 void MainWin::readPreferences()
851 QSettings settings("www.bacula.org", "bat");
852 settings.beginGroup("Debug");
853 m_commDebug = settings.value("commDebug", false).toBool();
854 m_connDebug = settings.value("connDebug", false).toBool();
855 m_displayAll = settings.value("displayAll", false).toBool();
856 m_sqlDebug = settings.value("sqlDebug", false).toBool();
857 m_commandDebug = settings.value("commandDebug", false).toBool();
858 m_miscDebug = settings.value("miscDebug", false).toBool();
860 settings.beginGroup("JobList");
861 m_recordLimitCheck = settings.value("recordLimitCheck", true).toBool();
862 m_recordLimitVal = settings.value("recordLimitVal", 150).toInt();
863 m_daysLimitCheck = settings.value("daysLimitCheck", false).toBool();
864 m_daysLimitVal = settings.value("daysLimitVal", 28).toInt();
866 settings.beginGroup("Timers");
867 m_checkMessages = settings.value("checkMessages", false).toBool();
868 m_checkMessagesInterval = settings.value("checkMessagesInterval", 28).toInt();
869 m_refreshStatusDir = settings.value("refreshStatusDir", false).toBool();
870 m_refreshStatusDirInterval = settings.value("refreshStatusDirInterval", 28).toInt();
872 settings.beginGroup("Misc");
873 m_longList = settings.value("longList", false).toBool();
874 ItemFormatterBase::setBytesConversion(
875 (ItemFormatterBase::BYTES_CONVERSION) settings.value("byteConvert",
876 ItemFormatterBase::BYTES_CONVERSION_IEC).toInt());
877 m_openPlot = settings.value("openplot", false).toBool();
878 m_openBrowser = settings.value("openbrowser", false).toBool();
879 m_openDirStat = settings.value("opendirstat", false).toBool();
881 settings.beginGroup("RestoreTree");
882 m_rtPopDirDebug = settings.value("rtPopDirDebug", false).toBool();
883 m_rtDirCurICDebug = settings.value("rtDirCurICDebug", false).toBool();
884 m_rtDirICDebug = settings.value("rtDirCurICRetDebug", false).toBool();
885 m_rtFileTabICDebug = settings.value("rtFileTabICDebug", false).toBool();
886 m_rtVerTabICDebug = settings.value("rtVerTabICDebug", false).toBool();
887 m_rtUpdateFTDebug = settings.value("rtUpdateFTDebug", false).toBool();
888 m_rtUpdateVTDebug = settings.value("rtUpdateVTDebug", false).toBool();
889 m_rtChecksDebug = settings.value("rtChecksDebug", false).toBool();
890 m_rtIconStateDebug = settings.value("rtIconStateDebug", false).toBool();
891 m_rtRestore1Debug = settings.value("rtRestore1Debug", false).toBool();
892 m_rtRestore2Debug = settings.value("rtRestore2Debug", false).toBool();
893 m_rtRestore3Debug = settings.value("rtRestore3Debug", false).toBool();
897 void MainWin::setMessageIcon()
899 if (m_currentConsole->is_messagesPending())
900 actionMessages->setIcon(QIcon(QString::fromUtf8(":/images/mail-message-pending.png")));
902 actionMessages->setIcon(QIcon(QString::fromUtf8(":/images/mail-message-new.png")));