summaryrefslogtreecommitdiffstats
path: root/src/k3bprojecttabwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/k3bprojecttabwidget.cpp')
-rw-r--r--src/k3bprojecttabwidget.cpp216
1 files changed, 216 insertions, 0 deletions
diff --git a/src/k3bprojecttabwidget.cpp b/src/k3bprojecttabwidget.cpp
new file mode 100644
index 0000000..d86fad4
--- /dev/null
+++ b/src/k3bprojecttabwidget.cpp
@@ -0,0 +1,216 @@
+/*
+ *
+ * $Id: k3bprojecttabwidget.cpp 619556 2007-01-03 17:38:12Z trueg $
+ * Copyright (C) 2003 Sebastian Trueg <trueg@k3b.org>
+ *
+ * This file is part of the K3b project.
+ * Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * See the file "COPYING" for the exact licensing terms.
+ */
+
+
+
+#include "k3bprojecttabwidget.h"
+#include "k3bapplication.h"
+#include "k3bprojectmanager.h"
+
+#include <k3bview.h>
+#include <k3bdoc.h>
+
+#include <kaction.h>
+#include <kiconloader.h>
+#include <kdebug.h>
+#include <kurldrag.h>
+#include <klocale.h>
+
+#include <qevent.h>
+#include <qtabbar.h>
+
+
+class K3bProjectTabWidget::ProjectData
+{
+public:
+ ProjectData()
+ : doc(0),
+ modified(false) {
+ }
+
+ ProjectData( K3bDoc* doc_ )
+ : doc(doc_),
+ modified(false) {
+ }
+
+ // the project
+ K3bDoc* doc;
+
+ // is the project marked modified here
+ bool modified;
+};
+
+
+
+K3bProjectTabWidget::K3bProjectTabWidget( QWidget *parent, const char *name, WFlags f )
+ : QTabWidget( parent, name, f )
+{
+ tabBar()->setAcceptDrops(true);
+ tabBar()->installEventFilter( this );
+
+ m_projectActionMenu = new KActionMenu( i18n("Project"), this );
+}
+
+
+K3bProjectTabWidget::~K3bProjectTabWidget()
+{
+}
+
+
+void K3bProjectTabWidget::addTab( QWidget* child, const QString& label )
+{
+ QTabWidget::addTab( child, label );
+ tabBar()->setShown( count() != 1 );
+}
+
+
+void K3bProjectTabWidget::addTab( QWidget* child, const QIconSet& iconset, const QString& label )
+{
+ QTabWidget::addTab( child, iconset, label );
+ tabBar()->setShown( count() != 1 );
+}
+
+
+void K3bProjectTabWidget::addTab( QWidget* child, QTab* tab )
+{
+ QTabWidget::addTab( child, tab );
+ tabBar()->setShown( count() != 1 );
+}
+
+
+void K3bProjectTabWidget::insertTab( QWidget* child, const QString& label, int index )
+{
+ QTabWidget::insertTab( child, label, index );
+ tabBar()->setShown( count() != 1 );
+}
+
+
+void K3bProjectTabWidget::insertTab( QWidget* child, const QIconSet& iconset, const QString& label, int index )
+{
+ QTabWidget::insertTab( child, iconset, label, index );
+ tabBar()->setShown( count() != 1 );
+}
+
+
+void K3bProjectTabWidget::insertTab( QWidget* child, QTab* tab, int index )
+{
+ QTabWidget::insertTab( child, tab, index );
+ tabBar()->setShown( count() != 1 );
+}
+
+
+void K3bProjectTabWidget::removePage( QWidget* w )
+{
+ QTabWidget::removePage( w );
+ tabBar()->setShown( count() != 1 );
+}
+
+
+void K3bProjectTabWidget::insertTab( K3bDoc* doc )
+{
+ QTabWidget::insertTab( doc->view(), doc->URL().fileName() );
+ connect( k3bappcore->projectManager(), SIGNAL(projectSaved(K3bDoc*)), this, SLOT(slotDocSaved(K3bDoc*)) );
+ connect( doc, SIGNAL(changed(K3bDoc*)), this, SLOT(slotDocChanged(K3bDoc*)) );
+
+ m_projectDataMap[doc] = ProjectData( doc );
+
+ if( doc->isModified() )
+ slotDocChanged( doc );
+ else
+ slotDocSaved( doc );
+}
+
+
+void K3bProjectTabWidget::insertAction( KAction* action )
+{
+ m_projectActionMenu->insert( action );
+}
+
+
+void K3bProjectTabWidget::slotDocChanged( K3bDoc* doc )
+{
+ // we need to cache the icon changes since the changed() signal will be emitted very often
+ if( !m_projectDataMap[doc].modified ) {
+ setTabIconSet( doc->view(), SmallIconSet( "filesave" ) );
+ m_projectDataMap[doc].modified = true;
+
+ // we need this one for the session management
+ changeTab( doc->view(), doc->URL().fileName() );
+ }
+}
+
+
+void K3bProjectTabWidget::slotDocSaved( K3bDoc* doc )
+{
+ setTabIconSet( doc->view(), QIconSet() );
+ changeTab( doc->view(), doc->URL().fileName() );
+}
+
+
+K3bDoc* K3bProjectTabWidget::projectAt( const QPoint& pos ) const
+{
+ QTab* tab = tabBar()->selectTab( pos );
+ if( tab ) {
+ QWidget* w = page( tabBar()->indexOf( tab->identifier() ) );
+ if( K3bView* view = dynamic_cast<K3bView*>(w) )
+ return view->doc();
+ }
+
+ return 0;
+}
+
+
+bool K3bProjectTabWidget::eventFilter( QObject* o, QEvent* e )
+{
+ if( o == tabBar() ) {
+ if( e->type() == QEvent::MouseButtonPress ) {
+ QMouseEvent* me = static_cast<QMouseEvent*>(e);
+ if( me->button() == Qt::RightButton ) {
+ if( projectAt( me->pos() ) ) {
+ // we need change the tab because the actions work on the current tab
+ QTab* clickedTab = tabBar()->selectTab( me->pos() );
+ if( clickedTab ) {
+ tabBar()->setCurrentTab( clickedTab );
+
+ // show the popup menu
+ m_projectActionMenu->popup( me->globalPos() );
+ }
+ }
+ return true;
+ }
+ }
+
+ else if( e->type() == QEvent::DragMove ) {
+ QDragMoveEvent* de = static_cast<QDragMoveEvent*>(e);
+ de->accept( KURLDrag::canDecode(de) && projectAt(de->pos()) );
+ return true;
+ }
+
+ else if( e->type() == QEvent::Drop ) {
+ QDropEvent* de = static_cast<QDropEvent*>(e);
+ KURL::List l;
+ if( KURLDrag::decode( de, l ) ) {
+ if( K3bDoc* doc = projectAt( de->pos() ) )
+ dynamic_cast<K3bView*>(doc->view())->addUrls( l );
+ }
+ return true;
+ }
+ }
+
+ return QTabWidget::eventFilter( o, e );
+}
+
+#include "k3bprojecttabwidget.moc"
+