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)
69 app->setOverrideCursor(QCursor(Qt::WaitCursor));
73 m_dtformat = "yyyy-MM-dd HH:mm:ss";
75 setupUi(this); /* Setup UI defined by main.ui (designer) */
76 register_message_callback(message_callback);
79 treeWidget->setColumnCount(1);
80 treeWidget->setHeaderLabel( tr("Select Page") );
81 treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
85 resetFocus(); /* lineEdit->setFocus() */
88 actionJobPlot->setEnabled(false);
89 actionJobPlot->setVisible(false);
96 foreach(Console *console, m_consoleHash)
97 console->connect_dir();
98 m_currentConsole = (Console*)getFromHash(m_firstItem);
99 QTimer::singleShot(750, this, SLOT(popLists()));
101 QString directoryResourceName;
102 m_currentConsole->getDirResName(directoryResourceName);
103 Pmsg1(100, "Setting initial window to %s\n", directoryResourceName.toUtf8().data());
107 void MainWin::popLists()
109 foreach(Console *console, m_consoleHash)
110 console->populateLists(true);
111 app->restoreOverrideCursor();
113 connectConsoleSignals();
115 m_currentConsole->setCurrent();
118 void MainWin::createPages()
121 QTreeWidgetItem *item, *topItem;
125 foreach_res(dir, R_DIRECTOR) {
127 /* Create console tree stacked widget item */
128 m_currentConsole = new Console(stackedWidget);
129 m_currentConsole->setDirRes(dir);
130 m_currentConsole->readSettings();
132 /* The top tree item representing the director */
133 topItem = new QTreeWidgetItem(treeWidget);
134 topItem->setText(0, dir->name());
135 topItem->setIcon(0, QIcon(":images/server.png"));
136 /* Set background to grey for ease of identification of inactive Director */
137 QBrush greyBrush(Qt::lightGray);
138 topItem->setBackground(0, greyBrush);
139 m_currentConsole->setDirectorTreeItem(topItem);
140 m_consoleHash.insert(topItem, m_currentConsole);
142 /* Create Tree Widget Item */
143 item = new QTreeWidgetItem(topItem);
144 item->setText(0, tr("Console"));
145 if (!m_firstItem){ m_firstItem = item; }
146 item->setIcon(0,QIcon(QString::fromUtf8(":images/utilities-terminal.png")));
148 /* insert the cosole and tree widget item into the hashes */
149 hashInsert(item, m_currentConsole);
151 /* Set Color of treeWidgetItem for the console
152 * It will be set to green in the console class if the connection is made.
154 QBrush redBrush(Qt::red);
155 item->setForeground(0, redBrush);
156 m_currentConsole->dockPage();
159 * Create instances in alphabetic order of the rest
160 * of the classes that will by default exist under each Director.
166 createPageJobList("", "", "", "", NULL);
171 new JobPlot(NULL, pass);
180 treeWidget->expandItem(topItem);
181 stackedWidget->setCurrentWidget(m_currentConsole);
187 * create an instance of the the joblist class on the stack
189 void MainWin::createPageJobList(const QString &media, const QString &client,
190 const QString &job, const QString &fileset, QTreeWidgetItem *parentTreeWidgetItem)
192 QTreeWidgetItem *holdItem;
194 /* save current tree widget item in case query produces no results */
195 holdItem = treeWidget->currentItem();
196 JobList* joblist = new JobList(media, client, job, fileset, parentTreeWidgetItem);
197 /* If this is a query of jobs on a specific media */
198 if ((media != "") || (client != "") || (job != "") || (fileset != "")) {
199 joblist->setCurrent();
200 /* did query produce results, if not close window and set back to hold */
201 if (joblist->m_resultCount == 0) {
202 joblist->closeStackPage();
203 treeWidget->setCurrentItem(holdItem);
209 * Handle up and down arrow keys for the command line
212 void MainWin::keyPressEvent(QKeyEvent *event)
214 if (m_cmd_history.size() == 0) {
218 switch (event->key()) {
220 if (m_cmd_last < 0 || m_cmd_last >= (m_cmd_history.size()-1)) {
227 if (m_cmd_last == 0) {
231 if (m_cmd_last < 0 || m_cmd_last > (m_cmd_history.size()-1)) {
232 m_cmd_last = m_cmd_history.size() - 1;
241 lineEdit->setText(m_cmd_history[m_cmd_last]);
244 void MainWin::connectSignals()
246 /* Connect signals to slots */
247 connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(input_line()));
248 connect(actionAbout_bat, SIGNAL(triggered()), this, SLOT(about()));
249 connect(actionBat_Help, SIGNAL(triggered()), this, SLOT(help()));
250 connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
251 connect(treeWidget, SIGNAL( currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
252 connect(stackedWidget, SIGNAL(currentChanged(int)), this, SLOT(stackItemChanged(int)));
253 connect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows()));
254 connect(actionLabel, SIGNAL(triggered()), this, SLOT(labelButtonClicked()));
255 connect(actionRun, SIGNAL(triggered()), this, SLOT(runButtonClicked()));
256 connect(actionEstimate, SIGNAL(triggered()), this, SLOT(estimateButtonClicked()));
257 connect(actionBrowse, SIGNAL(triggered()), this, SLOT(browseButtonClicked()));
258 connect(actionStatusDirPage, SIGNAL(triggered()), this, SLOT(statusPageButtonClicked()));
260 connect(actionJobPlot, SIGNAL(triggered()), this, SLOT(jobPlotButtonClicked()));
262 connect(actionRestore, SIGNAL(triggered()), this, SLOT(restoreButtonClicked()));
263 connect(actionUndock, SIGNAL(triggered()), this, SLOT(undockWindowButton()));
264 connect(actionToggleDock, SIGNAL(triggered()), this, SLOT(toggleDockContextWindow()));
265 connect(actionClosePage, SIGNAL(triggered()), this, SLOT(closePage()));
266 connect(actionPreferences, SIGNAL(triggered()), this, SLOT(setPreferences()));
267 connect(actionRepopLists, SIGNAL(triggered()), this, SLOT(repopLists()));
268 connect(actionReloadRepop, SIGNAL(triggered()), this, SLOT(reloadRepopLists()));
271 void MainWin::disconnectSignals()
273 /* Connect signals to slots */
274 disconnect(lineEdit, SIGNAL(returnPressed()), this, SLOT(input_line()));
275 disconnect(actionAbout_bat, SIGNAL(triggered()), this, SLOT(about()));
276 disconnect(actionBat_Help, SIGNAL(triggered()), this, SLOT(help()));
277 disconnect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
278 disconnect(treeWidget, SIGNAL( currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
279 disconnect(stackedWidget, SIGNAL(currentChanged(int)), this, SLOT(stackItemChanged(int)));
280 disconnect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows()));
281 disconnect(actionLabel, SIGNAL(triggered()), this, SLOT(labelButtonClicked()));
282 disconnect(actionRun, SIGNAL(triggered()), this, SLOT(runButtonClicked()));
283 disconnect(actionEstimate, SIGNAL(triggered()), this, SLOT(estimateButtonClicked()));
284 disconnect(actionBrowse, SIGNAL(triggered()), this, SLOT(browseButtonClicked()));
285 disconnect(actionStatusDirPage, SIGNAL(triggered()), this, SLOT(statusPageButtonClicked()));
287 disconnect(actionJobPlot, SIGNAL(triggered()), this, SLOT(jobPlotButtonClicked()));
289 disconnect(actionRestore, SIGNAL(triggered()), this, SLOT(restoreButtonClicked()));
290 disconnect(actionUndock, SIGNAL(triggered()), this, SLOT(undockWindowButton()));
291 disconnect(actionToggleDock, SIGNAL(triggered()), this, SLOT(toggleDockContextWindow()));
292 disconnect(actionClosePage, SIGNAL(triggered()), this, SLOT(closePage()));
293 disconnect(actionPreferences, SIGNAL(triggered()), this, SLOT(setPreferences()));
294 disconnect(actionRepopLists, SIGNAL(triggered()), this, SLOT(repopLists()));
295 disconnect(actionReloadRepop, SIGNAL(triggered()), this, SLOT(reloadRepopLists()));
301 void MainWin::waitEnter()
304 if (mainWin->m_connDebug)
305 Pmsg0(000, "Should Never Get Here DANGER DANGER, for now I'll return\n");
309 if (mainWin->m_connDebug)
310 Pmsg0(000, "Entering Wait State\n");
311 app->setOverrideCursor(QCursor(Qt::WaitCursor));
313 disconnectConsoleSignals(m_currentConsole);
314 m_waitTreeItem = treeWidget->currentItem();
320 void MainWin::waitExit()
323 if (mainWin->m_connDebug)
324 Pmsg0(000, "Exiting Wait State\n");
325 app->restoreOverrideCursor();
326 if (m_waitTreeItem != treeWidget->currentItem())
327 treeWidget->setCurrentItem(m_waitTreeItem);
330 connectConsoleSignals();
334 void MainWin::connectConsoleSignals()
336 connect(actionConnect, SIGNAL(triggered()), m_currentConsole, SLOT(connect_dir()));
337 connect(actionSelectFont, SIGNAL(triggered()), m_currentConsole, SLOT(set_font()));
338 connect(actionStatusDir, SIGNAL(triggered()), m_currentConsole, SLOT(status_dir()));
339 connect(actionMessages, SIGNAL(triggered()), m_currentConsole, SLOT(messages()));
342 void MainWin::disconnectConsoleSignals(Console *console)
344 disconnect(actionConnect, SIGNAL(triggered()), console, SLOT(connect_dir()));
345 disconnect(actionStatusDir, SIGNAL(triggered()), console, SLOT(status_dir()));
346 disconnect(actionMessages, SIGNAL(triggered()), console, SLOT(messages()));
347 disconnect(actionSelectFont, SIGNAL(triggered()), console, SLOT(set_font()));
352 * Two functions to respond to menu items to repop lists and execute reload and repopulate
353 * the lists for jobs, clients, filesets .. ..
355 void MainWin::repopLists()
357 m_currentConsole->populateLists(false);
359 void MainWin::reloadRepopLists()
361 QString cmd = "reload";
362 m_currentConsole->consoleCommand(cmd);
363 m_currentConsole->populateLists(false);
367 * Reimplementation of QWidget closeEvent virtual function
369 void MainWin::closeEvent(QCloseEvent *event)
373 /* Remove all groups from settings for OpenOnExit so that we can start some of the status windows */
374 foreach(Console *console, m_consoleHash){
375 QSettings settings(console->m_dir->name(), "bat");
376 settings.beginGroup("OpenOnExit");
380 /* close all non console pages, this will call settings in destructors */
381 while (m_consoleHash.count() < m_pagehash.count()) {
382 foreach(Pages *page, m_pagehash) {
383 if (page != page->console()) {
384 QTreeWidgetItem* pageSelectorTreeWidgetItem = mainWin->getFromHash(page);
385 if (pageSelectorTreeWidgetItem->childCount() == 0) {
386 page->console()->setCurrent();
387 page->closeStackPage();
392 foreach(Console *console, m_consoleHash){
393 console->writeSettings();
394 console->terminate();
395 console->closeStackPage();
400 void MainWin::writeSettings()
402 QSettings settings("bacula.org", "bat");
404 settings.beginGroup("MainWin");
405 settings.setValue("winSize", size());
406 settings.setValue("winPos", pos());
407 settings.setValue("state", saveState());
412 void MainWin::readSettings()
414 QSettings settings("bacula.org", "bat");
416 settings.beginGroup("MainWin");
417 resize(settings.value("winSize", QSize(1041, 801)).toSize());
418 move(settings.value("winPos", QPoint(200, 150)).toPoint());
419 restoreState(settings.value("state").toByteArray());
424 * This subroutine is called with an item in the Page Selection window
427 void MainWin::treeItemClicked(QTreeWidgetItem *item, int /*column*/)
429 /* Is this a page that has been inserted into the hash */
430 if (getFromHash(item)) {
431 Pages* page = getFromHash(item);
432 int stackindex=stackedWidget->indexOf(page);
434 if (stackindex >= 0) {
435 stackedWidget->setCurrentWidget(page);
437 /* run the virtual function in case this class overrides it */
438 page->PgSeltreeWidgetClicked();
443 * Called with a change of the highlighed tree widget item in the page selector.
445 void MainWin::treeItemChanged(QTreeWidgetItem *currentitem, QTreeWidgetItem *previousitem)
447 if (m_isClosing) return; /* if closing the application, do nothing here */
449 Pages *previousPage, *nextPage;
450 Console *previousConsole = NULL;
451 Console *nextConsole;
453 /* remove all actions before adding actions appropriate for new page */
454 foreach(QAction* pageAction, treeWidget->actions()) {
455 treeWidget->removeAction(pageAction);
458 /* first determine the next item */
460 /* knowing the treeWidgetItem, get the page from the hash */
461 nextPage = getFromHash(currentitem);
462 nextConsole = m_consoleHash.value(currentitem);
463 /* Is this a page that has been inserted into the hash */
465 nextConsole = nextPage->console();
466 /* then is it a treeWidgetItem representing a director */
467 } else if (nextConsole) {
468 /* let the next page BE the console */
469 nextPage = nextConsole;
471 /* Should never get here */
476 /* The Previous item */
478 /* this condition prevents a segfault. The first time there is no previousitem*/
480 /* knowing the treeWidgetItem, get the page from the hash */
481 previousPage = getFromHash(previousitem);
482 previousConsole = m_consoleHash.value(previousitem);
484 previousConsole = previousPage->console();
485 } else if (previousConsole) {
486 previousPage = previousConsole;
488 if ((previousPage) || (previousConsole)) {
489 if (nextConsole != previousConsole) {
490 /* remove connections to the current console */
491 disconnectConsoleSignals(previousConsole);
492 QTreeWidgetItem *dirItem = previousConsole->directorTreeItem();
493 QBrush greyBrush(Qt::lightGray);
494 dirItem->setBackground(0, greyBrush);
499 /* process the current (next) item */
501 if ((nextPage) || (nextConsole)) {
502 if (nextConsole != previousConsole) {
503 /* make connections to the current console */
504 m_currentConsole = nextConsole;
505 connectConsoleSignals();
507 /* Set director's tree widget background to magenta for ease of identification */
508 QTreeWidgetItem *dirItem = m_currentConsole->directorTreeItem();
509 QBrush magentaBrush(Qt::magenta);
510 dirItem->setBackground(0, magentaBrush);
512 /* set the value for the currently active console */
513 int stackindex = stackedWidget->indexOf(nextPage);
515 /* Is this page currently on the stack or is it undocked */
516 if (stackindex >= 0) {
517 /* put this page on the top of the stack */
518 stackedWidget->setCurrentIndex(stackindex);
520 /* it is undocked, raise it to the front */
523 /* for the page selectors menu action to dock or undock, set the text */
524 nextPage->setContextMenuDockText();
526 treeWidget->addAction(actionToggleDock);
527 /* if this page is closeable, and it has no childern, then add that action */
528 if ((nextPage->isCloseable()) && (currentitem->child(0) == NULL))
529 treeWidget->addAction(actionClosePage);
531 /* Add the actions to the Page Selectors tree widget that are part of the
532 * current items list of desired actions regardless of whether on top of stack*/
533 treeWidget->addActions(nextPage->m_contextActions);
537 void MainWin::labelButtonClicked()
542 void MainWin::runButtonClicked()
547 void MainWin::estimateButtonClicked()
552 void MainWin::browseButtonClicked()
557 void MainWin::statusPageButtonClicked()
559 /* if one exists, then just set it current */
561 foreach(Pages *page, m_pagehash) {
562 if (m_currentConsole == page->console()) {
563 if (page->name() == tr("Director Status")) {
573 void MainWin::restoreButtonClicked()
575 new prerestorePage();
578 void MainWin::jobPlotButtonClicked()
583 new JobPlot(NULL, pass);
588 * The user just finished typing a line in the command line edit box
590 void MainWin::input_line()
592 QString cmdStr = lineEdit->text(); /* Get the text */
593 lineEdit->clear(); /* clear the lineEdit box */
594 if (m_currentConsole->is_connected()) {
595 /* Use consoleCommand to allow typing anything */
596 m_currentConsole->consoleCommand(cmdStr);
598 set_status(tr("Director not connected. Click on connect button."));
600 m_cmd_history.append(cmdStr);
602 if (treeWidget->currentItem() != getFromHash(m_currentConsole))
603 m_currentConsole->setCurrent();
607 void MainWin::about()
609 QMessageBox::about(this, tr("About bat"),
610 tr("<br><h2>bat %1 (%2), by Dirk H Bartley and Kern Sibbald</h2>"
611 "<p>Copyright © 2007-%3 Free Software Foundation Europe e.V."
612 "<p>The <b>bat</b> is an administrative console"
613 " interface to the Director.").arg(VERSION).arg(BDATE).arg(BYEAR));
618 Help::displayFile("index.html");
621 void MainWin::set_statusf(const char *fmt, ...)
626 va_start(arg_ptr, fmt);
627 len = bvsnprintf(buf, sizeof(buf), fmt, arg_ptr);
632 void MainWin::set_status_ready()
634 set_status(tr(" Ready"));
637 void MainWin::set_status(const QString &str)
639 statusBar()->showMessage(str);
642 void MainWin::set_status(const char *buf)
644 statusBar()->showMessage(buf);
648 * Function to respond to the button bar button to undock
650 void MainWin::undockWindowButton()
652 Pages* page = (Pages*)stackedWidget->currentWidget();
653 page->togglePageDocking();
657 * Function to respond to action on page selector context menu to toggle the
658 * dock status of the window associated with the page selectors current
661 void MainWin::toggleDockContextWindow()
663 QTreeWidgetItem *currentitem = treeWidget->currentItem();
665 /* Is this a page that has been inserted into the hash */
666 if (getFromHash(currentitem)) {
667 Pages* page = getFromHash(currentitem);
668 page->togglePageDocking();
673 * This function is called when the stack item is changed. Call
674 * the virtual function here. Avoids a window being undocked leaving
675 * a window at the top of the stack unpopulated.
677 void MainWin::stackItemChanged(int)
679 if (m_isClosing) return; /* if closing the application, do nothing here */
680 Pages* page = (Pages*)stackedWidget->currentWidget();
681 /* run the virtual function in case this class overrides it */
682 page->currentStackItem();
686 * Function to simplify insertion of QTreeWidgetItem <-> Page association
687 * into a double direction hash.
689 void MainWin::hashInsert(QTreeWidgetItem *item, Pages *page)
691 m_pagehash.insert(item, page);
692 m_widgethash.insert(page, item);
696 * Function to simplify removal of QTreeWidgetItem <-> Page association
697 * into a double direction hash.
699 void MainWin::hashRemove(QTreeWidgetItem *item, Pages *page)
701 /* I had all sorts of return status checking code here. Do we have a log
702 * level capability in bat. I would have left it in but it used printf's
703 * and it should really be some kind of log level facility ???
704 * ******FIXME********/
705 m_pagehash.remove(item);
706 m_widgethash.remove(page);
710 * Function to retrieve a Page* when the item in the page selector's tree is
713 Pages* MainWin::getFromHash(QTreeWidgetItem *item)
715 return m_pagehash.value(item);
719 * Function to retrieve the page selectors tree widget item when the page is
722 QTreeWidgetItem* MainWin::getFromHash(Pages *page)
724 return m_widgethash.value(page);
728 * Function to respond to action on page selector context menu to close the
731 void MainWin::closePage()
733 QTreeWidgetItem *currentitem = treeWidget->currentItem();
735 /* Is this a page that has been inserted into the hash */
736 if (getFromHash(currentitem)) {
737 Pages* page = getFromHash(currentitem);
738 if (page->isCloseable()) {
739 page->closeStackPage();
744 /* Quick function to return the current console */
745 Console *MainWin::currentConsole()
747 return m_currentConsole;
750 /* Quick function to return the tree item for the director */
751 QTreeWidgetItem *MainWin::currentTopItem()
753 return m_currentConsole->directorTreeItem();
756 /* Preferences menu item clicked */
757 void MainWin::setPreferences()
760 prefs.commDebug->setCheckState(m_commDebug ? Qt::Checked : Qt::Unchecked);
761 prefs.connDebug->setCheckState(m_connDebug ? Qt::Checked : Qt::Unchecked);
762 prefs.displayAll->setCheckState(m_displayAll ? Qt::Checked : Qt::Unchecked);
763 prefs.sqlDebug->setCheckState(m_sqlDebug ? Qt::Checked : Qt::Unchecked);
764 prefs.commandDebug->setCheckState(m_commandDebug ? Qt::Checked : Qt::Unchecked);
765 prefs.miscDebug->setCheckState(m_miscDebug ? Qt::Checked : Qt::Unchecked);
766 prefs.recordLimit->setCheckState(m_recordLimitCheck ? Qt::Checked : Qt::Unchecked);
767 prefs.recordSpinBox->setValue(m_recordLimitVal);
768 prefs.daysLimit->setCheckState(m_daysLimitCheck ? Qt::Checked : Qt::Unchecked);
769 prefs.daysSpinBox->setValue(m_daysLimitVal);
770 prefs.checkMessages->setCheckState(m_checkMessages ? Qt::Checked : Qt::Unchecked);
771 prefs.checkMessagesSpin->setValue(m_checkMessagesInterval);
772 prefs.executeLongCheckBox->setCheckState(m_longList ? Qt::Checked : Qt::Unchecked);
773 prefs.rtPopDirCheckBox->setCheckState(m_rtPopDirDebug ? Qt::Checked : Qt::Unchecked);
774 prefs.rtDirCurICCheckBox->setCheckState(m_rtDirCurICDebug ? Qt::Checked : Qt::Unchecked);
775 prefs.rtDirICCheckBox->setCheckState(m_rtDirICDebug ? Qt::Checked : Qt::Unchecked);
776 prefs.rtFileTabICCheckBox->setCheckState(m_rtFileTabICDebug ? Qt::Checked : Qt::Unchecked);
777 prefs.rtVerTabICCheckBox->setCheckState(m_rtVerTabICDebug ? Qt::Checked : Qt::Unchecked);
778 prefs.rtUpdateFTCheckBox->setCheckState(m_rtUpdateFTDebug ? Qt::Checked : Qt::Unchecked);
779 prefs.rtUpdateVTCheckBox->setCheckState(m_rtUpdateVTDebug ? Qt::Checked : Qt::Unchecked);
780 prefs.rtChecksCheckBox->setCheckState(m_rtChecksDebug ? Qt::Checked : Qt::Unchecked);
781 prefs.rtIconStateCheckBox->setCheckState(m_rtIconStateDebug ? Qt::Checked : Qt::Unchecked);
782 prefs.rtRestore1CheckBox->setCheckState(m_rtRestore1Debug ? Qt::Checked : Qt::Unchecked);
783 prefs.rtRestore2CheckBox->setCheckState(m_rtRestore2Debug ? Qt::Checked : Qt::Unchecked);
784 prefs.rtRestore3CheckBox->setCheckState(m_rtRestore3Debug ? Qt::Checked : Qt::Unchecked);
785 switch (ItemFormatterBase::getBytesConversion()) {
786 case ItemFormatterBase::BYTES_CONVERSION_NONE:
787 prefs.radioConvertOff->setChecked(Qt::Checked);
789 case ItemFormatterBase::BYTES_CONVERSION_IEC:
790 prefs.radioConvertIEC->setChecked(Qt::Checked);
793 prefs.radioConvertStandard->setChecked(Qt::Checked);
796 prefs.openPlotCheckBox->setCheckState(m_openPlot ? Qt::Checked : Qt::Unchecked);
798 prefs.openPlotCheckBox->setVisible(false);
800 prefs.openBrowserCheckBox->setCheckState(m_openBrowser ? Qt::Checked : Qt::Unchecked);
801 prefs.openDirStatCheckBox->setCheckState(m_openDirStat ? Qt::Checked : Qt::Unchecked);
805 /* Preferences dialog */
806 prefsDialog::prefsDialog()
811 void prefsDialog::accept()
814 mainWin->m_commDebug = this->commDebug->checkState() == Qt::Checked;
815 mainWin->m_connDebug = this->connDebug->checkState() == Qt::Checked;
816 mainWin->m_displayAll = this->displayAll->checkState() == Qt::Checked;
817 mainWin->m_sqlDebug = this->sqlDebug->checkState() == Qt::Checked;
818 mainWin->m_commandDebug = this->commandDebug->checkState() == Qt::Checked;
819 mainWin->m_miscDebug = this->miscDebug->checkState() == Qt::Checked;
820 mainWin->m_recordLimitCheck = this->recordLimit->checkState() == Qt::Checked;
821 mainWin->m_recordLimitVal = this->recordSpinBox->value();
822 mainWin->m_daysLimitCheck = this->daysLimit->checkState() == Qt::Checked;
823 mainWin->m_daysLimitVal = this->daysSpinBox->value();
824 mainWin->m_checkMessages = this->checkMessages->checkState() == Qt::Checked;
825 mainWin->m_checkMessagesInterval = this->checkMessagesSpin->value();
826 mainWin->m_longList = this->executeLongCheckBox->checkState() == Qt::Checked;
828 mainWin->m_rtPopDirDebug = this->rtPopDirCheckBox->checkState() == Qt::Checked;
829 mainWin->m_rtDirCurICDebug = this->rtDirCurICCheckBox->checkState() == Qt::Checked;
830 mainWin->m_rtDirICDebug = this->rtDirICCheckBox->checkState() == Qt::Checked;
831 mainWin->m_rtFileTabICDebug = this->rtFileTabICCheckBox->checkState() == Qt::Checked;
832 mainWin->m_rtVerTabICDebug = this->rtVerTabICCheckBox->checkState() == Qt::Checked;
833 mainWin->m_rtUpdateFTDebug = this->rtUpdateFTCheckBox->checkState() == Qt::Checked;
834 mainWin->m_rtUpdateVTDebug = this->rtUpdateVTCheckBox->checkState() == Qt::Checked;
835 mainWin->m_rtChecksDebug = this->rtChecksCheckBox->checkState() == Qt::Checked;
836 mainWin->m_rtIconStateDebug = this->rtIconStateCheckBox->checkState() == Qt::Checked;
837 mainWin->m_rtRestore1Debug = this->rtRestore1CheckBox->checkState() == Qt::Checked;
838 mainWin->m_rtRestore2Debug = this->rtRestore2CheckBox->checkState() == Qt::Checked;
839 mainWin->m_rtRestore3Debug = this->rtRestore3CheckBox->checkState() == Qt::Checked;
840 if (this->radioConvertOff->isChecked()) {
841 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_NONE);
842 } else if (this->radioConvertIEC->isChecked()){
843 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_IEC);
845 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_SI);
847 mainWin->m_openPlot = this->openPlotCheckBox->checkState() == Qt::Checked;
848 mainWin->m_openBrowser = this->openBrowserCheckBox->checkState() == Qt::Checked;
849 mainWin->m_openDirStat = this->openDirStatCheckBox->checkState() == Qt::Checked;
851 QSettings settings("www.bacula.org", "bat");
852 settings.beginGroup("Debug");
853 settings.setValue("commDebug", mainWin->m_commDebug);
854 settings.setValue("connDebug", mainWin->m_connDebug);
855 settings.setValue("displayAll", mainWin->m_displayAll);
856 settings.setValue("sqlDebug", mainWin->m_sqlDebug);
857 settings.setValue("commandDebug", mainWin->m_commandDebug);
858 settings.setValue("miscDebug", mainWin->m_miscDebug);
860 settings.beginGroup("JobList");
861 settings.setValue("recordLimitCheck", mainWin->m_recordLimitCheck);
862 settings.setValue("recordLimitVal", mainWin->m_recordLimitVal);
863 settings.setValue("daysLimitCheck", mainWin->m_daysLimitCheck);
864 settings.setValue("daysLimitVal", mainWin->m_daysLimitVal);
866 settings.beginGroup("Timers");
867 settings.setValue("checkMessages", mainWin->m_checkMessages);
868 settings.setValue("checkMessagesInterval", mainWin->m_checkMessagesInterval);
870 settings.beginGroup("Misc");
871 settings.setValue("longList", mainWin->m_longList);
872 settings.setValue("byteConvert", ItemFormatterBase::getBytesConversion());
873 settings.setValue("openplot", mainWin->m_openPlot);
874 settings.setValue("openbrowser", mainWin->m_openBrowser);
875 settings.setValue("opendirstat", mainWin->m_openDirStat);
877 settings.beginGroup("RestoreTree");
878 settings.setValue("rtPopDirDebug", mainWin->m_rtPopDirDebug);
879 settings.setValue("rtDirCurICDebug", mainWin->m_rtDirCurICDebug);
880 settings.setValue("rtDirCurICRetDebug", mainWin->m_rtDirICDebug);
881 settings.setValue("rtFileTabICDebug", mainWin->m_rtFileTabICDebug);
882 settings.setValue("rtVerTabICDebug", mainWin->m_rtVerTabICDebug);
883 settings.setValue("rtUpdateFTDebug", mainWin->m_rtUpdateFTDebug);
884 settings.setValue("rtUpdateVTDebug", mainWin->m_rtUpdateVTDebug);
885 settings.setValue("rtChecksDebug", mainWin->m_rtChecksDebug);
886 settings.setValue("rtIconStateDebug", mainWin->m_rtIconStateDebug);
887 settings.setValue("rtRestore1Debug", mainWin->m_rtRestore1Debug);
888 settings.setValue("rtRestore2Debug", mainWin->m_rtRestore2Debug);
889 settings.setValue("rtRestore3Debug", mainWin->m_rtRestore3Debug);
893 void prefsDialog::reject()
896 mainWin->set_status(tr("Canceled"));
899 /* read preferences for the prefences dialog box */
900 void MainWin::readPreferences()
902 QSettings settings("www.bacula.org", "bat");
903 settings.beginGroup("Debug");
904 m_commDebug = settings.value("commDebug", false).toBool();
905 m_connDebug = settings.value("connDebug", false).toBool();
906 m_displayAll = settings.value("displayAll", false).toBool();
907 m_sqlDebug = settings.value("sqlDebug", false).toBool();
908 m_commandDebug = settings.value("commandDebug", false).toBool();
909 m_miscDebug = settings.value("miscDebug", false).toBool();
911 settings.beginGroup("JobList");
912 m_recordLimitCheck = settings.value("recordLimitCheck", true).toBool();
913 m_recordLimitVal = settings.value("recordLimitVal", 150).toInt();
914 m_daysLimitCheck = settings.value("daysLimitCheck", false).toBool();
915 m_daysLimitVal = settings.value("daysLimitVal", 28).toInt();
917 settings.beginGroup("Timers");
918 m_checkMessages = settings.value("checkMessages", false).toBool();
919 m_checkMessagesInterval = settings.value("checkMessagesInterval", 28).toInt();
921 settings.beginGroup("Misc");
922 m_longList = settings.value("longList", false).toBool();
923 ItemFormatterBase::setBytesConversion(
924 (ItemFormatterBase::BYTES_CONVERSION) settings.value("byteConvert",
925 ItemFormatterBase::BYTES_CONVERSION_IEC).toInt());
926 m_openPlot = settings.value("openplot", false).toBool();
927 m_openBrowser = settings.value("openbrowser", false).toBool();
928 m_openDirStat = settings.value("opendirstat", false).toBool();
930 settings.beginGroup("RestoreTree");
931 m_rtPopDirDebug = settings.value("rtPopDirDebug", false).toBool();
932 m_rtDirCurICDebug = settings.value("rtDirCurICDebug", false).toBool();
933 m_rtDirICDebug = settings.value("rtDirCurICRetDebug", false).toBool();
934 m_rtFileTabICDebug = settings.value("rtFileTabICDebug", false).toBool();
935 m_rtVerTabICDebug = settings.value("rtVerTabICDebug", false).toBool();
936 m_rtUpdateFTDebug = settings.value("rtUpdateFTDebug", false).toBool();
937 m_rtUpdateVTDebug = settings.value("rtUpdateVTDebug", false).toBool();
938 m_rtChecksDebug = settings.value("rtChecksDebug", false).toBool();
939 m_rtIconStateDebug = settings.value("rtIconStateDebug", false).toBool();
940 m_rtRestore1Debug = settings.value("rtRestore1Debug", false).toBool();
941 m_rtRestore2Debug = settings.value("rtRestore2Debug", false).toBool();
942 m_rtRestore3Debug = settings.value("rtRestore3Debug", false).toBool();
946 void MainWin::setMessageIcon()
948 if (m_currentConsole->is_messagesPending())
949 actionMessages->setIcon(QIcon(QString::fromUtf8(":/images/mail-message-pending.png")));
951 actionMessages->setIcon(QIcon(QString::fromUtf8(":/images/mail-message-new.png")));