diff options
Diffstat (limited to 'src/sq_glview.cpp')
-rw-r--r-- | src/sq_glview.cpp | 360 |
1 files changed, 360 insertions, 0 deletions
diff --git a/src/sq_glview.cpp b/src/sq_glview.cpp new file mode 100644 index 0000000..59498ca --- /dev/null +++ b/src/sq_glview.cpp @@ -0,0 +1,360 @@ +/*************************************************************************** + sq_glview.cpp - description + ------------------- + begin : ??? ??? 5 2004 + copyright : (C) 2004 by Baryshev Dmitry + email : [email protected] + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <tqlayout.h> +#include <tqlabel.h> +#include <tqtoolbutton.h> +#include <tqtooltip.h> +#include <tqhbox.h> + +#include <tdeaction.h> +#include <kstatusbar.h> +#include <tdetoolbar.h> +#include <kstandarddirs.h> +#include <tdeactioncollection.h> +#include <tdelocale.h> +#include <ksqueezedtextlabel.h> +#include <ktabbar.h> +#include <kiconloader.h> + +#include "sq_glview.h" +#include "sq_glwidget.h" +#include "sq_glwidget_helpers.h" +#include "sq_config.h" +#include "sq_iconloader.h" + +#include "ksquirrel.h" +#include "sq_widgetstack.h" + +SQ_GLView * SQ_GLView::m_instance = 0; + +SQ_GLView::SQ_GLView(TQWidget *parent) : TQVBox(parent, "ksquirrel-image-window") +{ + m_instance = this; + + createContent(); + + installEventFilter(this); +} + +SQ_GLView::~SQ_GLView() +{} + +void SQ_GLView::createContent() +{ + box = new TQVBox(this); + + m_toolbar = new SQ_ToolBar(box); + m_toolbar->setMouseTracking(true); + + SQ_Config::instance()->setGroup("GL view"); + + // read settings + m_tabs = SQ_Config::instance()->readBoolEntry("tabs", false); + m_tabsclose = SQ_Config::instance()->readBoolEntry("tabs_close", true); + + m_tabbar = new KTabBar(box); + m_tabbar->setHoverCloseButton(m_tabsclose); + m_tabbar->setHoverCloseButtonDelayed(false); + m_tabbar->setMouseTracking(true); + m_tabbar->setFocusPolicy(TQWidget::NoFocus); + + box->setStretchFactor(m_toolbar, 1); + + m_tabbar->setShown(false); + + gl = new SQ_GLWidget(this, "ksquirrel-opengl-widget"); + gl->glInitA(); + gl->setFocus(); + + connect(m_tabbar, TQ_SIGNAL(selected(int)), gl, TQ_SLOT(slotChangeTab(int))); + connect(m_tabbar, TQ_SIGNAL(closeRequest(int)), gl, TQ_SLOT(slotCloseRequest(int))); + connect(m_tabbar, TQ_SIGNAL(mouseMiddleClick(int)), gl, TQ_SLOT(slotCloseRequest(int))); + connect(gl, TQ_SIGNAL(tabCountChanged()), this, TQ_SLOT(slotTabCountChanged())); + + setStretchFactor(gl, 1); + + sbar = new KStatusBar(this); + sbar->setMouseTracking(true); + + // create TQLabels, fill 'names' with pointers + TQHBox *sqSBDecodedBox = new TQHBox; + sqSBDecodedBox->setSpacing(2); + TQLabel *sqSBDecodedI = new TQLabel(TQString(), sqSBDecodedBox, "SBDecodedI"); + names.insert("SBDecodedI", sqSBDecodedI); + TQLabel *sqSBDecoded = new TQLabel(TQString(), sqSBDecodedBox, "SBDecoded"); + names.insert("SBDecoded", sqSBDecoded); + + TQLabel *sqSBGLZoom = new TQLabel(TQString(), 0, "SBGLZoom"); + names.insert("SBGLZoom", sqSBGLZoom); + TQLabel *sqSBGLAngle = new TQLabel(TQString(), 0, "SBGLAngle"); + names.insert("SBGLAngle", sqSBGLAngle); + TQLabel *sqSBLoaded = new TQLabel(TQString(), 0, "SBLoaded"); + TQToolTip::add(sqSBLoaded, i18n("Loading time")); + names.insert("SBLoaded", sqSBLoaded); + TQLabel *sqSBFrame = new TQLabel(TQString(), 0, "SBFrame"); + names.insert("SBFrame", sqSBFrame); + TQLabel *sqSBFile = new KSqueezedTextLabel(TQString(), 0, "SBFile"); + names.insert("SBFile", sqSBFile); + + sqSBFrame->setAlignment(TQt::AlignHCenter | TQt::AlignVCenter | TQt::ExpandTabs); + sqSBFile->setAlignment(TQt::AlignRight | TQt::AlignTop); + TQFont font = sqSBFile->font(); + font.setBold(true); + sqSBFile->setFont(font); + + // fill statusbar + sbar->addWidget(sqSBDecodedBox, 0, true); + sbar->addWidget(sqSBFrame, 0, true); + sbar->addWidget(sqSBLoaded, 0, true); + sbar->addWidget(sqSBGLZoom, 0, true); + sbar->addWidget(sqSBGLAngle, 0, true); + sbar->addWidget(sqSBFile, 1, true); + + resetStatusBar(); + + sbar->setShown(SQ_Config::instance()->readBoolEntry("statusbar", true)); + + // restore geometry from config file + restoreGeometry(); + + gl->matrixChanged(); +} + +void SQ_GLView::closeEvent(TQCloseEvent *e) +{ + // ignore event + e->ignore(); + + // let KSquirrel close SQ_GLView, since it can be built-in + KSquirrel::app()->closeGLWidget(); +} + +bool SQ_GLView::eventFilter(TQObject *watched, TQEvent *e) +{ + if(watched == this) + { + // stop animation, if SQ_GLView is hidden (animation becomes useless) + if(/*e->type() == TQEvent::WindowDeactivate || */e->type() == TQEvent::Hide) + { + gl->stopAnimation(); + return true; + } + // resume animation, if needed + else if(/*e->type() == TQEvent::WindowActivate || */e->type() == TQEvent::Show) + { + if(!gl->manualBlocked()) + gl->startAnimation(); + + return true; + } + else // call to default eventFilter() + return TQVBox::eventFilter(watched, e); + } + else + return TQVBox::eventFilter(watched, e); +} + +void SQ_GLView::saveGeometry() +{ + SQ_Config::instance()->writeEntry("pos", pos()); + SQ_Config::instance()->writeEntry("size", size()); +} + +void SQ_GLView::restoreGeometry() +{ + TQPoint p_def(0,0); + TQSize sz_def(660, 480); + + SQ_Config::instance()->setGroup("GL view"); + + TQPoint p = SQ_Config::instance()->readPointEntry("pos", &p_def); + TQSize sz = SQ_Config::instance()->readSizeEntry("size", &sz_def); + + move(p); + resize(sz); +} + +/* + * Reset all statusbar's labels to default values. + */ +void SQ_GLView::resetStatusBar() +{ + TQString fl = TQString::fromLatin1("----"); + + names["SBGLZoom"]->setText(fl); + names["SBGLAngle"]->setText(fl); + names["SBLoaded"]->setText(fl); + names["SBDecodedI"]->setText(TQString::fromLatin1("--")); + names["SBFile"]->setText(TQString::fromLatin1("--------")); + names["SBDecoded"]->setText(fl); + names["SBFrame"]->setText(TQString::fromLatin1("0/0")); +} + +SQ_ToolBar::SQ_ToolBar(TQWidget *parent) : TDEToolBar(parent) +{ + setFixedHeight(SQ_ToolButton::fixedWidth() + 5); + boxLayout()->setSpacing(0); + boxLayout()->setMargin(0); +} + +SQ_ToolBar::~SQ_ToolBar() +{} + +void SQ_ToolBar::mouseReleaseEvent(TQMouseEvent *e) +{ + e->accept(); +} + +void SQ_GLView::addPage(const TQString &label) +{ + TQTab *tab = new TQTab(label); + + m_tabbar->addTab(tab); + + SQ_Config::instance()->setGroup("GL view"); + + if(m_tabsclose) + tab->setIconSet(SmallIcon("window-close")); +} + +void SQ_GLView::removePage(int index) +{ + m_tabbar->removeTab(m_tabbar->tabAt(index)); + m_tabbar->setHidden(m_tabbar->count() <= 1); +} + +void SQ_GLView::removeTabs() +{ + blockSignals(true); + int cnt = m_tabbar->count(); + + while(cnt--) + m_tabbar->removeTab(m_tabbar->tabAt(0)); + + blockSignals(false); +} + +void SQ_GLView::setupTabbar() +{ + SQ_Config::instance()->setGroup("GL view"); + + int cnt; + + if(m_tabsclose != SQ_Config::instance()->readBoolEntry("tabs_close", true)) + { + m_tabsclose = SQ_Config::instance()->readBoolEntry("tabs_close", true); + + // change iconset + cnt = m_tabbar->count(); + + for(int i = 0;i < cnt;i++) + m_tabbar->tabAt(i)->setIconSet(m_tabsclose ? SmallIcon("window-close") : TQPixmap()); + + m_tabbar->setHoverCloseButton(m_tabsclose); + m_tabbar->layoutTabs(); + } + + if(m_tabs == SQ_Config::instance()->readBoolEntry("tabs", false)) + return; + + blockSignals(true); + + m_tabs = SQ_Config::instance()->readBoolEntry("tabs", false); + + m_tabbar->setHoverCloseButton(m_tabsclose); + m_tabbar->setShown(m_tabs); + + int id = m_tabbar->currentTab(); + + if(id == -1) + { + if(m_tabs) m_tabbar->setHidden(m_tabbar->count() <= 1); + blockSignals(false); + return; + } + + int index = m_tabbar->indexOf(id); + + // remove other tabs if needed + if(!m_tabs) + { + int ind = 0; + cnt = m_tabbar->count(); + cnt--; + + while(cnt--) + { + if(m_tabbar->tabAt(ind)->identifier() == id) + { + ind++; + continue; + } + + m_tabbar->removeTab(m_tabbar->tabAt(ind)); + } + } + else + m_tabbar->setHidden(m_tabbar->count() <= 1); + + blockSignals(false); + + if(!m_tabs) + gl->removeNonCurrentTabs(index); +} + +void SQ_GLView::slotTabCountChanged() +{ + if(m_tabs) + m_tabbar->setHidden(m_tabbar->count() <= 1); +} + +void SQ_GLView::leftTab() +{ + int index = m_tabbar->indexOf(m_tabbar->currentTab()); + + // smth went wrong + if(index < 0) return; + + index--; + if(index < 0) + index = m_tabbar->count() - 1; + + if(index < 0) return; + + m_tabbar->setCurrentTab(m_tabbar->tabAt(index)); +} + +void SQ_GLView::rightTab() +{ + int index = m_tabbar->indexOf(m_tabbar->currentTab()); + + // smth went wrong + if(index < 0) return; + + index++; + if(index >= m_tabbar->count()) + index = 0; + + m_tabbar->setCurrentTab(m_tabbar->tabAt(index)); +} + +#include "sq_glview.moc" |