summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Suhr Christensen <jsc@umbraculum.org>2014-11-05 14:39:44 +0100
committerJonas Suhr Christensen <jsc@umbraculum.org>2014-11-05 14:39:44 +0100
commit2deeb15d4de7d3747f1d65637f429cedf794cd35 (patch)
tree1fef222dc777967c1a9502849c9fe7245213b00a
parentf9fe5f987f8ac1a4f1df6cd38c866b6c6cf461bb (diff)
Added scrollbar.
-rw-r--r--plugingui/plugingui.cc5
-rw-r--r--plugingui/textedit.cc100
-rw-r--r--plugingui/textedit.h18
3 files changed, 85 insertions, 38 deletions
diff --git a/plugingui/plugingui.cc b/plugingui/plugingui.cc
index df357e0..cafc67e 100644
--- a/plugingui/plugingui.cc
+++ b/plugingui/plugingui.cc
@@ -512,9 +512,10 @@ void PluginGUI::init()
*/
drumkitinfo = new GUI::TextEdit(window);
-// drumkitinfo->setText("Hello World\ten\tto\ttre fire fem seks syv otte ni ti elleve tolv tretten\n\nHej med dig jeg har lavet dette widget og det opfører sig egentlig ganske fint\n\n\nni \n\nti elleve tolv \n\nTEST TEST TEST@\n\ntretten fjorten femten \n\nseksten sytten atten nitten \nHello World\nHello World\n");
drumkitinfo->move(370, 25);
- drumkitinfo->resize(300, 300);
+ drumkitinfo->resize(288, 292);
+ drumkitinfo->setText("Hello World\ten\tto\ttre fire fem seks syv otte ni ti elleve tolv tretten\n\nHej med dig jeg har lavet dette widget og det opfører sig egentlig ganske fint\n\n\nni \n\nti elleve tolv \n\nTEST TEST TEST@\n\ntretten fjorten femten \n\nseksten sytten atten nitten \nHello World\nHello World\naaaaaaa\nbbbbbbbbb\ncccccccccc\ndddddddd\neeeeeeeee\nfffffffffff\nggggggggg\nasdasdasdasd\nasd\n");
+// drumkitinfo->setText("Hello World\n1111\n2222\n");
// Create filebrowser
diff --git a/plugingui/textedit.cc b/plugingui/textedit.cc
index 43be7aa..73303f7 100644
--- a/plugingui/textedit.cc
+++ b/plugingui/textedit.cc
@@ -38,12 +38,22 @@
#define BORDER 10
+static void scrolled(void *ptr)
+{
+ GUI::TextEdit *l = (GUI::TextEdit *)ptr;
+ l->repaintEvent(NULL);
+}
+
GUI::TextEdit::TextEdit(Widget *parent)
- : GUI::Widget(parent)
+ : GUI::Widget(parent), scroll(this)
{
pos = 0;
setReadOnly(true);
+ scroll.move(width()-5,1);
+ scroll.resize(20, 100);
+ scroll.registerValueChangeHandler(scrolled, this);
+
box.topLeft = new Image(":widget_tl.png");
box.top = new Image(":widget_t.png");
box.topRight = new Image(":widget_tr.png");
@@ -57,10 +67,11 @@ GUI::TextEdit::TextEdit(Widget *parent)
handler = NULL;
}
-void GUI::TextEdit::registerEnterPressedHandler(void (*handler)(void *), void *ptr)
+void GUI::TextEdit::resize(int height, int width)
{
- this->handler = handler;
- this->ptr = ptr;
+ Widget::resize(height, width);
+ scroll.resize(scroll.width(), height-10);
+ scroll.move(width-30,7);
}
void GUI::TextEdit::setReadOnly(bool ro)
@@ -76,6 +87,12 @@ bool GUI::TextEdit::readOnly()
void GUI::TextEdit::setText(std::string text)
{
_text = text;
+ preprocessText();
+ int ran = height() / font.textHeight();
+ DEBUG(textedit, "Setting range and max of scrollbar"
+ " to '%d' and '%d'\n", ran, preprocessedtext.size());
+ scroll.setRange(ran);
+ scroll.setMaximum(preprocessedtext.size());
repaintEvent(NULL);
textChanged();
}
@@ -85,29 +102,19 @@ std::string GUI::TextEdit::text()
return _text;
}
-void GUI::TextEdit::buttonEvent(ButtonEvent *e)
-{
- if(readOnly()) return;
-}
+//void GUI::TextEdit::buttonEvent(ButtonEvent *e)
+//{
+// if(readOnly()) return;
+//}
-void GUI::TextEdit::keyEvent(GUI::KeyEvent *e)
-{
- if(readOnly()) return;
-}
+//void GUI::TextEdit::keyEvent(GUI::KeyEvent *e)
+//{
+// if(readOnly()) return;
+//}
-void GUI::TextEdit::repaintEvent(GUI::RepaintEvent *e)
+void GUI::TextEdit::preprocessText()
{
- Painter p(this);
-
- p.clear();
-
- int w = width();
- int h = height();
- if(w == 0 || h == 0) return;
- p.drawBox(0, 0, &box, w, h);
-
- p.setColour(GUI::Colour(183.0/255.0, 219.0/255.0 , 255.0/255.0, 1));
-
+ preprocessedtext.clear();
std::string text = _text;
{ // Handle tan characters
@@ -131,27 +138,58 @@ void GUI::TextEdit::repaintEvent(GUI::RepaintEvent *e)
while(pos != std::string::npos);
}
- { // Draw and wrap long lines
- int ypos = font.textHeight() + 5 + 1 + 1 + 1;
+ { // Wrap long lines
std::list<std::string>::iterator it;
for(it = lines.begin(); it != lines.end(); it++) {
std::string line = *it;
for(size_t i = 0; i < line.length(); i++) {
size_t linewidth = font.textWidth(line.substr(0, i));
- if(linewidth >= width() - BORDER - 4 + 3 - 10) {
- p.drawText(BORDER - 4 + 3, ypos, font, line.substr(0, i));
- ypos += font.textHeight();
+ if(linewidth >= width() - BORDER - 4 + 3 - 10 - scroll.width()) {
+ preprocessedtext.push_back(line.substr(0, i));
line = line.substr(i);
i = 0;
}
}
- p.drawText(BORDER - 4 + 3, ypos, font, line);
- ypos += font.textHeight();
+ preprocessedtext.push_back(line);
}
}
}
+void GUI::TextEdit::repaintEvent(GUI::RepaintEvent *e)
+{
+ Painter p(this);
+
+ p.clear();
+
+ int w = width();
+ int h = height();
+ if(w == 0 || h == 0) return;
+ p.drawBox(0, 0, &box, w, h);
+
+ p.setColour(GUI::Colour(183.0/255.0, 219.0/255.0 , 255.0/255.0, 1));
+
+ int skip = scroll.value();
+
+ int ypos = font.textHeight() + 5 + 1 + 1 + 1;
+ std::list<std::string>::iterator it;
+ it = preprocessedtext.begin();
+
+ int c = 0;
+ for( ; c < skip; c++) {
+ it++;
+ }
+
+ c = 0;
+ for( ; it != preprocessedtext.end(); it++) {
+ if(c * font.textHeight() >= height() - 8 - font.textHeight()) break;
+ std::string line = *it;
+ p.drawText(BORDER - 4 + 3, ypos, font, line);
+ ypos += font.textHeight();
+ c++;
+ }
+}
+
#ifdef TEST_TEXTEDIT
//Additional dependency files
//deps:
diff --git a/plugingui/textedit.h b/plugingui/textedit.h
index e26a88c..3f27575 100644
--- a/plugingui/textedit.h
+++ b/plugingui/textedit.h
@@ -27,12 +27,14 @@
#ifndef __DRUMGIZMO_TEXTEDIT_H__
#define __DRUMGIZMO_TEXTEDIT_H__
-
#include <string>
+#include <list>
+
#include "widget.h"
#include "font.h"
#include "painter.h"
+#include "scrollbar.h"
namespace GUI {
@@ -48,25 +50,31 @@ public:
void setReadOnly(bool readonly);
bool readOnly();
- void registerEnterPressedHandler(void (*handler)(void *), void *ptr);
+ void resize(int width, int height);
+
+
+ void preprocessText();
//protected:
- virtual void keyEvent(KeyEvent *e);
+// virtual void keyEvent(KeyEvent *e);
virtual void repaintEvent(RepaintEvent *e);
- virtual void buttonEvent(ButtonEvent *e);
+// virtual void buttonEvent(ButtonEvent *e);
protected:
virtual void textChanged() {}
private:
Painter::Box box;
-
+ ScrollBar scroll;
Font font;
std::string _text;
size_t pos;
bool readonly;
+
+ std::list< std::string > preprocessedtext;
+// size_t numoflines;
void (*handler)(void *);
void *ptr;