Commit 70030222 authored by Christoffer Ackelman's avatar Christoffer Ackelman

QT: Scrolling now works as in the GTK version.

parent 60e5f9c0
...@@ -71,6 +71,11 @@ void QtScrollWidgetFlow::init(unsigned int eCtxType, ...@@ -71,6 +71,11 @@ void QtScrollWidgetFlow::init(unsigned int eCtxType,
this->scroll_timerid = new QTimer(this); this->scroll_timerid = new QTimer(this);
} }
bool QtScrollWidgetFlow::eventFilter(QObject *object, QEvent *event)
{
return (event->type() == QEvent::KeyPress);
}
QWidget* QtScrollWidgetFlow::initScroll(unsigned int eCtxType, QWidget* QtScrollWidgetFlow::initScroll(unsigned int eCtxType,
int (*init_proc)(FlowCtx* ctx, void* client_data), void* client_data, int (*init_proc)(FlowCtx* ctx, void* client_data), void* client_data,
int (*init_proc2)(QWidget* w, FlowCtx* ctx, void* client_data)) int (*init_proc2)(QWidget* w, FlowCtx* ctx, void* client_data))
...@@ -83,16 +88,22 @@ QWidget* QtScrollWidgetFlow::initScroll(unsigned int eCtxType, ...@@ -83,16 +88,22 @@ QWidget* QtScrollWidgetFlow::initScroll(unsigned int eCtxType,
this->init_widget_proc = init_proc2; this->init_widget_proc = init_proc2;
this->client_data = client_data; this->client_data = client_data;
this->scroll_timerid = new QTimer(this); this->scroll_timerid = new QTimer(this);
QScrollArea* form = new QScrollArea(); form = new QScrollArea();
form->installEventFilter(this);
scroll_h = form->horizontalScrollBar(); scroll_h = form->horizontalScrollBar();
scroll_v = form->verticalScrollBar(); scroll_v = form->verticalScrollBar();
/* scroll_h->setTracking(false);
TODO: this callback resets the scrollbar to 0. scroll_v->setTracking(false);
QObject::connect(
scroll_h, SIGNAL(sliderMoved(int)), this, SLOT(scroll_h_action(int)));
QObject::connect(
scroll_v, SIGNAL(sliderMoved(int)), this, SLOT(scroll_v_action(int)));
// These are needed to prevent QT from scrolling the ScrollArea.
QObject::connect( QObject::connect(
scroll_h, SIGNAL(valueChanged(int)), this, SLOT(scroll_h_action(int))); scroll_h, SIGNAL(valueChanged(int)), this, SLOT(scroll_h_released(int)));
QObject::connect( QObject::connect(
scroll_v, SIGNAL(valueChanged(int)), this, SLOT(scroll_v_action(int))); scroll_v, SIGNAL(valueChanged(int)), this, SLOT(scroll_v_released(int)));
*/
form->setWidget(this); form->setWidget(this);
form->setWidgetResizable(true); form->setWidgetResizable(true);
...@@ -117,31 +128,28 @@ void QtScrollWidgetFlow::scroll_callback_cb() ...@@ -117,31 +128,28 @@ void QtScrollWidgetFlow::scroll_callback_cb()
scroll_timerid->stop(); scroll_timerid->stop();
if (data->total_width <= data->window_width) { if (data->offset_x == 0 && data->total_width <= data->window_width) {
if (data->offset_x == 0) { data->total_width = data->window_width;
data->total_width = data->window_width;
}
if (scroll_data->scroll_h_managed) { if (scroll_data->scroll_h_managed) {
// Remove horizontal scrollbar form->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
} }
} else { } else {
if (!scroll_data->scroll_h_managed) { if (scroll_data->scroll_h_managed) {
// Insert horizontal scrollbar form->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
} }
} }
if (data->total_height <= data->window_height) { if (data->offset_y == 0 && data->total_height <= data->window_height) {
if (data->offset_y == 0) { data->total_height = data->window_height;
data->total_height = data->window_height;
}
if (scroll_data->scroll_v_managed) { if (scroll_data->scroll_v_managed) {
// Remove vertical scrollbar form->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
} }
} else { } else {
if (!scroll_data->scroll_v_managed) { if (scroll_data->scroll_v_managed) {
// Insert vertical scrollbar form->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
} }
} }
if (data->offset_x < 0) { if (data->offset_x < 0) {
data->total_width += -data->offset_x; data->total_width += -data->offset_x;
data->offset_x = 0; data->offset_x = 0;
...@@ -164,57 +172,51 @@ void QtScrollWidgetFlow::scroll_callback_cb() ...@@ -164,57 +172,51 @@ void QtScrollWidgetFlow::scroll_callback_cb()
} }
if (scroll_data->scroll_h_managed) { if (scroll_data->scroll_h_managed) {
scroll_h_ignore = 1; if (data->window_width != scroll_h->pageStep()
if (data->window_width != scroll_h_pagesize || data->total_width != scroll_h->maximum() || scroll_configure) {
|| data->total_width != scroll_h_upper || scroll_configure) { scroll_h->setMaximum(data->total_width - data->window_width);
scroll_data->scroll_h->setMaximum(data->total_width); scroll_h->setPageStep(data->window_width);
scroll_data->scroll_h->setPageStep(data->window_width);
} }
scroll_data->scroll_h->setSliderPosition(data->offset_x); scroll_h->setSliderPosition(data->offset_x);
scroll_h_value = data->offset_x;
scroll_h_pagesize = data->window_width;
scroll_h_upper = data->total_width;
} }
if (scroll_data->scroll_v_managed) { if (scroll_data->scroll_v_managed) {
scroll_v_ignore = 1; if (data->window_height != scroll_v->pageStep()
if (data->window_height != scroll_v_pagesize || data->total_height != scroll_v->maximum() || scroll_configure) {
|| data->total_height != scroll_v_upper || scroll_configure) { scroll_v->setMaximum(data->total_height - data->window_height);
scroll_data->scroll_v->setMaximum(data->total_height); scroll_v->setPageStep(data->window_height);
scroll_data->scroll_v->setPageStep(data->window_height);
} }
scroll_data->scroll_v->setSliderPosition(data->offset_y); scroll_v->setSliderPosition(data->offset_y);
scroll_v_value = data->offset_y;
scroll_v_pagesize = data->window_height;
scroll_v_upper = data->total_height;
} }
scroll_configure = 0; scroll_configure = 0;
} }
void QtScrollWidgetFlow::scroll_h_action(int value) void QtScrollWidgetFlow::scroll_h_action(int value)
{ {
if (scroll_h_ignore) {
scroll_h_ignore = 0;
return;
}
scroll_h_value = value;
FlowCtx* ctx = (FlowCtx*)parent_ctx; FlowCtx* ctx = (FlowCtx*)parent_ctx;
flow_scroll_horizontal(ctx, value, 0); flow_scroll_horizontal(ctx, value, 0);
} }
void QtScrollWidgetFlow::scroll_v_action(int value) void QtScrollWidgetFlow::scroll_h_released(int value)
{ {
if (scroll_v_ignore) { // Prevent QT from scrolling the ScrollArea by setting the value to 0.
scroll_v_ignore = 0; scroll_h->setValue(0);
return; scroll_h->setSliderPosition(value);
} }
scroll_v_value = value; void QtScrollWidgetFlow::scroll_v_action(int value)
{
FlowCtx* ctx = (FlowCtx*)parent_ctx; FlowCtx* ctx = (FlowCtx*)parent_ctx;
flow_scroll_vertical(ctx, value, 0); flow_scroll_vertical(ctx, value, 0);
} }
void QtScrollWidgetFlow::scroll_v_released(int value)
{
// Prevent QT from scrolling the ScrollArea by setting the value to 0.
scroll_v->setValue(0);
scroll_v->setSliderPosition(value);
}
void QtScrollWidgetFlow::paintEvent(QPaintEvent* event) void QtScrollWidgetFlow::paintEvent(QPaintEvent* event)
{ {
QPainter painter(this); QPainter painter(this);
......
...@@ -69,6 +69,8 @@ public: ...@@ -69,6 +69,8 @@ public:
int (*init_proc2)(QWidget* w, FlowCtx* ctx, void* client_data)); int (*init_proc2)(QWidget* w, FlowCtx* ctx, void* client_data));
void init(unsigned int eCtxType, QWidget* main); void init(unsigned int eCtxType, QWidget* main);
bool eventFilter(QObject *object, QEvent *event);
void* parent_ctx; void* parent_ctx;
FlowDrawQt* draw_ctx; FlowDrawQt* draw_ctx;
int (*init_proc)(FlowCtx* ctx, void* clien_data); int (*init_proc)(FlowCtx* ctx, void* clien_data);
...@@ -78,18 +80,11 @@ public: ...@@ -78,18 +80,11 @@ public:
QWidget* main_widget; QWidget* main_widget;
QScrollBar* scroll_h; QScrollBar* scroll_h;
QScrollBar* scroll_v; QScrollBar* scroll_v;
int scroll_h_ignore;
int scroll_v_ignore;
double scroll_h_value;
double scroll_v_value;
int scroll_h_pagesize;
int scroll_v_pagesize;
int scroll_h_upper;
int scroll_v_upper;
QTimer* scroll_timerid; QTimer* scroll_timerid;
flow_sScroll scroll_data; flow_sScroll scroll_data;
int scroll_configure; int scroll_configure;
int destroyed; int destroyed;
QScrollArea* form;
QImage image; QImage image;
...@@ -112,6 +107,8 @@ private: ...@@ -112,6 +107,8 @@ private:
public slots: public slots:
void scroll_h_action(int value); void scroll_h_action(int value);
void scroll_v_action(int value); void scroll_v_action(int value);
void scroll_h_released(int value);
void scroll_v_released(int value);
void scroll_callback_cb(); void scroll_callback_cb();
}; };
......
...@@ -72,6 +72,11 @@ void QtScrollWidgetGlow::init(unsigned int eCtxType, ...@@ -72,6 +72,11 @@ void QtScrollWidgetGlow::init(unsigned int eCtxType,
this->scroll_timerid = new QTimer(this); this->scroll_timerid = new QTimer(this);
} }
bool QtScrollWidgetGlow::eventFilter(QObject *object, QEvent *event)
{
return (event->type() == QEvent::KeyPress);
}
QWidget* QtScrollWidgetGlow::initScroll(unsigned int eCtxType, QWidget* QtScrollWidgetGlow::initScroll(unsigned int eCtxType,
int (*init_proc)(GlowCtx* ctx, void* client_data), void* client_data, int (*init_proc)(GlowCtx* ctx, void* client_data), void* client_data,
int (*init_proc2)(QWidget* w, GlowCtx* ctx, void* client_data)) int (*init_proc2)(QWidget* w, GlowCtx* ctx, void* client_data))
...@@ -84,17 +89,22 @@ QWidget* QtScrollWidgetGlow::initScroll(unsigned int eCtxType, ...@@ -84,17 +89,22 @@ QWidget* QtScrollWidgetGlow::initScroll(unsigned int eCtxType,
this->init_widget_proc = init_proc2; this->init_widget_proc = init_proc2;
this->client_data = client_data; this->client_data = client_data;
this->scroll_timerid = new QTimer(this); this->scroll_timerid = new QTimer(this);
form = new QScrollArea();
QScrollArea* form = new QScrollArea(); form->installEventFilter(this);
scroll_h = form->horizontalScrollBar(); scroll_h = form->horizontalScrollBar();
scroll_v = form->verticalScrollBar(); scroll_v = form->verticalScrollBar();
/* scroll_h->setTracking(false);
TODO: this callback resets the scrollbar to 0. scroll_v->setTracking(false);
QObject::connect(
scroll_h, SIGNAL(sliderMoved(int)), this, SLOT(scroll_h_action(int)));
QObject::connect(
scroll_v, SIGNAL(sliderMoved(int)), this, SLOT(scroll_v_action(int)));
// These are needed to prevent QT from scrolling the ScrollArea.
QObject::connect( QObject::connect(
scroll_h, SIGNAL(valueChanged(int)), this, SLOT(scroll_h_action(int))); scroll_h, SIGNAL(valueChanged(int)), this, SLOT(scroll_h_released(int)));
QObject::connect( QObject::connect(
scroll_v, SIGNAL(valueChanged(int)), this, SLOT(scroll_v_action(int))); scroll_v, SIGNAL(valueChanged(int)), this, SLOT(scroll_v_released(int)));
*/
form->setWidget(this); form->setWidget(this);
form->setWidgetResizable(true); form->setWidgetResizable(true);
...@@ -119,31 +129,28 @@ void QtScrollWidgetGlow::scroll_callback_cb() ...@@ -119,31 +129,28 @@ void QtScrollWidgetGlow::scroll_callback_cb()
scroll_timerid->stop(); scroll_timerid->stop();
if (data->total_width <= data->window_width) { if (data->offset_x == 0 && data->total_width <= data->window_width) {
if (data->offset_x == 0) { data->total_width = data->window_width;
data->total_width = data->window_width;
}
if (scroll_data->scroll_h_managed) { if (scroll_data->scroll_h_managed) {
// Remove horizontal scrollbar form->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
} }
} else { } else {
if (!scroll_data->scroll_h_managed) { if (scroll_data->scroll_h_managed) {
// Insert horizontal scrollbar form->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
} }
} }
if (data->total_height <= data->window_height) { if (data->offset_y == 0 && data->total_height <= data->window_height) {
if (data->offset_y == 0) { data->total_height = data->window_height;
data->total_height = data->window_height;
}
if (scroll_data->scroll_v_managed) { if (scroll_data->scroll_v_managed) {
// Remove vertical scrollbar form->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
} }
} else { } else {
if (!scroll_data->scroll_v_managed) { if (scroll_data->scroll_v_managed) {
// Insert vertical scrollbar form->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
} }
} }
if (data->offset_x < 0) { if (data->offset_x < 0) {
data->total_width += -data->offset_x; data->total_width += -data->offset_x;
data->offset_x = 0; data->offset_x = 0;
...@@ -166,57 +173,51 @@ void QtScrollWidgetGlow::scroll_callback_cb() ...@@ -166,57 +173,51 @@ void QtScrollWidgetGlow::scroll_callback_cb()
} }
if (scroll_data->scroll_h_managed) { if (scroll_data->scroll_h_managed) {
scroll_h_ignore = 1; if (data->window_width != scroll_h->pageStep()
if (data->window_width != scroll_h_pagesize || data->total_width != scroll_h->maximum() || scroll_configure) {
|| data->total_width != scroll_h_upper || scroll_configure) { scroll_h->setMaximum(data->total_width - data->window_width);
scroll_data->scroll_h->setMaximum(data->total_width); scroll_h->setPageStep(data->window_width);
scroll_data->scroll_h->setPageStep(data->window_width);
} }
scroll_data->scroll_h->setSliderPosition(data->offset_x); scroll_h->setSliderPosition(data->offset_x);
scroll_h_value = data->offset_x;
scroll_h_pagesize = data->window_width;
scroll_h_upper = data->total_width;
} }
if (scroll_data->scroll_v_managed) { if (scroll_data->scroll_v_managed) {
scroll_v_ignore = 1; if (data->window_height != scroll_v->pageStep()
if (data->window_height != scroll_v_pagesize || data->total_height != scroll_v->maximum() || scroll_configure) {
|| data->total_height != scroll_v_upper || scroll_configure) { scroll_v->setMaximum(data->total_height - data->window_height);
scroll_data->scroll_v->setMaximum(data->total_height); scroll_v->setPageStep(data->window_height);
scroll_data->scroll_v->setPageStep(data->window_height);
} }
scroll_data->scroll_v->setSliderPosition(data->offset_y); scroll_v->setSliderPosition(data->offset_y);
scroll_v_value = data->offset_y;
scroll_v_pagesize = data->window_height;
scroll_v_upper = data->total_height;
} }
scroll_configure = 0; scroll_configure = 0;
} }
void QtScrollWidgetGlow::scroll_h_action(int value) void QtScrollWidgetGlow::scroll_h_action(int value)
{ {
if (scroll_h_ignore) {
scroll_h_ignore = 0;
return;
}
scroll_h_value = value;
GlowCtx* ctx = (GlowCtx*)parent_ctx; GlowCtx* ctx = (GlowCtx*)parent_ctx;
glow_scroll_horizontal(ctx, value, 0); glow_scroll_horizontal(ctx, value, 0);
} }
void QtScrollWidgetGlow::scroll_v_action(int value) void QtScrollWidgetGlow::scroll_h_released(int value)
{ {
if (scroll_v_ignore) { // Prevent QT from scrolling the ScrollArea by setting the value to 0.
scroll_v_ignore = 0; scroll_h->setValue(0);
return; scroll_h->setSliderPosition(value);
} }
scroll_v_value = value; void QtScrollWidgetGlow::scroll_v_action(int value)
{
GlowCtx* ctx = (GlowCtx*)parent_ctx; GlowCtx* ctx = (GlowCtx*)parent_ctx;
glow_scroll_vertical(ctx, value, 0); glow_scroll_vertical(ctx, value, 0);
} }
void QtScrollWidgetGlow::scroll_v_released(int value)
{
// Prevent QT from scrolling the ScrollArea by setting the value to 0.
scroll_v->setValue(0);
scroll_v->setSliderPosition(value);
}
void QtScrollWidgetGlow::paintEvent(QPaintEvent* event) void QtScrollWidgetGlow::paintEvent(QPaintEvent* event)
{ {
QPainter painter(this); QPainter painter(this);
......
...@@ -68,6 +68,8 @@ public: ...@@ -68,6 +68,8 @@ public:
int (*init_proc2)(QWidget* w, GlowCtx* ctx, void* client_data)); int (*init_proc2)(QWidget* w, GlowCtx* ctx, void* client_data));
void init(unsigned int eCtxType, QWidget* main); void init(unsigned int eCtxType, QWidget* main);
bool eventFilter(QObject *object, QEvent *event);
void* parent_ctx; void* parent_ctx;
GlowDrawQt* draw_ctx; GlowDrawQt* draw_ctx;
int (*init_proc)(GlowCtx* ctx, void* clien_data); int (*init_proc)(GlowCtx* ctx, void* clien_data);
...@@ -77,18 +79,11 @@ public: ...@@ -77,18 +79,11 @@ public:
QWidget* main_widget; QWidget* main_widget;
QScrollBar* scroll_h; QScrollBar* scroll_h;
QScrollBar* scroll_v; QScrollBar* scroll_v;
int scroll_h_ignore;
int scroll_v_ignore;
double scroll_h_value;
double scroll_v_value;
int scroll_h_pagesize;
int scroll_v_pagesize;
int scroll_h_upper;
int scroll_v_upper;
QTimer* scroll_timerid; QTimer* scroll_timerid;
glow_sScroll scroll_data; glow_sScroll scroll_data;
int scroll_configure; int scroll_configure;
int destroyed; int destroyed;
QScrollArea* form;
QImage image; QImage image;
...@@ -111,6 +106,8 @@ private: ...@@ -111,6 +106,8 @@ private:
public slots: public slots:
void scroll_h_action(int value); void scroll_h_action(int value);
void scroll_v_action(int value); void scroll_v_action(int value);
void scroll_h_released(int value);
void scroll_v_released(int value);
void scroll_callback_cb(); void scroll_callback_cb();
signals: signals:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment