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_treeStackTrap = false;
74 m_dtformat = "yyyy-MM-dd HH:mm:ss";
76 setupUi(this); /* Setup UI defined by main.ui (designer) */
77 register_message_callback(message_callback);
80 treeWidget->setColumnCount(1);
81 treeWidget->setHeaderLabel( tr("Select Page") );
82 treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
86 resetFocus(); /* lineEdit->setFocus() */
89 actionJobPlot->setEnabled(false);
90 actionJobPlot->setVisible(false);
97 foreach(Console *console, m_consoleHash)
98 console->connect_dir();
99 m_currentConsole = (Console*)getFromHash(m_firstItem);
100 QTimer::singleShot(750, this, SLOT(popLists()));
102 QString directoryResourceName;
103 m_currentConsole->getDirResName(directoryResourceName);
104 Pmsg1(100, "Setting initial window to %s\n", directoryResourceName.toUtf8().data());
108 void MainWin::popLists()
110 foreach(Console *console, m_consoleHash)
111 console->populateLists(true);
112 app->restoreOverrideCursor();
114 connectConsoleSignals();
116 m_currentConsole->setCurrent();
119 void MainWin::createPages()
122 QTreeWidgetItem *item, *topItem;
126 foreach_res(dir, R_DIRECTOR) {
128 /* Create console tree stacked widget item */
129 m_currentConsole = new Console(stackedWidget);
130 m_currentConsole->setDirRes(dir);
131 m_currentConsole->readSettings();
133 /* The top tree item representing the director */
134 topItem = new QTreeWidgetItem(treeWidget);
135 topItem->setText(0, dir->name());
136 topItem->setIcon(0, QIcon(":images/server.png"));
137 /* Set background to grey for ease of identification of inactive Director */
138 QBrush greyBrush(Qt::lightGray);
139 topItem->setBackground(0, greyBrush);
140 m_currentConsole->setDirectorTreeItem(topItem);
141 m_consoleHash.insert(topItem, m_currentConsole);
143 /* Create Tree Widget Item */
144 item = new QTreeWidgetItem(topItem);
145 item->setText(0, tr("Console"));
146 if (!m_firstItem){ m_firstItem = item; }
147 item->setIcon(0,QIcon(QString::fromUtf8(":images/utilities-terminal.png")));
149 /* insert the cosole and tree widget item into the hashes */
150 hashInsert(item, m_currentConsole);
152 /* Set Color of treeWidgetItem for the console
153 * It will be set to green in the console class if the connection is made.
155 QBrush redBrush(Qt::red);
156 item->setForeground(0, redBrush);
157 m_currentConsole->dockPage();
160 * Create instances in alphabetic order of the rest
161 * of the classes that will by default exist under each Director.
167 createPageJobList("", "", "", "", NULL);
172 new JobPlot(NULL, pass);
181 treeWidget->expandItem(topItem);
182 stackedWidget->setCurrentWidget(m_currentConsole);
188 * create an instance of the the joblist class on the stack
190 void MainWin::createPageJobList(const QString &media, const QString &client,
191 const QString &job, const QString &fileset, QTreeWidgetItem *parentTreeWidgetItem)
193 QTreeWidgetItem *holdItem;
195 /* save current tree widget item in case query produces no results */
196 holdItem = treeWidget->currentItem();
197 JobList* joblist = new JobList(media, client, job, fileset, parentTreeWidgetItem);
198 /* If this is a query of jobs on a specific media */
199 if ((media != "") || (client != "") || (job != "") || (fileset != "")) {
200 joblist->setCurrent();
201 /* did query produce results, if not close window and set back to hold */
202 if (joblist->m_resultCount == 0) {
203 joblist->closeStackPage();
204 treeWidget->setCurrentItem(holdItem);
210 * Handle up and down arrow keys for the command line
213 void MainWin::keyPressEvent(QKeyEvent *event)
215 if (m_cmd_history.size() == 0) {
219 switch (event->key()) {
221 if (m_cmd_last < 0 || m_cmd_last >= (m_cmd_history.size()-1)) {
228 if (m_cmd_last == 0) {
232 if (m_cmd_last < 0 || m_cmd_last > (m_cmd_history.size()-1)) {
233 m_cmd_last = m_cmd_history.size() - 1;
242 lineEdit->setText(m_cmd_history[m_cmd_last]);
245 void MainWin::connectSignals()
247 /* Connect signals to slots */
248 connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(input_line()));
249 connect(actionAbout_bat, SIGNAL(triggered()), this, SLOT(about()));
250 connect(actionBat_Help, SIGNAL(triggered()), this, SLOT(help()));
251 connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
252 connect(treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
253 connect(stackedWidget, SIGNAL(currentChanged(int)), this, SLOT(stackItemChanged(int)));
254 connect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows()));
255 connect(actionLabel, SIGNAL(triggered()), this, SLOT(labelButtonClicked()));
256 connect(actionRun, SIGNAL(triggered()), this, SLOT(runButtonClicked()));
257 connect(actionEstimate, SIGNAL(triggered()), this, SLOT(estimateButtonClicked()));
258 connect(actionBrowse, SIGNAL(triggered()), this, SLOT(browseButtonClicked()));
259 connect(actionStatusDirPage, SIGNAL(triggered()), this, SLOT(statusPageButtonClicked()));
261 connect(actionJobPlot, SIGNAL(triggered()), this, SLOT(jobPlotButtonClicked()));
263 connect(actionRestore, SIGNAL(triggered()), this, SLOT(restoreButtonClicked()));
264 connect(actionUndock, SIGNAL(triggered()), this, SLOT(undockWindowButton()));
265 connect(actionToggleDock, SIGNAL(triggered()), this, SLOT(toggleDockContextWindow()));
266 connect(actionClosePage, SIGNAL(triggered()), this, SLOT(closePage()));
267 connect(actionPreferences, SIGNAL(triggered()), this, SLOT(setPreferences()));
268 connect(actionRepopLists, SIGNAL(triggered()), this, SLOT(repopLists()));
269 connect(actionReloadRepop, SIGNAL(triggered()), this, SLOT(reloadRepopLists()));
272 void MainWin::disconnectSignals()
274 /* Connect signals to slots */
275 disconnect(lineEdit, SIGNAL(returnPressed()), this, SLOT(input_line()));
276 disconnect(actionAbout_bat, SIGNAL(triggered()), this, SLOT(about()));
277 disconnect(actionBat_Help, SIGNAL(triggered()), this, SLOT(help()));
278 disconnect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
279 disconnect(treeWidget, SIGNAL( currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
280 disconnect(stackedWidget, SIGNAL(currentChanged(int)), this, SLOT(stackItemChanged(int)));
281 disconnect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows()));
282 disconnect(actionLabel, SIGNAL(triggered()), this, SLOT(labelButtonClicked()));
283 disconnect(actionRun, SIGNAL(triggered()), this, SLOT(runButtonClicked()));
284 disconnect(actionEstimate, SIGNAL(triggered()), this, SLOT(estimateButtonClicked()));
285 disconnect(actionBrowse, SIGNAL(triggered()), this, SLOT(browseButtonClicked()));
286 disconnect(actionStatusDirPage, SIGNAL(triggered()), this, SLOT(statusPageButtonClicked()));
288 disconnect(actionJobPlot, SIGNAL(triggered()), this, SLOT(jobPlotButtonClicked()));
290 disconnect(actionRestore, SIGNAL(triggered()), this, SLOT(restoreButtonClicked()));
291 disconnect(actionUndock, SIGNAL(triggered()), this, SLOT(undockWindowButton()));
292 disconnect(actionToggleDock, SIGNAL(triggered()), this, SLOT(toggleDockContextWindow()));
293 disconnect(actionClosePage, SIGNAL(triggered()), this, SLOT(closePage()));
294 disconnect(actionPreferences, SIGNAL(triggered()), this, SLOT(setPreferences()));
295 disconnect(actionRepopLists, SIGNAL(triggered()), this, SLOT(repopLists()));
296 disconnect(actionReloadRepop, SIGNAL(triggered()), this, SLOT(reloadRepopLists()));
302 void MainWin::waitEnter()
305 if (mainWin->m_connDebug)
306 Pmsg0(000, "Should Never Get Here DANGER DANGER, for now I'll return\n");
310 if (mainWin->m_connDebug)
311 Pmsg0(000, "Entering Wait State\n");
312 app->setOverrideCursor(QCursor(Qt::WaitCursor));
314 disconnectConsoleSignals(m_currentConsole);
315 m_waitTreeItem = treeWidget->currentItem();
321 void MainWin::waitExit()
324 if (mainWin->m_connDebug)
325 Pmsg0(000, "Exiting Wait State\n");
326 app->restoreOverrideCursor();
327 if (m_waitTreeItem != treeWidget->currentItem())
328 treeWidget->setCurrentItem(m_waitTreeItem);
331 connectConsoleSignals();
335 void MainWin::connectConsoleSignals()
337 connect(actionConnect, SIGNAL(triggered()), m_currentConsole, SLOT(connect_dir()));
338 connect(actionSelectFont, SIGNAL(triggered()), m_currentConsole, SLOT(set_font()));
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(actionMessages, SIGNAL(triggered()), console, SLOT(messages()));
346 disconnect(actionSelectFont, SIGNAL(triggered()), console, SLOT(set_font()));
351 * Two functions to respond to menu items to repop lists and execute reload and repopulate
352 * the lists for jobs, clients, filesets .. ..
354 void MainWin::repopLists()
356 m_currentConsole->populateLists(false);
358 void MainWin::reloadRepopLists()
360 QString cmd = "reload";
361 m_currentConsole->consoleCommand(cmd);
362 m_currentConsole->populateLists(false);
366 * Reimplementation of QWidget closeEvent virtual function
368 void MainWin::closeEvent(QCloseEvent *event)
372 /* Remove all groups from settings for OpenOnExit so that we can start some of the status windows */
373 foreach(Console *console, m_consoleHash){
374 QSettings settings(console->m_dir->name(), "bat");
375 settings.beginGroup("OpenOnExit");
379 /* close all non console pages, this will call settings in destructors */
380 while (m_consoleHash.count() < m_pagehash.count()) {
381 foreach(Pages *page, m_pagehash) {
382 if (page != page->console()) {
383 QTreeWidgetItem* pageSelectorTreeWidgetItem = mainWin->getFromHash(page);
384 if (pageSelectorTreeWidgetItem->childCount() == 0) {
385 page->console()->setCurrent();
386 page->closeStackPage();
391 foreach(Console *console, m_consoleHash){
392 console->writeSettings();
393 console->terminate();
394 console->closeStackPage();
399 void MainWin::writeSettings()
401 QSettings settings("bacula.org", "bat");
403 settings.beginGroup("MainWin");
404 settings.setValue("winSize", size());
405 settings.setValue("winPos", pos());
406 settings.setValue("state", saveState());
411 void MainWin::readSettings()
413 QSettings settings("bacula.org", "bat");
415 settings.beginGroup("MainWin");
416 resize(settings.value("winSize", QSize(1041, 801)).toSize());
417 move(settings.value("winPos", QPoint(200, 150)).toPoint());
418 restoreState(settings.value("state").toByteArray());
423 * This subroutine is called with an item in the Page Selection window
426 void MainWin::treeItemClicked(QTreeWidgetItem *item, int /*column*/)
428 /* Is this a page that has been inserted into the hash */
429 if (getFromHash(item)) {
430 Pages* page = getFromHash(item);
431 int stackindex=stackedWidget->indexOf(page);
433 if (stackindex >= 0) {
434 stackedWidget->setCurrentWidget(page);
436 /* run the virtual function in case this class overrides it */
437 page->PgSeltreeWidgetClicked();
442 * Called with a change of the highlighed tree widget item in the page selector.
444 void MainWin::treeItemChanged(QTreeWidgetItem *currentitem, QTreeWidgetItem *previousitem)
446 if (m_isClosing) return; /* if closing the application, do nothing here */
448 Pages *previousPage, *nextPage;
449 Console *previousConsole = NULL;
450 Console *nextConsole;
452 /* remove all actions before adding actions appropriate for new page */
453 foreach(QAction* pageAction, treeWidget->actions()) {
454 treeWidget->removeAction(pageAction);
457 /* first determine the next item */
459 /* knowing the treeWidgetItem, get the page from the hash */
460 nextPage = getFromHash(currentitem);
461 nextConsole = m_consoleHash.value(currentitem);
462 /* Is this a page that has been inserted into the hash */
464 nextConsole = nextPage->console();
465 /* then is it a treeWidgetItem representing a director */
466 } else if (nextConsole) {
467 /* let the next page BE the console */
468 nextPage = nextConsole;
470 /* Should never get here */
475 /* The Previous item */
477 /* this condition prevents a segfault. The first time there is no previousitem*/
479 if (m_treeStackTrap == false) { /* keep track of previous items for going Back */
480 m_treeWidgetStack.append(previousitem);
482 /* knowing the treeWidgetItem, get the page from the hash */
483 previousPage = getFromHash(previousitem);
484 previousConsole = m_consoleHash.value(previousitem);
486 previousConsole = previousPage->console();
487 } else if (previousConsole) {
488 previousPage = previousConsole;
490 if ((previousPage) || (previousConsole)) {
491 if (nextConsole != previousConsole) {
492 /* remove connections to the current console */
493 disconnectConsoleSignals(previousConsole);
494 QTreeWidgetItem *dirItem = previousConsole->directorTreeItem();
495 QBrush greyBrush(Qt::lightGray);
496 dirItem->setBackground(0, greyBrush);
501 /* process the current (next) item */
503 if ((nextPage) || (nextConsole)) {
504 if (nextConsole != previousConsole) {
505 /* make connections to the current console */
506 m_currentConsole = nextConsole;
507 connectConsoleSignals();
509 /* Set director's tree widget background to magenta for ease of identification */
510 QTreeWidgetItem *dirItem = m_currentConsole->directorTreeItem();
511 QBrush magentaBrush(Qt::magenta);
512 dirItem->setBackground(0, magentaBrush);
514 /* set the value for the currently active console */
515 int stackindex = stackedWidget->indexOf(nextPage);
517 /* Is this page currently on the stack or is it undocked */
518 if (stackindex >= 0) {
519 /* put this page on the top of the stack */
520 stackedWidget->setCurrentIndex(stackindex);
522 /* it is undocked, raise it to the front */
525 /* for the page selectors menu action to dock or undock, set the text */
526 nextPage->setContextMenuDockText();
528 treeWidget->addAction(actionToggleDock);
529 /* if this page is closeable, and it has no childern, then add that action */
530 if ((nextPage->isCloseable()) && (currentitem->child(0) == NULL))
531 treeWidget->addAction(actionClosePage);
533 /* Add the actions to the Page Selectors tree widget that are part of the
534 * current items list of desired actions regardless of whether on top of stack*/
535 treeWidget->addActions(nextPage->m_contextActions);
539 void MainWin::labelButtonClicked()
544 void MainWin::runButtonClicked()
549 void MainWin::estimateButtonClicked()
554 void MainWin::browseButtonClicked()
559 void MainWin::statusPageButtonClicked()
561 /* if one exists, then just set it current */
563 foreach(Pages *page, m_pagehash) {
564 if (m_currentConsole == page->console()) {
565 if (page->name() == tr("Director Status")) {
575 void MainWin::restoreButtonClicked()
577 new prerestorePage();
580 void MainWin::jobPlotButtonClicked()
585 new JobPlot(NULL, pass);
590 * The user just finished typing a line in the command line edit box
592 void MainWin::input_line()
594 QString cmdStr = lineEdit->text(); /* Get the text */
595 lineEdit->clear(); /* clear the lineEdit box */
596 if (m_currentConsole->is_connected()) {
597 /* Use consoleCommand to allow typing anything */
598 m_currentConsole->consoleCommand(cmdStr);
600 set_status(tr("Director not connected. Click on connect button."));
602 m_cmd_history.append(cmdStr);
604 if (treeWidget->currentItem() != getFromHash(m_currentConsole))
605 m_currentConsole->setCurrent();
609 void MainWin::about()
611 QMessageBox::about(this, tr("About bat"),
612 tr("<br><h2>bat %1 (%2), by Dirk H Bartley and Kern Sibbald</h2>"
613 "<p>Copyright © 2007-%3 Free Software Foundation Europe e.V."
614 "<p>The <b>bat</b> is an administrative console"
615 " interface to the Director.").arg(VERSION).arg(BDATE).arg(BYEAR));
620 Help::displayFile("index.html");
623 void MainWin::set_statusf(const char *fmt, ...)
628 va_start(arg_ptr, fmt);
629 len = bvsnprintf(buf, sizeof(buf), fmt, arg_ptr);
634 void MainWin::set_status_ready()
636 set_status(tr(" Ready"));
639 void MainWin::set_status(const QString &str)
641 statusBar()->showMessage(str);
644 void MainWin::set_status(const char *buf)
646 statusBar()->showMessage(buf);
650 * Function to respond to the button bar button to undock
652 void MainWin::undockWindowButton()
654 Pages* page = (Pages*)stackedWidget->currentWidget();
655 page->togglePageDocking();
659 * Function to respond to action on page selector context menu to toggle the
660 * dock status of the window associated with the page selectors current
663 void MainWin::toggleDockContextWindow()
665 QTreeWidgetItem *currentitem = treeWidget->currentItem();
667 /* Is this a page that has been inserted into the hash */
668 if (getFromHash(currentitem)) {
669 Pages* page = getFromHash(currentitem);
670 page->togglePageDocking();
675 * This function is called when the stack item is changed. Call
676 * the virtual function here. Avoids a window being undocked leaving
677 * a window at the top of the stack unpopulated.
679 void MainWin::stackItemChanged(int)
681 if (m_isClosing) return; /* if closing the application, do nothing here */
682 Pages* page = (Pages*)stackedWidget->currentWidget();
683 /* run the virtual function in case this class overrides it */
684 page->currentStackItem();
688 * Function to simplify insertion of QTreeWidgetItem <-> Page association
689 * into a double direction hash.
691 void MainWin::hashInsert(QTreeWidgetItem *item, Pages *page)
693 m_pagehash.insert(item, page);
694 m_widgethash.insert(page, item);
698 * Function to simplify removal of QTreeWidgetItem <-> Page association
699 * into a double direction hash.
701 void MainWin::hashRemove(QTreeWidgetItem *item, Pages *page)
703 /* I had all sorts of return status checking code here. Do we have a log
704 * level capability in bat. I would have left it in but it used printf's
705 * and it should really be some kind of log level facility ???
706 * ******FIXME********/
707 m_pagehash.remove(item);
708 m_widgethash.remove(page);
712 * Function to retrieve a Page* when the item in the page selector's tree is
715 Pages* MainWin::getFromHash(QTreeWidgetItem *item)
717 return m_pagehash.value(item);
721 * Function to retrieve the page selectors tree widget item when the page is
724 QTreeWidgetItem* MainWin::getFromHash(Pages *page)
726 return m_widgethash.value(page);
730 * Function to respond to action on page selector context menu to close the
733 void MainWin::closePage()
735 QTreeWidgetItem *currentitem = treeWidget->currentItem();
737 /* Is this a page that has been inserted into the hash */
738 if (getFromHash(currentitem)) {
739 Pages* page = getFromHash(currentitem);
740 if (page->isCloseable()) {
741 page->closeStackPage();
746 /* Quick function to return the current console */
747 Console *MainWin::currentConsole()
749 return m_currentConsole;
752 /* Quick function to return the tree item for the director */
753 QTreeWidgetItem *MainWin::currentTopItem()
755 return m_currentConsole->directorTreeItem();
758 /* Preferences menu item clicked */
759 void MainWin::setPreferences()
762 prefs.commDebug->setCheckState(m_commDebug ? Qt::Checked : Qt::Unchecked);
763 prefs.connDebug->setCheckState(m_connDebug ? Qt::Checked : Qt::Unchecked);
764 prefs.displayAll->setCheckState(m_displayAll ? Qt::Checked : Qt::Unchecked);
765 prefs.sqlDebug->setCheckState(m_sqlDebug ? Qt::Checked : Qt::Unchecked);
766 prefs.commandDebug->setCheckState(m_commandDebug ? Qt::Checked : Qt::Unchecked);
767 prefs.miscDebug->setCheckState(m_miscDebug ? Qt::Checked : Qt::Unchecked);
768 prefs.recordLimit->setCheckState(m_recordLimitCheck ? Qt::Checked : Qt::Unchecked);
769 prefs.recordSpinBox->setValue(m_recordLimitVal);
770 prefs.daysLimit->setCheckState(m_daysLimitCheck ? Qt::Checked : Qt::Unchecked);
771 prefs.daysSpinBox->setValue(m_daysLimitVal);
772 prefs.checkMessages->setCheckState(m_checkMessages ? Qt::Checked : Qt::Unchecked);
773 prefs.checkMessagesSpin->setValue(m_checkMessagesInterval);
774 prefs.executeLongCheckBox->setCheckState(m_longList ? Qt::Checked : Qt::Unchecked);
775 prefs.rtPopDirCheckBox->setCheckState(m_rtPopDirDebug ? Qt::Checked : Qt::Unchecked);
776 prefs.rtDirCurICCheckBox->setCheckState(m_rtDirCurICDebug ? Qt::Checked : Qt::Unchecked);
777 prefs.rtDirICCheckBox->setCheckState(m_rtDirICDebug ? Qt::Checked : Qt::Unchecked);
778 prefs.rtFileTabICCheckBox->setCheckState(m_rtFileTabICDebug ? Qt::Checked : Qt::Unchecked);
779 prefs.rtVerTabICCheckBox->setCheckState(m_rtVerTabICDebug ? Qt::Checked : Qt::Unchecked);
780 prefs.rtUpdateFTCheckBox->setCheckState(m_rtUpdateFTDebug ? Qt::Checked : Qt::Unchecked);
781 prefs.rtUpdateVTCheckBox->setCheckState(m_rtUpdateVTDebug ? Qt::Checked : Qt::Unchecked);
782 prefs.rtChecksCheckBox->setCheckState(m_rtChecksDebug ? Qt::Checked : Qt::Unchecked);
783 prefs.rtIconStateCheckBox->setCheckState(m_rtIconStateDebug ? Qt::Checked : Qt::Unchecked);
784 prefs.rtRestore1CheckBox->setCheckState(m_rtRestore1Debug ? Qt::Checked : Qt::Unchecked);
785 prefs.rtRestore2CheckBox->setCheckState(m_rtRestore2Debug ? Qt::Checked : Qt::Unchecked);
786 prefs.rtRestore3CheckBox->setCheckState(m_rtRestore3Debug ? Qt::Checked : Qt::Unchecked);
787 switch (ItemFormatterBase::getBytesConversion()) {
788 case ItemFormatterBase::BYTES_CONVERSION_NONE:
789 prefs.radioConvertOff->setChecked(Qt::Checked);
791 case ItemFormatterBase::BYTES_CONVERSION_IEC:
792 prefs.radioConvertIEC->setChecked(Qt::Checked);
795 prefs.radioConvertStandard->setChecked(Qt::Checked);
798 prefs.openPlotCheckBox->setCheckState(m_openPlot ? Qt::Checked : Qt::Unchecked);
800 prefs.openPlotCheckBox->setVisible(false);
802 prefs.openBrowserCheckBox->setCheckState(m_openBrowser ? Qt::Checked : Qt::Unchecked);
803 prefs.openDirStatCheckBox->setCheckState(m_openDirStat ? Qt::Checked : Qt::Unchecked);
807 /* Preferences dialog */
808 prefsDialog::prefsDialog()
813 void prefsDialog::accept()
816 mainWin->m_commDebug = this->commDebug->checkState() == Qt::Checked;
817 mainWin->m_connDebug = this->connDebug->checkState() == Qt::Checked;
818 mainWin->m_displayAll = this->displayAll->checkState() == Qt::Checked;
819 mainWin->m_sqlDebug = this->sqlDebug->checkState() == Qt::Checked;
820 mainWin->m_commandDebug = this->commandDebug->checkState() == Qt::Checked;
821 mainWin->m_miscDebug = this->miscDebug->checkState() == Qt::Checked;
822 mainWin->m_recordLimitCheck = this->recordLimit->checkState() == Qt::Checked;
823 mainWin->m_recordLimitVal = this->recordSpinBox->value();
824 mainWin->m_daysLimitCheck = this->daysLimit->checkState() == Qt::Checked;
825 mainWin->m_daysLimitVal = this->daysSpinBox->value();
826 mainWin->m_checkMessages = this->checkMessages->checkState() == Qt::Checked;
827 mainWin->m_checkMessagesInterval = this->checkMessagesSpin->value();
828 mainWin->m_longList = this->executeLongCheckBox->checkState() == Qt::Checked;
830 mainWin->m_rtPopDirDebug = this->rtPopDirCheckBox->checkState() == Qt::Checked;
831 mainWin->m_rtDirCurICDebug = this->rtDirCurICCheckBox->checkState() == Qt::Checked;
832 mainWin->m_rtDirICDebug = this->rtDirICCheckBox->checkState() == Qt::Checked;
833 mainWin->m_rtFileTabICDebug = this->rtFileTabICCheckBox->checkState() == Qt::Checked;
834 mainWin->m_rtVerTabICDebug = this->rtVerTabICCheckBox->checkState() == Qt::Checked;
835 mainWin->m_rtUpdateFTDebug = this->rtUpdateFTCheckBox->checkState() == Qt::Checked;
836 mainWin->m_rtUpdateVTDebug = this->rtUpdateVTCheckBox->checkState() == Qt::Checked;
837 mainWin->m_rtChecksDebug = this->rtChecksCheckBox->checkState() == Qt::Checked;
838 mainWin->m_rtIconStateDebug = this->rtIconStateCheckBox->checkState() == Qt::Checked;
839 mainWin->m_rtRestore1Debug = this->rtRestore1CheckBox->checkState() == Qt::Checked;
840 mainWin->m_rtRestore2Debug = this->rtRestore2CheckBox->checkState() == Qt::Checked;
841 mainWin->m_rtRestore3Debug = this->rtRestore3CheckBox->checkState() == Qt::Checked;
842 if (this->radioConvertOff->isChecked()) {
843 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_NONE);
844 } else if (this->radioConvertIEC->isChecked()){
845 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_IEC);
847 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_SI);
849 mainWin->m_openPlot = this->openPlotCheckBox->checkState() == Qt::Checked;
850 mainWin->m_openBrowser = this->openBrowserCheckBox->checkState() == Qt::Checked;
851 mainWin->m_openDirStat = this->openDirStatCheckBox->checkState() == Qt::Checked;
853 QSettings settings("www.bacula.org", "bat");
854 settings.beginGroup("Debug");
855 settings.setValue("commDebug", mainWin->m_commDebug);
856 settings.setValue("connDebug", mainWin->m_connDebug);
857 settings.setValue("displayAll", mainWin->m_displayAll);
858 settings.setValue("sqlDebug", mainWin->m_sqlDebug);
859 settings.setValue("commandDebug", mainWin->m_commandDebug);
860 settings.setValue("miscDebug", mainWin->m_miscDebug);
862 settings.beginGroup("JobList");
863 settings.setValue("recordLimitCheck", mainWin->m_recordLimitCheck);
864 settings.setValue("recordLimitVal", mainWin->m_recordLimitVal);
865 settings.setValue("daysLimitCheck", mainWin->m_daysLimitCheck);
866 settings.setValue("daysLimitVal", mainWin->m_daysLimitVal);
868 settings.beginGroup("Timers");
869 settings.setValue("checkMessages", mainWin->m_checkMessages);
870 settings.setValue("checkMessagesInterval", mainWin->m_checkMessagesInterval);
872 settings.beginGroup("Misc");
873 settings.setValue("longList", mainWin->m_longList);
874 settings.setValue("byteConvert", ItemFormatterBase::getBytesConversion());
875 settings.setValue("openplot", mainWin->m_openPlot);
876 settings.setValue("openbrowser", mainWin->m_openBrowser);
877 settings.setValue("opendirstat", mainWin->m_openDirStat);
879 settings.beginGroup("RestoreTree");
880 settings.setValue("rtPopDirDebug", mainWin->m_rtPopDirDebug);
881 settings.setValue("rtDirCurICDebug", mainWin->m_rtDirCurICDebug);
882 settings.setValue("rtDirCurICRetDebug", mainWin->m_rtDirICDebug);
883 settings.setValue("rtFileTabICDebug", mainWin->m_rtFileTabICDebug);
884 settings.setValue("rtVerTabICDebug", mainWin->m_rtVerTabICDebug);
885 settings.setValue("rtUpdateFTDebug", mainWin->m_rtUpdateFTDebug);
886 settings.setValue("rtUpdateVTDebug", mainWin->m_rtUpdateVTDebug);
887 settings.setValue("rtChecksDebug", mainWin->m_rtChecksDebug);
888 settings.setValue("rtIconStateDebug", mainWin->m_rtIconStateDebug);
889 settings.setValue("rtRestore1Debug", mainWin->m_rtRestore1Debug);
890 settings.setValue("rtRestore2Debug", mainWin->m_rtRestore2Debug);
891 settings.setValue("rtRestore3Debug", mainWin->m_rtRestore3Debug);
895 void prefsDialog::reject()
898 mainWin->set_status(tr("Canceled"));
901 /* read preferences for the prefences dialog box */
902 void MainWin::readPreferences()
904 QSettings settings("www.bacula.org", "bat");
905 settings.beginGroup("Debug");
906 m_commDebug = settings.value("commDebug", false).toBool();
907 m_connDebug = settings.value("connDebug", false).toBool();
908 m_displayAll = settings.value("displayAll", false).toBool();
909 m_sqlDebug = settings.value("sqlDebug", false).toBool();
910 m_commandDebug = settings.value("commandDebug", false).toBool();
911 m_miscDebug = settings.value("miscDebug", false).toBool();
913 settings.beginGroup("JobList");
914 m_recordLimitCheck = settings.value("recordLimitCheck", true).toBool();
915 m_recordLimitVal = settings.value("recordLimitVal", 150).toInt();
916 m_daysLimitCheck = settings.value("daysLimitCheck", false).toBool();
917 m_daysLimitVal = settings.value("daysLimitVal", 28).toInt();
919 settings.beginGroup("Timers");
920 m_checkMessages = settings.value("checkMessages", false).toBool();
921 m_checkMessagesInterval = settings.value("checkMessagesInterval", 28).toInt();
923 settings.beginGroup("Misc");
924 m_longList = settings.value("longList", false).toBool();
925 ItemFormatterBase::setBytesConversion(
926 (ItemFormatterBase::BYTES_CONVERSION) settings.value("byteConvert",
927 ItemFormatterBase::BYTES_CONVERSION_IEC).toInt());
928 m_openPlot = settings.value("openplot", false).toBool();
929 m_openBrowser = settings.value("openbrowser", false).toBool();
930 m_openDirStat = settings.value("opendirstat", false).toBool();
932 settings.beginGroup("RestoreTree");
933 m_rtPopDirDebug = settings.value("rtPopDirDebug", false).toBool();
934 m_rtDirCurICDebug = settings.value("rtDirCurICDebug", false).toBool();
935 m_rtDirICDebug = settings.value("rtDirCurICRetDebug", false).toBool();
936 m_rtFileTabICDebug = settings.value("rtFileTabICDebug", false).toBool();
937 m_rtVerTabICDebug = settings.value("rtVerTabICDebug", false).toBool();
938 m_rtUpdateFTDebug = settings.value("rtUpdateFTDebug", false).toBool();
939 m_rtUpdateVTDebug = settings.value("rtUpdateVTDebug", false).toBool();
940 m_rtChecksDebug = settings.value("rtChecksDebug", false).toBool();
941 m_rtIconStateDebug = settings.value("rtIconStateDebug", false).toBool();
942 m_rtRestore1Debug = settings.value("rtRestore1Debug", false).toBool();
943 m_rtRestore2Debug = settings.value("rtRestore2Debug", false).toBool();
944 m_rtRestore3Debug = settings.value("rtRestore3Debug", false).toBool();
948 void MainWin::setMessageIcon()
950 if (m_currentConsole->is_messagesPending())
951 actionMessages->setIcon(QIcon(QString::fromUtf8(":/images/mail-message-pending.png")));
953 actionMessages->setIcon(QIcon(QString::fromUtf8(":/images/mail-message-new.png")));
956 void MainWin::goToPreviousPage()
958 m_treeStackTrap = true;
961 /* If stack list is emtpty, then done */
962 if (m_treeWidgetStack.isEmpty()) {
965 QTreeWidgetItem* testItem = m_treeWidgetStack.takeLast();
966 QTreeWidgetItemIterator it(treeWidget);
967 /* lets avoid a segfault by setting an item current that no longer exists */
969 if (*it == testItem) {
970 if (testItem != treeWidget->currentItem()) {
971 treeWidget->setCurrentItem(testItem);
980 m_treeStackTrap = false;