1
#include "opt_toolbars.h"
5
#include "iconwidget.h"
6
#include "psitoolbar.h"
7
#include "iconaction.h"
8
#include "psiactionlist.h"
10
#include "ui_opt_lookfeel_toolbars.h"
11
#include "ui_ui_positiontoolbar.h"
14
#include <qpushbutton.h>
15
#include <qcombobox.h>
17
#include <qlineedit.h>
18
#include <qcheckbox.h>
20
#include <QHeaderView>
23
#include <QHBoxLayout>
25
#include <QVBoxLayout>
27
class LookFeelToolbarsUI : public QWidget, public Ui::LookFeelToolbars
30
LookFeelToolbarsUI() : QWidget() { setupUi(this); }
33
//----------------------------------------------------------------------------
34
// PositionOptionsTabToolbars
35
//----------------------------------------------------------------------------
37
class PositionOptionsTabToolbars : public QDialog, public Ui::PositionToolbarUI
41
PositionOptionsTabToolbars(QWidget *parent, Options::ToolbarPrefs *, int);
42
~PositionOptionsTabToolbars();
47
bool eventFilter(QObject *watched, QEvent *e);
58
Options::ToolbarPrefs *tb;
61
PositionOptionsTabToolbars::PositionOptionsTabToolbars(QWidget *parent, Options::ToolbarPrefs *_tb, int _id)
70
connect(pb_ok, SIGNAL(clicked()), SLOT(apply()));
71
connect(pb_ok, SIGNAL(clicked()), SLOT(accept()));
72
connect(pb_apply, SIGNAL(clicked()), SLOT(apply()));
73
connect(pb_cancel, SIGNAL(clicked()), SLOT(reject()));
75
connect(cb_dock, SIGNAL(highlighted(int)), SLOT(dataChanged()));
76
sb_index->installEventFilter( this );
77
sb_extraOffset->installEventFilter( this );
78
connect(ck_nl, SIGNAL(toggled(bool)), SLOT(dataChanged()));
80
le_name->setText( tb->name );
81
if ( tb->dock >= Qt::DockUnmanaged && tb->dock <= Qt::DockTornOff ) {
82
cb_dock->setCurrentItem( tb->dock + Qt::DockMinimized - Qt::DockTornOff );
85
cb_dock->setCurrentItem( tb->dock - Qt::DockTop );
87
sb_index->setValue( tb->index );
88
sb_extraOffset->setValue( tb->extraOffset );
89
ck_nl->setChecked( tb->nl );
92
pb_apply->setEnabled(false);
97
PositionOptionsTabToolbars::~PositionOptionsTabToolbars()
101
int PositionOptionsTabToolbars::n()
106
void PositionOptionsTabToolbars::dataChanged()
109
pb_apply->setEnabled(true);
112
void PositionOptionsTabToolbars::apply()
115
if ( cb_dock->currentItem() >= 0 && cb_dock->currentItem() < 5 ) {
116
// Top, Bottom, Left, Right and Minimised
117
tb->dock = (Qt::ToolBarDock)(cb_dock->currentItem() + Qt::DockTop);
120
// Unmanaged and TornOff
121
tb->dock = (Qt::ToolBarDock)(cb_dock->currentItem() - (Qt::DockMinimized - Qt::DockTornOff));
124
tb->index = sb_index->value();
125
tb->extraOffset = sb_extraOffset->value();
126
tb->nl = ck_nl->isChecked();
131
pb_apply->setEnabled(false);
134
bool PositionOptionsTabToolbars::eventFilter(QObject *watched, QEvent *e)
136
if ( watched->inherits("QSpinBox") && e->type() == QEvent::KeyRelease )
141
//----------------------------------------------------------------------------
142
// OptionsTabToolbars
143
//----------------------------------------------------------------------------
145
class OptionsTabToolbars::Private
155
ToolbarItem( QString _w, int _i ) {
161
QMap<int, ToolbarItem> toolbars;
163
PsiActionList::ActionsType class2id( QString name ) {
164
int ret = (int)PsiActionList::Actions_Common;
166
if ( name == "mainWin" )
167
ret |= (int)PsiActionList::Actions_MainWin;
169
return (PsiActionList::ActionsType)ret;
173
OptionsTabToolbars::OptionsTabToolbars(QObject *parent)
174
: OptionsTab(parent, "toolbars", "", tr("Toolbars"), tr("Configure Psi toolbars"), "psi/toolbars")
183
QWidget *OptionsTabToolbars::widget()
188
w = new LookFeelToolbarsUI();
189
LookFeelToolbarsUI *d = (LookFeelToolbarsUI*) w;
191
connect(d->pb_addToolbar, SIGNAL(clicked()), SLOT(toolbarAdd()));
192
connect(d->pb_deleteToolbar, SIGNAL(clicked()), SLOT(toolbarDelete()));
193
connect(d->cb_toolbars, SIGNAL(activated(int)), SLOT(toolbarSelectionChanged(int)));
194
connect(d->le_toolbarName, SIGNAL(textChanged(const QString &)), SLOT(toolbarNameChanged()));
195
connect(d->pb_toolbarPosition, SIGNAL(clicked()), SLOT(toolbarPosition()));
196
connect(d->tb_up, SIGNAL(clicked()), SLOT(toolbarActionUp()));
197
connect(d->tb_down, SIGNAL(clicked()), SLOT(toolbarActionDown()));
198
connect(d->tb_right, SIGNAL(clicked()), SLOT(toolbarAddAction()));
199
connect(d->tb_left, SIGNAL(clicked()), SLOT(toolbarRemoveAction()));
201
connect(d->ck_toolbarOn, SIGNAL(toggled(bool)), SLOT(toolbarDataChanged()));
202
connect(d->ck_toolbarLocked, SIGNAL(toggled(bool)), SLOT(toolbarDataChanged()));
203
connect(d->ck_toolbarStretch, SIGNAL(toggled(bool)), SLOT(toolbarDataChanged()));
204
connect(d->lw_selectedActions, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)), SLOT(selAct_selectionChanged(QListWidgetItem *)));
205
connect(d->tw_availActions, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), SLOT(avaAct_selectionChanged(QTreeWidgetItem *)));
207
connect(d->pb_deleteToolbar, SIGNAL(clicked()), SIGNAL(dataChanged()));
208
connect(d->tb_up, SIGNAL(clicked()), SIGNAL(dataChanged()));
209
connect(d->tb_down, SIGNAL(clicked()), SIGNAL(dataChanged()));
210
connect(d->tb_left, SIGNAL(clicked()), SIGNAL(dataChanged()));
211
connect(d->tb_right, SIGNAL(clicked()), SIGNAL(dataChanged()));
212
connect(d->pb_addToolbar, SIGNAL(clicked()), SIGNAL(dataChanged()));
213
connect(d->pb_deleteToolbar, SIGNAL(clicked()), SIGNAL(dataChanged()));
215
d->tw_availActions->header()->hide();
218
// TODO: add QWhatsThis to all widgets
220
QFrame *line = new QFrame( this );
221
line->setFrameShape( QFrame::HLine );
222
line->setFrameShadow( QFrame::Sunken );
223
line->setFrameShape( QFrame::HLine );
224
vbox->addWidget( line );
226
QHBoxLayout *hbox = new QHBoxLayout( 0, 0, 6 );
227
vbox->addLayout(hbox);
229
QSpacerItem *spacer = new QSpacerItem( 40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
230
hbox->addItem( spacer );
232
IconButton *pb_ok = new IconButton( this );
233
hbox->addWidget( pb_ok );
234
pb_ok->setText( tr("&OK") );
235
connect(pb_ok, SIGNAL(clicked()), SLOT(doApply()));
236
connect(pb_ok, SIGNAL(clicked()), SLOT(accept()));
239
pb_apply = new IconButton( this );
240
hbox->addWidget( pb_apply );
241
pb_apply->setText( tr("&Apply") );
242
connect(pb_apply, SIGNAL(clicked()), SLOT(doApply()));
243
pb_apply->setEnabled(false);
245
IconButton *pb_cancel = new IconButton( this );
246
hbox->addWidget( pb_cancel );
247
pb_cancel->setText( tr("&Cancel") );
248
connect(pb_cancel, SIGNAL(clicked()), SLOT(reject()));
250
restoreOptions( &option );
251
resize( minimumSize() );*/
254
OptionsTabToolbars::~OptionsTabToolbars()
261
* setData is called by the OptionsDlg private, after calling
262
* the constructor, to assign the PsiCon object and the parent window
264
* /par psi_: PsiCon* object to apply the changes when needed
265
* /par parent_: QWidget which is parent from the current object
267
void OptionsTabToolbars::setData(PsiCon * psi_, QWidget *parent_)
269
// the Psi con object is needed to apply the changes
270
// the parent object is needed to show some popups
275
/*void OptionsTabToolbars::setCurrentToolbar(PsiToolBar *t)
277
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
279
if ( pb_apply->isEnabled() )
282
QMap<int, Private::ToolbarItem>::Iterator it = p->toolbars.begin();
283
for ( ; it != p->toolbars.end(); ++it ) {
284
if ( it.data().group == t->group() && it.data().index == t->groupIndex() ) {
285
d->cb_toolbars->setCurrentIndex( it.key() );
286
toolbarSelectionChanged( it.key() );
292
void OptionsTabToolbars::applyOptions(Options *o)
295
opt->toolbars = o->toolbars;
297
// get current toolbars' positions
298
QList<PsiToolBar*> toolbars = psi->toolbarList();
299
for (int i = 0; i < opt->toolbars["mainWin"].count() && i < toolbars.count(); i++) {
300
//if ( toolbarPositionInProgress && posTbDlg->n() == (int)i )
303
Options::ToolbarPrefs &tbPref = opt->toolbars["mainWin"][i];
304
psi->getToolbarLocation(toolbars.at(i), tbPref.dock, tbPref.index, tbPref.nl, tbPref.extraOffset);
308
o->toolbars = opt->toolbars;
313
void OptionsTabToolbars::rebuildToolbarList()
315
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
317
d->cb_toolbars->clear();
320
QMap< QString, QList<Options::ToolbarPrefs> >::Iterator it = opt->toolbars.begin();
321
for ( ; it != opt->toolbars.end(); ++it ) {
322
if ( p->toolbars.count() )
323
d->cb_toolbars->insertItem( "---" ); // TODO: think of better separator
326
QList<Options::ToolbarPrefs>::Iterator it2 = it.data().begin();
327
for ( ; it2 != it.data().end(); ++it2, ++i ) {
328
d->cb_toolbars->insertItem( (*it2).name );
329
p->toolbars[d->cb_toolbars->count()-1] = Private::ToolbarItem( it.key(), i );
334
void OptionsTabToolbars::restoreOptions(const Options *o)
339
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
340
opt->toolbars = o->toolbars;
341
opt->hideMenubar = o->hideMenubar;
343
rebuildToolbarList();
345
if(d->cb_toolbars->count() > 0) {
346
d->cb_toolbars->setCurrentIndex( 0 );
347
toolbarSelectionChanged( 0 );
350
toolbarSelectionChanged( -1 );
353
//----------------------------------------------------------------------------
355
void OptionsTabToolbars::toolbarAdd()
357
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
359
int i = d->cb_toolbars->count();
361
Options::ToolbarPrefs tb;
362
tb.name = QObject::tr("<unnamed>");
365
tb.stretchable = false;
368
tb.dock = Qt::DockTop;
375
opt->toolbars["mainWin"].append(tb);
377
rebuildToolbarList();
378
d->cb_toolbars->setCurrentIndex( d->cb_toolbars->count()-1 );
379
toolbarSelectionChanged( d->cb_toolbars->currentIndex() );
381
d->le_toolbarName->setFocus();
384
void OptionsTabToolbars::toolbarDelete()
386
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
387
int n = d->cb_toolbars->currentIndex();
390
int idx = p->toolbars[n].index;
391
QList<Options::ToolbarPrefs>::Iterator it = opt->toolbars[p->toolbars[n].group].begin();
392
for (int i = 0; i < idx; i++)
396
opt->toolbars[p->toolbars[n].group].remove(it);
398
toolbarSelectionChanged(-1);
399
rebuildToolbarList();
401
toolbarSelectionChanged( d->cb_toolbars->currentIndex() );
405
void OptionsTabToolbars::addToolbarAction(QListWidget *parent, QString name, int toolbarId)
407
ActionList actions = psi->actionList()->suitableActions( (PsiActionList::ActionsType)toolbarId );
408
const QAction *action = (QAction *)actions.action( name );
411
addToolbarAction(parent, action, name);
414
void OptionsTabToolbars::addToolbarAction(QListWidget *parent, const QAction *action, QString name)
416
QListWidgetItem *item = new QListWidgetItem(parent);
418
QString n = actionName(action);
419
if ( !action->whatsThis().isEmpty() )
420
n += " - " + action->whatsThis();
422
item->setData(Qt::UserRole, name);
423
item->setIcon(action->iconSet());
426
void OptionsTabToolbars::toolbarSelectionChanged(int item)
432
PsiToolBar *toolBar = 0;
434
toolBar = psi->findToolBar( p->toolbars[n].group, p->toolbars[n].index );
436
bool customizeable = toolBar ? toolBar->isCustomizeable() : true;
437
bool moveable = toolBar ? toolBar->isMoveable() : true;
439
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
440
bool enable = (item == -1) ? false: true;
441
d->le_toolbarName->setEnabled( enable );
442
d->pb_toolbarPosition->setEnabled( enable && moveable );
443
d->ck_toolbarOn->setEnabled( enable );
444
d->ck_toolbarLocked->setEnabled( enable && moveable );
445
d->ck_toolbarStretch->setEnabled( enable && moveable );
446
d->lw_selectedActions->setEnabled( enable && customizeable );
447
d->tw_availActions->setEnabled( enable && customizeable );
448
d->tb_up->setEnabled( enable && customizeable );
449
d->tb_down->setEnabled( enable && customizeable );
450
d->tb_left->setEnabled( enable && customizeable );
451
d->tb_right->setEnabled( enable && customizeable );
452
d->pb_deleteToolbar->setEnabled( enable && p->toolbars[n].group == "mainWin" );
453
d->cb_toolbars->setEnabled( enable );
455
d->tw_availActions->clear();
456
d->lw_selectedActions->clear();
459
d->le_toolbarName->setText( "" );
465
Options::ToolbarPrefs tb = opt->toolbars[p->toolbars[n].group][p->toolbars[n].index];
466
d->le_toolbarName->setText( tb.name );
467
d->ck_toolbarOn->setChecked( tb.on );
468
d->ck_toolbarLocked->setChecked( tb.locked || !moveable );
469
d->ck_toolbarStretch->setChecked( tb.stretchable );
472
// Fill the TreeWidget with toolbar-specific actions
473
QTreeWidget *tw = d->tw_availActions;
474
QTreeWidgetItem *lastRoot = 0;
476
foreach(ActionList* actionList, psi->actionList()->actionLists( p->class2id( p->toolbars[n].group ) )) {
477
QTreeWidgetItem *root = new QTreeWidgetItem(tw, lastRoot);
479
root->setText( 0, actionList->name() );
480
root->setData( 0, Qt::UserRole, QString("") );
481
root->setExpanded( true );
483
QTreeWidgetItem *last = 0;
484
QStringList actionNames = actionList->actions();
485
QStringList::Iterator it2 = actionNames.begin();
486
for ( ; it2 != actionNames.end(); ++it2 ) {
487
IconAction *action = actionList->action( *it2 );
488
QTreeWidgetItem *item = new QTreeWidgetItem( root, last );
491
QString n = actionName((QAction *)action);
492
if ( !action->whatsThis().isEmpty() )
493
n += " - " + action->whatsThis();
494
item->setText( 0, n );
495
item->setIcon( 0, action->iconSet() );
496
item->setData( 0, Qt::UserRole, action->name() );
499
tw->resizeColumnToContents(0);
502
QStringList::Iterator it = tb.keys.begin();
503
for ( ; it != tb.keys.end(); ++it) {
504
addToolbarAction(d->lw_selectedActions, *it, p->class2id( p->toolbars[n].group ) );
511
void OptionsTabToolbars::rebuildToolbarKeys()
513
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
514
if ( !d->cb_toolbars->count() )
516
int n = d->cb_toolbars->currentIndex();
520
int count = d->lw_selectedActions->count();
521
for (int i = 0; i < count; i++) {
522
keys << d->lw_selectedActions->item(i)->data(Qt::UserRole).toString();
525
opt->toolbars["mainWin"][n].keys = keys;
526
opt->toolbars["mainWin"][n].dirty = true;
530
void OptionsTabToolbars::updateArrows()
532
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
533
bool up = false, down = false, left = false, right = false;
535
if(d->tw_availActions->currentItem() && !d->tw_availActions->currentItem()->data(0, Qt::UserRole).toString().isEmpty())
537
QListWidgetItem *i = d->lw_selectedActions->currentItem();
541
// get numeric index of item
542
int n = d->lw_selectedActions->row(i);
546
if(n < d->lw_selectedActions->count() - 1)
550
d->tb_up->setEnabled(up);
551
d->tb_down->setEnabled(down);
552
d->tb_left->setEnabled(left);
553
d->tb_right->setEnabled(right);
556
void OptionsTabToolbars::toolbarNameChanged()
558
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
559
if ( !d->cb_toolbars->count() )
562
int n = d->cb_toolbars->currentIndex();
563
d->cb_toolbars->changeItem(d->le_toolbarName->text(), n);
564
opt->toolbars["mainWin"][n].name = d->le_toolbarName->text();
569
void OptionsTabToolbars::toolbarActionUp()
571
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
572
QListWidgetItem *item = d->lw_selectedActions->currentItem();
576
int row = d->lw_selectedActions->row(item);
578
d->lw_selectedActions->takeItem(row);
579
d->lw_selectedActions->insertItem(row - 1, item);
580
d->lw_selectedActions->setCurrentItem(item);
583
rebuildToolbarKeys();
587
void OptionsTabToolbars::toolbarActionDown()
589
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
590
QListWidgetItem *item = d->lw_selectedActions->currentItem();
594
int row = d->lw_selectedActions->row(item);
595
if ( row < d->lw_selectedActions->count() ) {
596
d->lw_selectedActions->takeItem(row);
597
d->lw_selectedActions->insertItem(row + 1, item);
598
d->lw_selectedActions->setCurrentItem(item);
601
rebuildToolbarKeys();
605
void OptionsTabToolbars::toolbarAddAction()
607
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
608
QTreeWidgetItem *item = d->tw_availActions->currentItem();
609
if ( !item || item->data(0, Qt::UserRole).toString().isEmpty() )
612
addToolbarAction(d->lw_selectedActions, item->data(0, Qt::UserRole).toString(), p->class2id( p->toolbars[d->cb_toolbars->currentIndex()].group ) );
613
rebuildToolbarKeys();
617
void OptionsTabToolbars::toolbarRemoveAction()
619
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
620
QListWidgetItem *item = d->lw_selectedActions->currentItem();
626
rebuildToolbarKeys();
630
void OptionsTabToolbars::toolbarDataChanged()
635
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
636
if ( !d->cb_toolbars->count() )
638
int n = d->cb_toolbars->currentIndex();
640
opt->toolbars["mainWin"][n].dirty = true;
641
opt->toolbars["mainWin"][n].name = d->le_toolbarName->text();
642
opt->toolbars["mainWin"][n].on = d->ck_toolbarOn->isChecked();
643
opt->toolbars["mainWin"][n].locked = d->ck_toolbarLocked->isChecked();
644
opt->toolbars["mainWin"][n].stretchable = d->ck_toolbarStretch->isChecked();
649
QString OptionsTabToolbars::actionName(const QAction *a)
651
QString n = a->menuText(), n2;
652
for (int i = 0; i < (int)n.length(); i++) {
653
if ( n[i] == '&' && n[i+1] != '&' )
655
else if ( n[i] == '&' && n[i+1] == '&' )
664
void OptionsTabToolbars::toolbarPosition()
666
LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
667
if ( !d->cb_toolbars->count() )
669
int n = d->cb_toolbars->currentIndex();
671
PositionOptionsTabToolbars *posTbDlg = new PositionOptionsTabToolbars(w, &opt->toolbars["mainWin"][n], n);
672
connect(posTbDlg, SIGNAL(applyPressed()), SLOT(toolbarPositionApply()));
678
void OptionsTabToolbars::toolbarPositionApply()
682
option.toolbars = opt->toolbars;
683
psi->buildToolbars();
686
void OptionsTabToolbars::doApply()
688
option.toolbars = opt->toolbars;
689
psi->buildToolbars();
692
void OptionsTabToolbars::selAct_selectionChanged(QListWidgetItem *)
697
void OptionsTabToolbars::avaAct_selectionChanged(QTreeWidgetItem *)
702
#include "opt_toolbars.moc"