summaryrefslogtreecommitdiff
path: root/src/islider.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/islider.cpp')
-rw-r--r--src/islider.cpp199
1 files changed, 199 insertions, 0 deletions
diff --git a/src/islider.cpp b/src/islider.cpp
new file mode 100644
index 0000000..965dc4d
--- /dev/null
+++ b/src/islider.cpp
@@ -0,0 +1,199 @@
+/**************************************************************************\
+ ibtk (Insomnia's Basic ToolKit)
+
+ By Insomnia (Steaphan Greene)
+ (insomnia@core.binghamton.edu)
+
+ Copyright (C) 1999 Steaphan Greene
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+
+\**************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+
+#include "islider.h"
+
+ISlider::~ISlider() {
+ Win->RemoveClaim(this);
+ }
+
+ISlider::ISlider(char *t, IWindow *w, int xp, int yp, int xs, int ys) {
+ Init(t, w, xp, yp, xs, ys);
+ }
+
+void ISlider::Init(char *t, IWindow *w, int xp, int yp, int xs, int ys) {
+ changecallback = NULL;
+ text = new char[strlen(t)+2];
+ sprintf(text, "%s%c", t, 0);
+ value = 0;
+ min = 0;
+ max = 101;
+ xpos = xp; ypos = yp; xsize = xs; ysize = ys;
+ Win = w;
+ Window wind = w->GetWindowBuffer();
+ Display *disp = w->GetDisplay();
+ unsigned int s, p, b, g, gl, gd;
+
+ Img[0] = XCreatePixmap(disp, wind, xs, ys, DefaultDepth(disp, 0));
+ Img[1] = XCreatePixmap(disp, wind, xs, ys, DefaultDepth(disp, 0));
+
+ GC gc = Win->GetGC();
+
+// printf("Depth = %d\n", DefaultDepth(disp, 0));
+
+ s = w->GetSelectColor();
+ p = w->GetPaperColor();
+ b = w->GetFGColor();
+ g = w->GetBGColor();
+ gl = w->GetLBGColor();
+ gd = w->GetDBGColor();
+
+ XSetForeground(disp, gc, gl);
+ XFillRectangle(disp, Img[0], gc, 0, 0, xs, ys);
+ XFillRectangle(disp, Img[1], gc, 0, 0, xs, ys);
+
+ XSetForeground(disp, gc, g);
+ XFillRectangle(disp, Img[0], gc, 2, 2, xs-4, ys-4);
+ XFillRectangle(disp, Img[1], gc, 2, 2, xs-4, ys-4);
+
+ XSetForeground(disp, gc, gd);
+ XFillRectangle(disp, Img[0], gc, 0, 0, xs-1, 2);
+ XFillRectangle(disp, Img[0], gc, 0, 2, 2, ys-3);
+ XDrawPoint(disp, Img[0], gc, 0, ys-1);
+ XDrawPoint(disp, Img[0], gc, xs-1, 0);
+ XFillRectangle(disp, Img[1], gc, 0, 0, xs-1, 2);
+ XFillRectangle(disp, Img[1], gc, 0, 2, 2, ys-3);
+ XDrawPoint(disp, Img[1], gc, 0, ys-1);
+ XDrawPoint(disp, Img[1], gc, xs-1, 0);
+
+ disabled = 0;
+ parent=NULL;
+
+ w->AddClaim(this, xp, yp, xs, ys);
+
+ Rebuild();
+ }
+
+void ISlider::Redraw() {
+ if(hidden) { Win->Rebuild(xpos, ypos, xsize, ysize); return; }
+
+ XCopyArea(Win->GetDisplay(), Img[disabled], Win->GetWindowBuffer(), Win->GetGC(),
+ 0, 0, xsize, ysize, xpos, ypos);
+ Win->Redraw(xpos, ypos, xsize, ysize);
+ }
+
+void ISlider::Rebuild() {
+ Window w = Win->GetWindowBuffer();
+ Display *disp = Win->GetDisplay();
+ GC gc = Win->GetGC();
+ char txt[256];
+ if(max > min && value >= min)
+ sprintf(txt, "%s%d%c", text, value, 0);
+ XFontStruct *fs;
+ XCharStruct cs;
+ int dir, as, des;
+ fs = Win->GetFontStruct();
+ XTextExtents(fs, txt, strlen(txt), &dir, &as, &des, &cs);
+ int len = cs.width;
+
+ // Enabled
+ XSetForeground(disp, gc, Win->GetBGColor());
+ XFillRectangle(disp, Img[0], gc, 2, 2, xsize-4, ysize-4);
+
+ // Disabled
+ XSetForeground(disp, gc, Win->GetLBGColor());
+ XFillRectangle(disp, Img[1], gc, 2, 2, xsize-4, ysize-4);
+
+ // Enabled
+ XSetBackground(disp, gc, Win->GetBGColor());
+ XSetForeground(disp, gc, Win->GetFGColor());
+ XDrawImageString(disp, Img[0], gc, (xsize-(len-1))>>1,
+ (ysize+ysize-(as+des-2))>>1, txt, strlen(txt));
+
+ // Disabled
+ XSetBackground(disp, gc, Win->GetLBGColor());
+ XSetForeground(disp, gc, Win->GetDBGColor());
+ XDrawImageString(disp, Img[1], gc, (xsize-(len-1))>>1,
+ (ysize+ysize-(as+des-2))>>1, txt, strlen(txt));
+
+
+
+ if(max > min && (((value-min)*(xsize-4))/(max-min)) > 0) {
+ int xbar = (xsize-4) <? (((value-min)*(xsize-4))/(max-min));
+ Wrk[0] = XCreatePixmap(disp, w, xbar, ysize-4, DefaultDepth(disp, 0));
+ Wrk[1] = XCreatePixmap(disp, w, xbar, ysize-4, DefaultDepth(disp, 0));
+
+ // Enabled
+ XSetForeground(disp, gc, Win->GetSelectColor());
+ XFillRectangle(disp, Wrk[0], gc, 0, 0, xbar, ysize-4);
+ XSetForeground(disp, gc, Win->GetPaperColor());
+ XSetBackground(disp, gc, Win->GetSelectColor());
+ XDrawImageString(disp, Wrk[0], gc, ((xsize-(len-1))>>1)-2,
+ ((ysize+ysize-(as+des-2))>>1)-2, txt, strlen(txt));
+
+ // Disabled
+ XSetForeground(disp, gc, Win->GetBGColor());
+ XFillRectangle(disp, Wrk[1], gc, 0, 0, xbar, ysize-4);
+ XSetForeground(disp, gc, Win->GetDBGColor());
+ XSetBackground(disp, gc, Win->GetBGColor());
+ XDrawImageString(disp, Wrk[1], gc, ((xsize-(len-1))>>1)-2,
+ ((ysize+ysize-(as+des-2))>>1)-2, txt, strlen(txt));
+
+ XCopyArea(disp, Wrk[disabled], Img[disabled], gc, 0, 0, xbar, ysize-4, 2, 2);
+ XFreePixmap(disp, Wrk[0]);
+ XFreePixmap(disp, Wrk[1]);
+ }
+ Redraw();
+ if(!hidden) Win->Rebuild(xpos, ypos, xsize, ysize);
+ }
+
+int ISlider::Drag(int x, int y) {
+ if(disabled) return 0;
+ Press(1, x, y);
+ return 1;
+ }
+
+int ISlider::Press(int b, int x, int y) {
+ if(disabled) return 0;
+ if(x<2) x=2;
+ if(x>xsize-2) x=xsize-2;
+ value = x-2;
+ value *= (max-min);
+ value /= (xsize-4);
+ value += min;
+ SetValue(value);
+ return 1;
+ }
+
+void ISlider::SetChangeCallback(void (*cb)(IDoDad *, IDoDad *, int)) {
+ changecallback = cb;
+ if(changecallback != NULL) (*changecallback)(parent, this, value);
+ }
+
+void ISlider::SetValue(int v) {
+ if(disabled) return;
+ value = v;
+ if(value>max) value=max;
+ if(value<min) value=min;
+ Rebuild();
+ if(changecallback != NULL) (*changecallback)(parent, this, value);
+ }
+
+void ISlider::Enable() {
+ disabled = 0;
+ Rebuild();
+ }
+
+void ISlider::Disable() {
+ disabled = 1;
+ Rebuild();
+ }