2 Bacula® - The Network Backup Solution
4 Copyright (C) 2007-2007 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 plus additions
11 that are listed in the file LICENSE.
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 John Walker.
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 MainWin::MainWin(QWidget *parent) : QMainWindow(parent)
44 setupUi(this); /* Setup UI defined by main.ui (designer) */
46 treeWidget->setColumnCount(1);
47 treeWidget->setHeaderLabel("Select Page");
48 // treeWidget->addAction(actionUndock);
49 treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
65 void MainWin::createPages()
68 QTreeWidgetItem *item, *topItem;
70 /* Create console tree stacked widget item */
71 m_console = new Console(stackedWidget);
73 /* Console is special -> needs director*/
74 /* Just take the first Director */
76 dir = (DIRRES *)GetNextRes(R_DIRECTOR, NULL);
77 m_console->setDirRes(dir);
80 /* The top tree item representing the director */
81 topItem = createTopPage(dir->name());
82 topItem->setData(0, Qt::UserRole, QVariant(m_pages));
84 topItem->setIcon(0, QIcon(QString::fromUtf8("images/server.png")));
86 /* Create Tree Widget Item */
87 item = createPage("Console", topItem);
88 m_console->SetPassedValues(stackedWidget, item, m_pages );
90 /* Append to pagelist */
91 m_pagehash.insert(m_pages, m_console);
93 /* Set Color of treeWidgetItem for the console
94 * It will be set to gree in the console class if the connection is made.
96 QBrush redBrush(Qt::red);
97 item->setForeground(0, redBrush);
100 * Now with the console created, on with the rest, these are easy
102 * 1. create tree widget item
103 * 2. create object passing pointer to tree widget item (modified constructors to pass QTreeWidget pointers)
104 * 3. append to stackhash
109 item=createPage("brestore", topItem);
110 bRestore* brestore=new bRestore(stackedWidget, item, m_pages);
111 m_pagehash.insert(m_pages, brestore);
114 /* lastly for now, the medialist */
116 item=createPage("Media", topItem );
117 MediaList* medialist=new MediaList(stackedWidget, m_console, item, m_pages);
118 m_pagehash.insert(m_pages, medialist);
120 /* Iterate through and add to the stack */
121 foreach(Pages *page, m_pagehash)
124 treeWidget->expandItem(topItem);
125 stackedWidget->setCurrentIndex(0);
128 /* Create a root Tree Widget */
129 QTreeWidgetItem *MainWin::createTopPage(char *name)
131 QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget);
132 item->setText(0, name);
136 /* Create A Tree Widget Item which will be associated with a Page in the stacked widget */
137 QTreeWidgetItem *MainWin::createPage(char *name, QTreeWidgetItem *parent)
139 QTreeWidgetItem *item = new QTreeWidgetItem(parent);
140 item->setText(0, name);
145 * Handle up and down arrow keys for the command line
148 void MainWin::keyPressEvent(QKeyEvent *event)
150 if (m_cmd_history.size() == 0) {
154 switch (event->key()) {
156 if (m_cmd_last < 0 || m_cmd_last >= (m_cmd_history.size()-1)) {
163 if (m_cmd_last == 0) {
167 if (m_cmd_last < 0 || m_cmd_last > (m_cmd_history.size()-1)) {
168 m_cmd_last = m_cmd_history.size() - 1;
177 lineEdit->setText(m_cmd_history[m_cmd_last]);
180 void MainWin::createConnections()
182 /* Connect signals to slots */
183 connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(input_line()));
184 connect(actionAbout_bat, SIGNAL(triggered()), this, SLOT(about()));
187 connect(treeWidget, SIGNAL(itemActivated(QTreeWidgetItem *, int)), this,
188 SLOT(treeItemClicked(QTreeWidgetItem *, int)));
189 connect(treeWidget, SIGNAL(itemPressed(QTreeWidgetItem *, int)), this,
190 SLOT(treeItemClicked(QTreeWidgetItem *, int)));
192 connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this,
193 SLOT(treeItemClicked(QTreeWidgetItem *, int)));
194 connect(treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this,
195 SLOT(treeItemDoubleClicked(QTreeWidgetItem *, int)));
196 connect(treeWidget, SIGNAL(
197 currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
198 this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
199 connect(stackedWidget, SIGNAL(currentChanged(int)),
200 this, SLOT(stackItemChanged(int)));
202 connect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows()));
203 connect(actionConnect, SIGNAL(triggered()), m_console, SLOT(connect()));
204 connect(actionStatusDir, SIGNAL(triggered()), m_console, SLOT(status_dir()));
205 connect(actionSelectFont, SIGNAL(triggered()), m_console, SLOT(set_font()));
206 connect(actionLabel, SIGNAL(triggered()), this, SLOT(labelDialogClicked()));
207 connect(actionRun, SIGNAL(triggered()), this, SLOT(runDialogClicked()));
208 connect(actionRestore, SIGNAL(triggered()), this, SLOT(restoreDialogClicked()));
209 connect(actionUndock, SIGNAL(triggered()), this, SLOT(undockWindowButton()));
210 connect(actionToggleDock, SIGNAL(triggered()), this, SLOT(toggleDockContextWindow()));
214 * Reimplementation of QWidget closeEvent virtual function
216 void MainWin::closeEvent(QCloseEvent *event)
219 m_console->writeSettings();
220 m_console->terminate();
222 foreach(Pages *page, m_pagehash){
223 if( !page->isDocked() )
228 void MainWin::writeSettings()
230 QSettings settings("bacula.org", "bat");
232 settings.beginGroup("MainWin");
233 settings.setValue("winSize", size());
234 settings.setValue("winPos", pos());
238 void MainWin::readSettings()
240 QSettings settings("bacula.org", "bat");
242 settings.beginGroup("MainWin");
243 resize(settings.value("winSize", QSize(1041, 801)).toSize());
244 move(settings.value("winPos", QPoint(200, 150)).toPoint());
249 * This subroutine is called with an item in the Page Selection window
252 void MainWin::treeItemClicked(QTreeWidgetItem *item, int column)
254 /* Use tree item's Qt::UserRole to get treeindex */
255 int treeindex = item->data(column, Qt::UserRole).toInt();
257 /* Is this one of the first level pages */
258 if( m_pagehash.value(treeindex) ){
259 Pages* page = m_pagehash.value(treeindex);
260 int stackindex=stackedWidget->indexOf(page);
262 if( stackindex >= 0 ){
263 stackedWidget->setCurrentIndex(0);
264 stackedWidget->setCurrentWidget(page);
266 /* run the virtual function in case this class overrides it */
268 page->PgSeltreeWidgetClicked();
274 * This subroutine is called with an item in the Page Selection window
277 void MainWin::treeItemDoubleClicked(QTreeWidgetItem * /*item*/, int /*column*/)
282 * Called with a change of the highlighed tree widget item in the page selector.
285 void MainWin::treeItemChanged(QTreeWidgetItem *currentitem, QTreeWidgetItem *previousitem)
288 /* The Previous item */
290 /* Use tree item's Qt::UserRole to get treeindex now for the previousitem */
292 treeindex = previousitem->data(0, Qt::UserRole).toInt();
293 /* Is this one of the first level pages */
294 if( m_pagehash.value(treeindex) ){
295 Pages* page = m_pagehash.value(treeindex);
296 treeWidget->removeAction(actionToggleDock);
297 foreach( QAction* pageaction, page->m_contextActions ){
298 treeWidget->removeAction(pageaction);
303 /* Use tree item's Qt::UserRole to get treeindex */
304 treeindex = currentitem->data(0, Qt::UserRole).toInt();
306 /* Is this one of the first level pages */
307 if( m_pagehash.value(treeindex) ){
308 Pages* page = m_pagehash.value(treeindex);
309 int stackindex = stackedWidget->indexOf(page);
311 /* Is this page currently on the stack */
312 if( stackindex >= 0 ){
313 /* put this page on the top of the stack */
314 stackedWidget->setCurrentIndex(stackindex);
316 setContextMenuDockText(page, currentitem);
318 treeWidget->addAction(actionToggleDock);
320 /* Add the actions to the Page Selectors tree widget that are part of the
321 * current items list of desired actions regardless of whether on top of stack*/
322 treeWidget->addActions(page->m_contextActions);
326 void MainWin::labelDialogClicked()
328 new labelDialog(m_console);
331 void MainWin::runDialogClicked()
333 new runDialog(m_console);
336 void MainWin::restoreDialogClicked()
338 new prerestoreDialog(m_console);
344 * The user just finished typing a line in the command line edit box
346 void MainWin::input_line()
348 QString cmdStr = lineEdit->text(); /* Get the text */
349 lineEdit->clear(); /* clear the lineEdit box */
350 if (m_console->is_connected()) {
351 m_console->display_text(cmdStr + "\n");
352 m_console->write_dir(cmdStr.toUtf8().data()); /* send to dir */
354 set_status("Director not connected. Click on connect button.");
356 m_cmd_history.append(cmdStr);
361 void MainWin::about()
363 QMessageBox::about(this, tr("About bat"),
364 tr("<br><h2>bat 0.2, by Kern Sibbald</h2>"
365 "<p>Copyright © " BYEAR " Free Software Foundation Europe e.V."
366 "<p>The <b>bat</b> is an administrative console"
367 " interface to the Director."));
370 void MainWin::set_statusf(const char *fmt, ...)
375 va_start(arg_ptr, fmt);
376 len = bvsnprintf(buf, sizeof(buf), fmt, arg_ptr);
381 void MainWin::set_status_ready()
383 set_status(" Ready");
386 void MainWin::set_status(const char *buf)
388 statusBar()->showMessage(buf);
392 * Function to respond to the button bar button to undock
394 void MainWin::undockWindowButton()
396 Pages* page = (Pages*)stackedWidget->currentWidget();
397 page->togglePageDocking();
398 /* The window has been undocked, lets change the context menu */
399 setContextMenuDockText();
403 * Function to respond to action on page selector context menu to toggle the
404 * dock status of the window associated with the page selectors current
407 void MainWin::toggleDockContextWindow()
409 QTreeWidgetItem *currentitem = treeWidget->currentItem();
411 /* Use tree item's Qt::UserRole to get treeindex */
412 int treeindex = currentitem->data(0, Qt::UserRole).toInt();
414 /* Is this one of the first level pages */
415 if( m_pagehash.value(treeindex) ){
416 Pages* page = m_pagehash.value(treeindex);
417 page->togglePageDocking();
418 if ( page->isDocked() ){
419 stackedWidget->setCurrentWidget(page);
421 /* Toggle the menu item. The window's dock status has been toggled */
422 setContextMenuDockText(page, currentitem);
427 * Function to set the text of the toggle dock context menu when page and
428 * widget item are NOT known. This is an overoaded funciton.
429 * It is called from MainWin::undockWindowButton, it is not intended to change
430 * for the top pages tree widget, it is for the currently active tree widget
431 * item. Which is why the page is not passed.
433 void MainWin::setContextMenuDockText()
435 QTreeWidgetItem *currentitem = treeWidget->currentItem();
437 /* Use tree item's Qt::UserRole to get treeindex */
438 int treeindex = currentitem->data(0, Qt::UserRole).toInt();
440 /* Is this one of the first level pages */
441 if( m_pagehash.value(treeindex) ){
442 Pages* page = m_pagehash.value(treeindex);
443 setContextMenuDockText(page, currentitem);
448 * Function to set the text of the toggle dock context menu when page and
449 * widget item are known. This is the more commonly used.
451 void MainWin::setContextMenuDockText( Pages* page, QTreeWidgetItem* item )
453 QString docktext("");
454 if( page->isDocked() ){
455 docktext += "UnDock ";
457 docktext += "ReDock ";
459 docktext += item->text(0) += " Window";
461 actionToggleDock->setText(docktext);
464 void MainWin::stackItemChanged(int)
466 Pages* page = (Pages*)stackedWidget->currentWidget();
467 /* run the virtual function in case this class overrides it */
468 page->currentStackItem();