Initial hack at making QSplitter behave

This commit is contained in:
Mark Watkins 2011-08-02 19:12:10 +10:00
parent 38a2b18d85
commit 8723de4d36
8 changed files with 169 additions and 74 deletions

View File

@ -147,7 +147,7 @@ void gLineChart::Plot(gGraphWindow & w,float scrx,float scry)
square_plot=m_square_plot; square_plot=m_square_plot;
if (accel || num_points>1000) { // Don't square plot if too many points or waveform if (accel || num_points>5000) { // Don't square plot if too many points or waveform
square_plot=false; square_plot=false;
} }

70
Graphs/gSplitter.cpp Normal file
View File

@ -0,0 +1,70 @@
#include "gSplitter.h"
#include "graphwindow.h"
#include <QDebug>
gSplitter::gSplitter(QWidget *parent) :
QSplitter(parent)
{
z_timer=new QTimer(this);
//timer=NULL;
// icnt=0;
}
gSplitter::gSplitter(Qt::Orientation orientation, QWidget *parent) :
QSplitter(orientation,parent)
{
// icnt=0;
this->connect(this,SIGNAL(splitterMoved(int,int)),SLOT(mySplitterMoved(int,int)));
z_timer=new QTimer(this);
}
gSplitter::~gSplitter()
{
delete z_timer;
this->disconnect(SLOT(mySplitterMoved(int,int)));
// timer->stop();
}
void gSplitter::mySplitterMoved (int pos, int index)
{
if (z_timer->isActive()) z_timer->stop();
z_pos=pos;
z_index=index;
this->setUpdatesEnabled(true);
if (gGraphWindow *w=qobject_cast<gGraphWindow *>(widget(index-1))) {
int s=sizes().at(index-1);
w->updateGL();
//w->resizeGL(w->width(),pos);
//w->updateGL();
//w->paintGL();
}
if (gGraphWindow *w=qobject_cast<gGraphWindow *>(widget(index))) {
int s=sizes().at(index);
//w->resizeGL(w->width(),s);
//w->updateGL();
//w->paintGL();
}
qDebug() << ++icnt;
z_timer->singleShot(50,this,SLOT(doUpdateGraph()));
tm.start();
this->setUpdatesEnabled(false);
}
void gSplitter::doUpdateGraph()
{
if (tm.elapsed()<50)
return;
if (gGraphWindow *w=qobject_cast<gGraphWindow *>(widget(z_index))) {
qDebug() << icnt << "Height" << w->height() << z_index << z_pos << w->Title();
int s=sizes().at(z_index);
this->setUpdatesEnabled(true);
w->resizeGL(w->width(),s);
w->paintGL();
}
//timer->stop();
icnt=0;
// QSplitter::resizeEvent(&event);
}

30
Graphs/gSplitter.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef GSPLITTER_H
#define GSPLITTER_H
#include <QSplitter>
#include <QResizeEvent>
#include <QTime>
#include <QTimer>
class gSplitter : public QSplitter
{
Q_OBJECT
public:
explicit gSplitter(QWidget *parent = 0);
explicit gSplitter(Qt::Orientation orientation, QWidget *parent = 0);
virtual ~gSplitter();
signals:
public slots:
void mySplitterMoved(int pos, int index);
void doUpdateGraph();
protected:
QTimer * z_timer;
int z_pos,z_index;
int icnt;
QTime tm;
};
#endif // GSPLITTER_H

View File

