1
#include "toolbardlg.h"
5
#include "iconwidget.h"
7
#include "psitoolbar.h"
8
#include "iconaction.h"
9
#include "psiactionlist.h"
11
#include "opt_lookfeel_toolbars.h"
12
#include "ui_positiontoolbar.h"
15
#include <qpushbutton.h>
17
#include <qlistview.h>
18
#include <qcombobox.h>
20
#include <qlineedit.h>
21
#include <qcheckbox.h>
25
//----------------------------------------------------------------------------
27
//----------------------------------------------------------------------------
29
class PositionToolbarDlg : public PositionToolbarUI
33
PositionToolbarDlg(QWidget *parent, Options::ToolbarPrefs *, int);
34
~PositionToolbarDlg();
39
bool eventFilter(QObject *watched, QEvent *e);
50
Options::ToolbarPrefs *tb;
53
PositionToolbarDlg::PositionToolbarDlg(QWidget *parent, Options::ToolbarPrefs *_tb, int _id)
54
: PositionToolbarUI(parent, "PositionToolbarDlg", true)
59
connect(pb_ok, SIGNAL(clicked()), SLOT(apply()));
60
connect(pb_ok, SIGNAL(clicked()), SLOT(accept()));
61
connect(pb_apply, SIGNAL(clicked()), SLOT(apply()));
62
connect(pb_cancel, SIGNAL(clicked()), SLOT(reject()));
64
connect(cb_dock, SIGNAL(highlighted(int)), SLOT(dataChanged()));
65
sb_index->installEventFilter( this );
66
sb_extraOffset->installEventFilter( this );
67
connect(ck_nl, SIGNAL(toggled(bool)), SLOT(dataChanged()));
69
le_name->setText( tb->name );
70
if ( tb->dock >= DockUnmanaged && tb->dock <= DockTornOff ) {
71
cb_dock->setCurrentItem( tb->dock + DockMinimized - DockTornOff );
74
cb_dock->setCurrentItem( tb->dock - DockTop );
76
sb_index->setValue( tb->index );
77
sb_extraOffset->setValue( tb->extraOffset );
78
ck_nl->setChecked( tb->nl );
81
pb_apply->setEnabled(false);
86
PositionToolbarDlg::~PositionToolbarDlg()
90
int PositionToolbarDlg::n()
95
void PositionToolbarDlg::dataChanged()
98
pb_apply->setEnabled(true);
101
void PositionToolbarDlg::apply()
104
if ( cb_dock->currentItem() >= 0 && cb_dock->currentItem() < 5 ) {
105
// Top, Bottom, Left, Right and Minimised
106
tb->dock = (Dock)(cb_dock->currentItem() + DockTop);
109
// Unmanaged and TornOff
110
tb->dock = (Dock)(cb_dock->currentItem() - (DockMinimized - DockTornOff));
113
tb->index = sb_index->value();
114
tb->extraOffset = sb_extraOffset->value();
115
tb->nl = ck_nl->isChecked();
120
pb_apply->setEnabled(false);
123
bool PositionToolbarDlg::eventFilter(QObject *watched, QEvent *e)
125
if ( watched->inherits("QSpinBox") && e->type() == QEvent::KeyRelease )
130
//----------------------------------------------------------------------------
132
//----------------------------------------------------------------------------
134
class ToolbarDlg::Private
144
ToolbarItem( QString _w, int _i ) {
150
QMap<int, ToolbarItem> toolbars;
152
PsiActionList::ActionsType class2id( QString name ) {
153
int ret = (int)PsiActionList::Actions_Common;
155
if ( name == "mainWin" )
156
ret |= (int)PsiActionList::Actions_MainWin;
158
return (PsiActionList::ActionsType)ret;
162
ToolbarDlg::ToolbarDlg(PsiCon *_psi, QWidget *parent, const char *name)
163
: QDialog(parent, name, false, WDestructiveClose)
168
psi->dialogRegister(this);
172
setCaption(CAP(tr("Configure Toolbars")));
174
connect(this, SIGNAL(dataChanged()), SLOT(dataChangedSlot()));
176
QVBoxLayout *vbox = new QVBoxLayout(this, 11, 6);
177
w = new LookFeelToolbarsUI(this);
179
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
181
connect(d->pb_addToolbar, SIGNAL(clicked()), SLOT(toolbarAdd()));
182
connect(d->pb_deleteToolbar, SIGNAL(clicked()), SLOT(toolbarDelete()));
183
connect(d->cb_toolbars, SIGNAL(activated(int)), SLOT(toolbarSelectionChanged(int)));
184
connect(d->le_toolbarName, SIGNAL(textChanged(const QString &)), SLOT(toolbarNameChanged()));
185
connect(d->pb_toolbarPosition, SIGNAL(clicked()), SLOT(toolbarPosition()));
186
connect(d->tb_up, SIGNAL(clicked()), SLOT(toolbarActionUp()));
187
connect(d->tb_down, SIGNAL(clicked()), SLOT(toolbarActionDown()));
188
connect(d->tb_right, SIGNAL(clicked()), SLOT(toolbarAddAction()));
189
connect(d->tb_left, SIGNAL(clicked()), SLOT(toolbarRemoveAction()));
191
connect(d->ck_toolbarOn, SIGNAL(toggled(bool)), SLOT(toolbarDataChanged()));
192
connect(d->ck_toolbarLocked, SIGNAL(toggled(bool)), SLOT(toolbarDataChanged()));
193
connect(d->ck_toolbarStretch, SIGNAL(toggled(bool)), SLOT(toolbarDataChanged()));
194
connect(d->lv_selectedActions, SIGNAL(selectionChanged(QListViewItem *)), SLOT(selAct_selectionChanged(QListViewItem *)));
195
connect(d->lv_availActions, SIGNAL(selectionChanged(QListViewItem *)), SLOT(avaAct_selectionChanged(QListViewItem *)));
197
connect(d->pb_deleteToolbar, SIGNAL(clicked()), SIGNAL(dataChanged()));
198
connect(d->tb_up, SIGNAL(clicked()), SIGNAL(dataChanged()));
199
connect(d->tb_down, SIGNAL(clicked()), SIGNAL(dataChanged()));
200
connect(d->tb_left, SIGNAL(clicked()), SIGNAL(dataChanged()));
201
connect(d->tb_right, SIGNAL(clicked()), SIGNAL(dataChanged()));
202
connect(d->pb_addToolbar, SIGNAL(clicked()), SIGNAL(dataChanged()));
203
connect(d->pb_deleteToolbar, SIGNAL(clicked()), SIGNAL(dataChanged()));
205
d->lv_selectedActions->header()->hide();
206
d->lv_availActions->header()->hide();
208
d->lv_selectedActions->setSorting(-1);
209
d->lv_availActions->setSorting(-1);
211
// TODO: add QWhatsThis to all widgets
213
QFrame *line = new QFrame( this );
214
line->setFrameShape( QFrame::HLine );
215
line->setFrameShadow( QFrame::Sunken );
216
line->setFrameShape( QFrame::HLine );
217
vbox->addWidget( line );
219
QHBoxLayout *hbox = new QHBoxLayout( 0, 0, 6 );
220
vbox->addLayout(hbox);
222
QSpacerItem *spacer = new QSpacerItem( 40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
223
hbox->addItem( spacer );
225
IconButton *pb_ok = new IconButton( this );
226
hbox->addWidget( pb_ok );
227
pb_ok->setText( tr("&OK") );
228
pb_ok->setIcon( "psi/ok" );
229
connect(pb_ok, SIGNAL(clicked()), SLOT(doApply()));
230
connect(pb_ok, SIGNAL(clicked()), SLOT(accept()));
233
pb_apply = new IconButton( this );
234
hbox->addWidget( pb_apply );
235
pb_apply->setText( tr("&Apply") );
236
connect(pb_apply, SIGNAL(clicked()), SLOT(doApply()));
237
pb_apply->setEnabled(false);
239
IconButton *pb_cancel = new IconButton( this );
240
hbox->addWidget( pb_cancel );
241
pb_cancel->setText( tr("&Cancel") );
242
pb_cancel->setIcon( "psi/cancel" );
243
connect(pb_cancel, SIGNAL(clicked()), SLOT(reject()));
245
restoreOptions( &option );
246
resize( minimumSize() );
249
ToolbarDlg::~ToolbarDlg()
251
psi->dialogUnregister(this);
256
void ToolbarDlg::setCurrentToolbar(PsiToolBar *t)
258
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
260
if ( pb_apply->isEnabled() )
263
QMap<int, Private::ToolbarItem>::Iterator it = p->toolbars.begin();
264
for ( ; it != p->toolbars.end(); ++it ) {
265
if ( it.data().group == t->group() && it.data().index == t->groupIndex() ) {
266
d->cb_toolbars->setCurrentItem( it.key() );
267
toolbarSelectionChanged( it.key() );
273
void ToolbarDlg::applyOptions(Options *o)
276
opt->toolbars = o->toolbars;
278
// get current toolbars' positions
279
MainWin *mainWin = (MainWin *)psi->mainWin();
280
for (uint i = 0; i < opt->toolbars.count() && i < mainWin->toolbars.count(); i++) {
281
//if ( toolbarPositionInProgress && posTbDlg->n() == (int)i )
284
Options::ToolbarPrefs &tbPref = opt->toolbars["mainWin"][i];
285
mainWin->getLocation ( mainWin->toolbars.at(i), tbPref.dock, tbPref.index, tbPref.nl, tbPref.extraOffset );
289
o->toolbars = opt->toolbars;
292
void ToolbarDlg::rebuildToolbarList()
294
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
296
d->cb_toolbars->clear();
299
QMap< QString, QValueList<Options::ToolbarPrefs> >::Iterator it = opt->toolbars.begin();
300
for ( ; it != opt->toolbars.end(); ++it ) {
301
if ( p->toolbars.count() )
302
d->cb_toolbars->insertItem( "---" ); // TODO: think of better separator
305
QValueList<Options::ToolbarPrefs>::Iterator it2 = it.data().begin();
306
for ( ; it2 != it.data().end(); ++it2, ++i ) {
307
d->cb_toolbars->insertItem( (*it2).name );
308
p->toolbars[d->cb_toolbars->count()-1] = Private::ToolbarItem( it.key(), i );
313
void ToolbarDlg::restoreOptions(const Options *o)
318
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
319
opt->toolbars = o->toolbars;
321
rebuildToolbarList();
323
if(d->cb_toolbars->count() > 0) {
324
d->cb_toolbars->setCurrentItem( 0 );
325
toolbarSelectionChanged( 0 );
328
toolbarSelectionChanged( -1 );
331
//----------------------------------------------------------------------------
333
void ToolbarDlg::toolbarAdd()
335
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
337
int i = d->cb_toolbars->count();
339
Options::ToolbarPrefs tb;
340
tb.name = QObject::tr("<unnamed>");
343
tb.stretchable = false;
346
tb.dock = Qt::DockTop;
353
opt->toolbars["mainWin"].append(tb);
355
rebuildToolbarList();
357
d->cb_toolbars->insertItem( tb.name );
358
d->cb_toolbars->setCurrentItem( d->cb_toolbars->count() - 1 );
359
toolbarSelectionChanged( d->cb_toolbars->count() - 1 );
361
d->le_toolbarName->setFocus();
365
void ToolbarDlg::toolbarDelete()
367
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
368
int n = d->cb_toolbars->currentItem();
370
Options::ToolbarPrefs tb = opt->toolbars[p->toolbars[n].group][p->toolbars[n].index];
371
PsiToolBar *toolBar = psi->findToolBar( p->toolbars[n].group, p->toolbars[n].index );
375
// delete current toolbar
377
int idx = p->toolbars[n].index;
378
QValueList<Options::ToolbarPrefs>::Iterator it = opt->toolbars[p->toolbars[n].group].begin();
379
for (int i = 0; i < idx; i++)
383
opt->toolbars[p->toolbars[n].group].remove(it);
385
rebuildToolbarList();
387
toolbarSelectionChanged( n - 1 ); // TODO FIXME
391
void ToolbarDlg::addToolbarAction(QListView *parent, QString name, int toolbarId)
393
ActionList actions = psi->actionList()->suitableActions( (PsiActionList::ActionsType)toolbarId );
394
const QAction *action = (QAction *)actions.action( name );
398
addToolbarAction(parent, action, name);
401
void ToolbarDlg::addToolbarAction(QListView *parent, const QAction *action, QString name)
403
QListViewItem *item = new QListViewItem(parent, parent->lastItem());
405
QString n = actionName(action);
406
if ( !action->whatsThis().isEmpty() )
407
n += " - " + action->whatsThis();
409
item->setText(1, name);
410
item->setPixmap(0, action->iconSet().pixmap());
413
void ToolbarDlg::toolbarSelectionChanged(int item)
419
Options::ToolbarPrefs tb = opt->toolbars[p->toolbars[n].group][p->toolbars[n].index];
420
PsiToolBar *toolBar = psi->findToolBar( p->toolbars[n].group, p->toolbars[n].index );
422
bool customizeable = toolBar ? toolBar->isCustomizeable() : false;
423
bool moveable = toolBar ? toolBar->isMoveable() : false;
425
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
426
bool enable = (item == -1) ? false: true;
427
d->le_toolbarName->setEnabled( enable );
428
d->pb_toolbarPosition->setEnabled( enable && moveable );
429
d->ck_toolbarOn->setEnabled( enable );
430
d->ck_toolbarLocked->setEnabled( enable && moveable );
431
d->ck_toolbarStretch->setEnabled( enable && moveable );
432
d->lv_selectedActions->setEnabled( enable && customizeable );
433
d->lv_availActions->setEnabled( enable && customizeable );
434
d->tb_up->setEnabled( enable && customizeable );
435
d->tb_down->setEnabled( enable && customizeable );
436
d->tb_left->setEnabled( enable && customizeable );
437
d->tb_right->setEnabled( enable && customizeable );
438
d->pb_deleteToolbar->setEnabled( enable && p->toolbars[n].group == "mainWin" );
439
d->cb_toolbars->setEnabled( enable );
441
d->lv_availActions->clear();
442
d->lv_selectedActions->clear();
449
d->le_toolbarName->setText( tb.name );
450
d->ck_toolbarOn->setChecked( tb.on );
451
d->ck_toolbarLocked->setChecked( tb.locked || !moveable );
452
d->ck_toolbarStretch->setChecked( tb.stretchable );
455
// Fill the ListView with toolbar-specific actions
456
QPtrList<ActionList> actionLists = psi->actionList()->actionLists( p->class2id( p->toolbars[n].group ) );
457
QPtrListIterator<ActionList> it ( actionLists );
458
ActionList *actionList;
459
QListView *lv = d->lv_availActions;
460
QListViewItem *lastRoot = 0;
461
for ( ; (actionList = it.current()); ++it ) {
462
QListViewItem *root = new QListViewItem(lv, lastRoot);
464
root->setText( 0, actionList->name() );
465
root->setOpen( true );
467
QListViewItem *last = 0;
468
QStringList actionNames = actionList->actions();
469
QStringList::Iterator it2 = actionNames.begin();
470
for ( ; it2 != actionNames.end(); ++it2 ) {
471
IconAction *action = actionList->action( *it2 );
472
QListViewItem *item = new QListViewItem( root, last );
475
QString n = actionName((QAction *)action);
476
if ( !action->whatsThis().isEmpty() )
477
n += " - " + action->whatsThis();
479
item->setText(1, action->name());
480
item->setPixmap(0, action->iconSet().pixmap());
485
QStringList::Iterator it = tb.keys.begin();
486
for ( ; it != tb.keys.end(); ++it) {
487
addToolbarAction(d->lv_selectedActions, *it, p->class2id( p->toolbars[n].group ) );
494
void ToolbarDlg::rebuildToolbarKeys()
496
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
497
if ( !d->cb_toolbars->count() )
499
int n = d->cb_toolbars->currentItem();
502
QListViewItemIterator it( d->lv_selectedActions );
503
for ( ; it.current(); ++it) {
504
QListViewItem *item = it.current();
506
keys << item->text(1);
509
opt->toolbars["mainWin"][n].keys = keys;
510
opt->toolbars["mainWin"][n].dirty = true;
514
void ToolbarDlg::updateArrows()
516
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
517
bool up = false, down = false, left = false, right = false;
519
if(d->lv_availActions->selectedItem() && !d->lv_availActions->selectedItem()->text(1).isEmpty())
521
QListViewItem *i = d->lv_selectedActions->selectedItem();
525
// get numeric index of item
527
for(QListViewItem *it = d->lv_selectedActions->firstChild(); it != i; it = it->nextSibling()) {
533
if(n < d->lv_selectedActions->childCount()-1)
537
d->tb_up->setEnabled(up);
538
d->tb_down->setEnabled(down);
539
d->tb_left->setEnabled(left);
540
d->tb_right->setEnabled(right);
543
void ToolbarDlg::toolbarNameChanged()
545
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
546
if ( !d->cb_toolbars->count() )
549
int n = d->cb_toolbars->currentItem();
550
d->cb_toolbars->changeItem(d->le_toolbarName->text(), n);
551
opt->toolbars["mainWin"][n].name = d->le_toolbarName->text();
556
void ToolbarDlg::toolbarActionUp()
558
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
559
QListViewItem *item = d->lv_selectedActions->selectedItem();
563
if ( item->itemAbove() )
564
item->itemAbove()->moveItem(item);
565
rebuildToolbarKeys();
569
void ToolbarDlg::toolbarActionDown()
571
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
572
QListViewItem *item = d->lv_selectedActions->selectedItem();
576
if ( item->itemBelow() )
577
item->moveItem( item->itemBelow() );
578
rebuildToolbarKeys();
582
void ToolbarDlg::toolbarAddAction()
584
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
585
QListViewItem *item = d->lv_availActions->selectedItem();
586
if ( !item || item->text(1).isEmpty() )
589
addToolbarAction(d->lv_selectedActions, item->text(1), p->class2id( p->toolbars[d->cb_toolbars->currentItem()].group ) );
590
rebuildToolbarKeys();
594
void ToolbarDlg::toolbarRemoveAction()
596
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
597
QListViewItem *item = d->lv_selectedActions->selectedItem();
603
if(d->lv_selectedActions->currentItem())
604
d->lv_selectedActions->setSelected(d->lv_selectedActions->currentItem(), true);
606
rebuildToolbarKeys();
610
void ToolbarDlg::toolbarDataChanged()
615
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
616
if ( !d->cb_toolbars->count() )
618
int n = d->cb_toolbars->currentItem();
620
opt->toolbars["mainWin"][n].dirty = true;
621
opt->toolbars["mainWin"][n].name = d->le_toolbarName->text();
622
opt->toolbars["mainWin"][n].on = d->ck_toolbarOn->isChecked();
623
opt->toolbars["mainWin"][n].locked = d->ck_toolbarLocked->isChecked();
624
opt->toolbars["mainWin"][n].stretchable = d->ck_toolbarStretch->isChecked();
629
QString ToolbarDlg::actionName(const QAction *a)
631
QString n = a->menuText(), n2;
632
for (int i = 0; i < (int)n.length(); i++) {
633
if ( n[i] == '&' && n[i+1] != '&' )
635
else if ( n[i] == '&' && n[i+1] == '&' )
644
void ToolbarDlg::toolbarPosition()
646
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
647
if ( !d->cb_toolbars->count() )
649
int n = d->cb_toolbars->currentItem();
651
PositionToolbarDlg *posTbDlg = new PositionToolbarDlg(this, &opt->toolbars["mainWin"][n], n);
652
connect(posTbDlg, SIGNAL(applyPressed()), SLOT(toolbarPositionApply()));
658
void ToolbarDlg::toolbarPositionApply()
662
option.toolbars = opt->toolbars;
663
MainWin *mainWin = (MainWin *)psi->mainWin();
664
mainWin->buildToolbars();
667
void ToolbarDlg::doApply()
670
QValueList<Options::ToolbarPrefs>::Iterator it = opt->toolbars["mainWin"].begin();
671
for ( ; it != opt->toolbars["mainWin"].end(); ++it) {
676
// Undar MacOS, we have the toolbar in a menu anyway
679
QMessageBox::warning(this, tr("Warning"),
680
tr("You can not disable <i>all</i> toolbars. If you do so, you will be unable to enable them back, when you'll change your mind.\n"
682
"If you really-really want to disable all toolbars, you need to edit the config.xml file by hand."),
689
option.toolbars = opt->toolbars;
690
MainWin *mainWin = (MainWin *)psi->mainWin();
691
mainWin->buildToolbars();
694
pb_apply->setEnabled(false);
697
void ToolbarDlg::dataChangedSlot()
703
pb_apply->setEnabled(true);
706
void ToolbarDlg::selAct_selectionChanged(QListViewItem *)
711
void ToolbarDlg::avaAct_selectionChanged(QListViewItem *)
716
#include "toolbardlg.moc"