@ -91,17 +91,10 @@ bool gGraphWindow::isEmpty()
} }
return empty; return empty;
} }
void gGraphWindow::resizeEvent(QResizeEvent *e) /*void gGraphWindow::resizeEvent(QResizeEvent *e)
{ {
this->setUpdatesEnabled(false);
this->blockSignals(true);
QGLWidget::resizeEvent(e); QGLWidget::resizeEvent(e);
this->blockSignals(false); }*/
this->setUpdatesEnabled(true);
//this->resizeGL(e->size().width(),e->size().height());
//this->paintGL();
//e->accept();
}
void gGraphWindow::AddLayer(gLayer *l) { void gGraphWindow::AddLayer(gLayer *l) {

View File

@ -132,9 +132,10 @@ public:
bool isEmpty(); bool isEmpty();
void SetSplitter(QSplitter *s) { splitter=s; } void SetSplitter(QSplitter *s) { splitter=s; }
bool isDraggingGraph() { return m_dragGraph; } bool isDraggingGraph() { return m_dragGraph; }
void setScry(int h) { m_scrY=h; }
protected: protected:
void updateSelectionTime(qint64 span); void updateSelectionTime(qint64 span);
void resizeEvent(QResizeEvent *); //virtual void resizeEvent(QResizeEvent *);
void initializeGL(); void initializeGL();
QSplitter *splitter; QSplitter *splitter;
QList<gGraphWindow *>link_zoom; QList<gGraphWindow *>link_zoom;

View File

@ -55,7 +55,8 @@ SOURCES += main.cpp\
Graphs/gBarChart.cpp \ Graphs/gBarChart.cpp \
Graphs/gSegmentChart.cpp \ Graphs/gSegmentChart.cpp \
Graphs/gSessionTime.cpp \ Graphs/gSessionTime.cpp \
qextserialport/qextserialport.cpp qextserialport/qextserialport.cpp \
Graphs/gSplitter.cpp
unix:SOURCES += qextserialport/posix_qextserialport.cpp unix:SOURCES += qextserialport/posix_qextserialport.cpp
unix:!macx:SOURCES += qextserialport/qextserialenumerator_unix.cpp unix:!macx:SOURCES += qextserialport/qextserialenumerator_unix.cpp
@ -104,7 +105,8 @@ HEADERS += \
SleepLib/loader_plugins/sleep_database.h \ SleepLib/loader_plugins/sleep_database.h \
qextserialport/qextserialport_global.h \ qextserialport/qextserialport_global.h \
qextserialport/qextserialport.h \ qextserialport/qextserialport.h \
qextserialport/qextserialenumerator.h qextserialport/qextserialenumerator.h \
Graphs/gSplitter.h
FORMS += \ FORMS += \

114
daily.cpp
View File

@ -53,38 +53,38 @@ Daily::Daily(QWidget *parent,QGLWidget * shared, MainWindow *mw)
//scrollArea=new MyScrollArea(this); //scrollArea=new MyScrollArea(this);
gSplitter=new QSplitter(Qt::Vertical,ui->scrollArea); splitter=new gSplitter(Qt::Vertical,ui->scrollArea);
gSplitter->setStyleSheet("QSplitter::handle { background-color: 'light grey'; }"); splitter->setStyleSheet("QSplitter::handle { background-color: 'light grey'; }");
gSplitter->setHandleWidth(3); splitter->setHandleWidth(3);
#ifdef Q_WS_MAC #ifdef Q_WS_MAC
gSplitter->setOpaqueResize(false); splitter->setOpaqueResize(false);
#endif #endif
ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->scrollArea->setWidget(gSplitter); ui->scrollArea->setWidget(splitter);
//this->connect(ui->scrollArea, //this->connect(ui->scrollArea,
//ui->graphSizer->addWidget(gSplitter); //ui->graphSizer->addWidget(splitter);
ui->scrollArea->setAutoFillBackground(false); ui->scrollArea->setAutoFillBackground(false);
gSplitter->setAutoFillBackground(false); splitter->setAutoFillBackground(false);
ui->scrollArea->setWidgetResizable(true); ui->scrollArea->setWidgetResizable(true);
//gSplitter->setMinimumHeight(1600); //splitter->setMinimumHeight(1600);
//gSplitter->setMinimumWidth(600); //splitter->setMinimumWidth(600);
SF=new gGraphWindow(gSplitter,tr("Event Flags"),shared); SF=new gGraphWindow(splitter,tr("Event Flags"),shared);
FRW=new gGraphWindow(gSplitter,tr("Flow Rate"),SF); FRW=new gGraphWindow(splitter,tr("Flow Rate"),SF);
PRD=new gGraphWindow(gSplitter,tr("Pressure"),SF); PRD=new gGraphWindow(splitter,tr("Pressure"),SF);
LEAK=new gGraphWindow(gSplitter,tr("Leaks"),SF); LEAK=new gGraphWindow(splitter,tr("Leaks"),SF);
MP=new gGraphWindow(gSplitter,tr("Mask Pressure"),SF); MP=new gGraphWindow(splitter,tr("Mask Pressure"),SF);
SNORE=new gGraphWindow(gSplitter,tr("Snore"),SF); SNORE=new gGraphWindow(splitter,tr("Snore"),SF);
FLG=new gGraphWindow(gSplitter,tr("Flow Limitation"),SF); FLG=new gGraphWindow(splitter,tr("Flow Limitation"),SF);
MV=new gGraphWindow(gSplitter,tr("Minute Ventilation"),SF); MV=new gGraphWindow(splitter,tr("Minute Ventilation"),SF);
TV=new gGraphWindow(gSplitter,tr("Tidal Volume"),SF); TV=new gGraphWindow(splitter,tr("Tidal Volume"),SF);
RR=new gGraphWindow(gSplitter,tr("Respiratory Rate"),SF); RR=new gGraphWindow(splitter,tr("Respiratory Rate"),SF);
PTB=new gGraphWindow(gSplitter,tr("Patient Trig Breaths"),SF); PTB=new gGraphWindow(splitter,tr("Patient Trig Breaths"),SF);
//OF=new gGraphWindow(gSplitter,tr("Oxi-Flags"),SF); //OF=new gGraphWindow(splitter,tr("Oxi-Flags"),SF);
PULSE=new gGraphWindow(gSplitter,tr("Pulse"),SF); PULSE=new gGraphWindow(splitter,tr("Pulse"),SF);
SPO2=new gGraphWindow(gSplitter,tr("SPO2"),SF); SPO2=new gGraphWindow(splitter,tr("SPO2"),SF);
TAP=new gGraphWindow(NULL,"",(QGLWidget* )NULL); TAP=new gGraphWindow(NULL,"",(QGLWidget* )NULL);
TAP_EAP=new gGraphWindow(NULL,"",(QGLWidget* )NULL); TAP_EAP=new gGraphWindow(NULL,"",(QGLWidget* )NULL);
@ -261,24 +261,24 @@ Daily::Daily(QWidget *parent,QGLWidget * shared, MainWindow *mw)
G_AHI->SetGradientBackground(false); G_AHI->SetGradientBackground(false);
G_AHI->hide(); G_AHI->hide();
NoData=new QLabel(tr("No data"),gSplitter); NoData=new QLabel(tr("No data"),splitter);
NoData->setAlignment(Qt::AlignCenter); NoData->setAlignment(Qt::AlignCenter);
QFont font("FreeSans",20); //NoData->font(); QFont font("FreeSans",20); //NoData->font();
//font.setBold(true); //font.setBold(true);
NoData->setFont(font); NoData->setFont(font);
NoData->hide(); NoData->hide();
gSplitter->addWidget(NoData); splitter->addWidget(NoData);
int i=gSplitter->indexOf(NoData); int i=splitter->indexOf(NoData);
gSplitter->setStretchFactor(i,1); splitter->setStretchFactor(i,1);
gGraphWindow * graphs[]={SF,FRW,MP,MV,TV,PTB,RR,PRD,LEAK,FLG,SNORE}; gGraphWindow * graphs[]={SF,FRW,MP,MV,TV,PTB,RR,PRD,LEAK,FLG,SNORE};
int ss=sizeof(graphs)/sizeof(gGraphWindow *); int ss=sizeof(graphs)/sizeof(gGraphWindow *);
for (int i=0;i<ss;i++) { for (int i=0;i<ss;i++) {
AddGraph(graphs[i]); AddGraph(graphs[i]);
//int j=gSplitter->indexOf(graphs[i]); //int j=splitter->indexOf(graphs[i]);
//gSplitter->setStretchFactor(j,1); //splitter->setStretchFactor(j,1);
for (int j=0;j<ss;j++) { for (int j=0;j<ss;j++) {
if (graphs[i]!=graphs[j]) if (graphs[i]!=graphs[j])
graphs[i]->LinkZoom(graphs[j]); graphs[i]->LinkZoom(graphs[j]);
@ -297,24 +297,24 @@ Daily::Daily(QWidget *parent,QGLWidget * shared, MainWindow *mw)
//OF->LinkZoom(SPO2); //OF->LinkZoom(SPO2);
// AddGraph(SPO2); // AddGraph(SPO2);
// spacer=new QWidget(gSplitter); // spacer=new QWidget(splitter);
//spacer->setMaximumHeight(default_height); //spacer->setMaximumHeight(default_height);
//gSplitter->addWidget(spacer); //splitter->addWidget(spacer);
//i=gSplitter->indexOf(spacer); //i=splitter->indexOf(spacer);
//gSplitter->setStretchFactor(i,1); //splitter->setStretchFactor(i,1);
//i=gSplitter->indexOf(FRW); //i=splitter->indexOf(FRW);
//gSplitter->setStretchFactor(i,15); //splitter->setStretchFactor(i,15);
//gSplitter->refresh(); //splitter->refresh();
gSplitter->setChildrenCollapsible(false); // We set this per widget.. splitter->setChildrenCollapsible(false); // We set this per widget..
//gSplitter->setCollapsible(gSplitter->indexOf(SF),false); //splitter->setCollapsible(splitter->indexOf(SF),false);
//gSplitter->setStretchFactor(gSplitter->indexOf(SF),0); //splitter->setStretchFactor(splitter->indexOf(SF),0);
splitter_sizes=gSplitter->sizes(); splitter_sizes=splitter->sizes();
gSplitter->layout(); splitter->layout();
gSplitter->update(); splitter->update();
QTextCharFormat format = ui->calendar->weekdayTextFormat(Qt::Saturday); QTextCharFormat format = ui->calendar->weekdayTextFormat(Qt::Saturday);
@ -344,20 +344,20 @@ Daily::~Daily()
if (previous_date.isValid()) if (previous_date.isValid())
Unload(previous_date); Unload(previous_date);
delete gSplitter; delete splitter;
delete ui; delete ui;
} }
void Daily::AddGraph(gGraphWindow *w) void Daily::AddGraph(gGraphWindow *w)
{ {
Graphs.push_back(w); Graphs.push_back(w);
gSplitter->addWidget(w); splitter->addWidget(w);
w->SetSplitter(gSplitter); w->SetSplitter(splitter);
} }
void Daily::resizeEvent (QResizeEvent * event) void Daily::resizeEvent (QResizeEvent * event)
{ {
//const QSize &size=event->size(); //const QSize &size=event->size();
// gSplitter->setMinimumWidth(size.width()-280); // splitter->setMinimumWidth(size.width()-280);
} }
void Daily::ReloadGraphs() void Daily::ReloadGraphs()
@ -489,7 +489,7 @@ void Daily::on_calendar_selectionChanged()
} }
void Daily::ResetGraphLayout() void Daily::ResetGraphLayout()
{ {
gSplitter->setSizes(splitter_sizes); splitter->setSizes(splitter_sizes);
} }
void Daily::ShowHideGraphs() void Daily::ShowHideGraphs()
@ -510,10 +510,10 @@ void Daily::ShowHideGraphs()
} }
} }
} }
gSplitter->setMinimumHeight(vis*default_height); splitter->setMinimumHeight(vis*default_height);
//gSplitter->setMaximumHeight(vis*default_height); //splitter->setMaximumHeight(vis*default_height);
gSplitter->layout(); splitter->layout();
gSplitter->update(); splitter->update();
RedrawGraphs(); RedrawGraphs();
} }
void Daily::Load(QDate date) void Daily::Load(QDate date)
@ -544,7 +544,7 @@ void Daily::Load(QDate date)
UpdateEventsTree(ui->treeWidget,cpap); UpdateEventsTree(ui->treeWidget,cpap);
if (!cpap && !oxi) { if (!cpap && !oxi) {
gSplitter->setMinimumHeight(0); splitter->setMinimumHeight(0);
NoData->setText(tr("No data for ")+date.toString(Qt::SystemLocaleLongDate)); NoData->setText(tr("No data for ")+date.toString(Qt::SystemLocaleLongDate));
NoData->show(); NoData->show();
for (int i=0;i<Graphs.size();i++) { for (int i=0;i<Graphs.size();i++) {
@ -575,18 +575,18 @@ void Daily::Load(QDate date)
if (!cpap) { if (!cpap) {
SF->hide(); SF->hide();
} }
//gSplitter->setMinimumHeight(0); //splitter->setMinimumHeight(0);
gSplitter->setMinimumHeight(vis*default_height); splitter->setMinimumHeight(vis*default_height);
//if (vis>4) { //if (vis>4) {
//gSplitter->setMaximumHeight(vis*default_height); //splitter->setMaximumHeight(vis*default_height);
//} //else { //} //else {
// } // }
gSplitter->layout(); splitter->layout();
// spacer->show(); // spacer->show();
} }
gSplitter->update(); splitter->update();
RedrawGraphs(); RedrawGraphs();
QString epr,modestr; QString epr,modestr;

View File

@ -11,7 +11,6 @@
#include <QScrollArea> #include <QScrollArea>
#include <QMenu> #include <QMenu>
#include <QAction> #include <QAction>
#include <QSplitter>
#include <QWidget> #include <QWidget>
#include <QTreeWidget> #include <QTreeWidget>
#include <QLabel> #include <QLabel>
@ -20,9 +19,9 @@
#include <SleepLib/profiles.h> #include <SleepLib/profiles.h>
#include <Graphs/graphwindow.h> #include <Graphs/graphwindow.h>
#include "mainwindow.h" #include "mainwindow.h"
//#include <Graphs/graphdata.h> #include "Graphs/gSplitter.h"
#include "Graphs/gLineChart.h" #include "Graphs/gLineChart.h"
#include <Graphs/gFlagsLine.h> #include "Graphs/gFlagsLine.h"
namespace Ui { namespace Ui {
class Daily; class Daily;
} }
@ -102,7 +101,7 @@ private:
Profile *profile; Profile *profile;
QDate previous_date; QDate previous_date;
MyScrollArea *scrollArea; MyScrollArea *scrollArea;
QSplitter *gSplitter; gSplitter *splitter;
QLabel *NoData; QLabel *NoData;
QWidget *spacer; QWidget *spacer;
QMenu *show_graph_menu; QMenu *show_graph_menu;