r3039 - software/ui/src

Miriam Ruiz baby-guest at alioth.debian.org
Wed Jun 20 21:36:06 UTC 2007


Author: baby-guest
Date: 2007-06-20 21:36:06 +0000 (Wed, 20 Jun 2007)
New Revision: 3039

Modified:
   software/ui/src/games.cpp
   software/ui/src/pkgbrowser.cpp
   software/ui/src/pkgbrowser.h
   software/ui/src/ui.fld
Log:
Improved browser with multiple columns



Modified: software/ui/src/games.cpp
===================================================================
--- software/ui/src/games.cpp	2007-06-20 20:46:59 UTC (rev 3038)
+++ software/ui/src/games.cpp	2007-06-20 21:36:06 UTC (rev 3039)
@@ -150,8 +150,13 @@
 	ui.TypeSelection->add(_("Any type"), 0, NULL, VoidString, FL_NORMAL_LABEL);
 	ui.InterfaceSelection->clear();
 	ui.InterfaceSelection->add(_("Any interface"), 0, NULL, VoidString, FL_NORMAL_LABEL);
+
+	static int widths[] = { 100, 300, 0 }; // widths for each column
 	ui.ResultsBrowser->clear();
-	
+	ui.ResultsBrowser->column_widths(widths);
+	// tab delimited columns with colors
+	ui.ResultsBrowser->add("@B12 at C7@b at .PACKAGE\t at B12@C7 at b@.DESCRIPTION\t at B12@C7 at b@.POPCON");
+
 	// FIXME: there are better ways to remember the previous item
 	
 	const set<Tag> types = engine.types();
@@ -184,7 +189,7 @@
 	{
 		PackageRecord rec(engine.apt().rawRecord(i->name));
 		char* userData = pkgString(rec.package());
-		string desc = rec.package() + " - " + rec.shortDescription() + " *";
+		string desc = rec.package() + "\t" + rec.shortDescription() + "\t*";
 		int stars = (int)rintf(i->popcon * 4 / engine.popconLocalMax());
 		for (int j = 0; j < stars; ++j)
 			desc += '*';

Modified: software/ui/src/pkgbrowser.cpp
===================================================================
--- software/ui/src/pkgbrowser.cpp	2007-06-20 20:46:59 UTC (rev 3038)
+++ software/ui/src/pkgbrowser.cpp	2007-06-20 21:36:06 UTC (rev 3039)
@@ -21,18 +21,21 @@
 #include <stdio.h>
 
 PackageBrowser::PackageBrowser(int x, int y, int w, int h, const char *l)
-	: Fl_Browser(x, y, w, h, l)
+	: VersatileBrowser(x, y, w, h, l)
 {
+	showcolsep(1);
+	//colsepcolor(FL_RED);
+	column_char('\t'); // tabs as column delimiters
 }
 
 void PackageBrowser::item_select(void *p, int s)
 {
-	Fl_Browser::item_select(p, s);
+	VersatileBrowser::item_select(p, s);
 
 	if (s)
 	{
-		int n = Fl_Browser::lineno(p);
-		void *data = Fl_Browser::data(n);
+		int n = VersatileBrowser::lineno(p);
+		void *data = VersatileBrowser::data(n);
 		printf("  #%d : \"%s\"\n", n, (const char *)data);
 		fflush(stdout);
 	}
@@ -43,7 +46,7 @@
 //	printf("PackageBrowser::handle(int e = 0x%X)\n", e);
 //	fflush(stdout);
 
-	int ret = Fl_Browser::handle(e);
+	int ret = VersatileBrowser::handle(e);
 
 	switch(e)
 	{
@@ -90,50 +93,3 @@
 	}
 	return ret;
 }
-
-PackageViewer::PackageViewer(int X, int Y, int W, int H, const char *L)
-	: Fl_Scroll(X,Y,W,H,L), nchild(0)
-{
-	for ( int t=0; t<4; t++ ) { Add(); }
-}
-
-PackageViewer::Item::Item(int X, int Y, int W, int H, int FW, int DH, const char *L)
-	: Fl_Group(X, Y, W, H, L)
-{
-	// Green fixed width box
-	FixedBox = new Fl_Box(X, Y, FW, DH, "Fixed");
-	FixedBox->box(FL_UP_BOX);
-	FixedBox->color(FL_GREEN);
-	// Red stretchy box
-	StretchBox = new Fl_Box(X+FW, Y, W-FW, DH, "Stretch");
-	StretchBox->color(FL_BLUE);
-	StretchBox->box(FL_UP_BOX);
-	resizable(StretchBox);
-	end();
-}
-
-void PackageViewer::resize(int X, int Y, int W, int H)
-{
-	// Tell children to resize to our new width
-	for ( int t=0; t<children()-2; t++ )
-	{ // -2: skip scrollbars
-		Fl_Widget *w = child(t);
-		w->resize(w->x(), w->y(), W-20, w->h()); // W-20: leave room for scrollbar
-	}
-	// Tell scroll children changed in size
-	init_sizes();
-	Fl_Scroll::resize(X,Y,W,H);
-}
-
-void PackageViewer::Add()
-{
-	// Append new scrollitem to bottom
-	// Note: An Fl_Pack would be a good way to do this, too
-	int ix = x() + 1;
-	int iy = y() - yposition() + (nchild*25)+1;
-	int iw = w() - 20; // -20: compensate for vscroll bar
-	int ih = 25;
-	add(new Item(ix, iy, iw, ih, 50, 25));
-	redraw();
-	nchild++;
-}

Modified: software/ui/src/pkgbrowser.h
===================================================================
--- software/ui/src/pkgbrowser.h	2007-06-20 20:46:59 UTC (rev 3038)
+++ software/ui/src/pkgbrowser.h	2007-06-20 21:36:06 UTC (rev 3039)
@@ -1,6 +1,9 @@
 /*
  * Copyright (C) 2007  Miriam Ruiz <little_miry at yahoo.es>
  *
+ * VersatileBrowser based in code by Greg Ercolano <erco at seriss.com>
+ * URL: http://seriss.com/people/erco/fltk/
+ *
  * 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
@@ -22,9 +25,175 @@
 #include <stdlib.h>
 
 #include <FL/Fl.H>
+#include <FL/Fl_Double_Window.H>
 #include <FL/Fl_Browser.H>
+#include <FL/fl_draw.H>
+//
+// Demonstrate how to derive a class extending Fl_Browser with interactively resizable columns
+// erco 1.10 12/09/2005
+//
+class VersatileBrowser : public Fl_Browser
+{
+    Fl_Color  _colsepcolor;	// color of column separator lines 
+    int       _showcolsep;	// flag to enable drawing column separators
+    Fl_Cursor _last_cursor;	// saved cursor state info
+    int       _dragging;	// 1=user dragging a column
+    int       _dragcol;		// col# user is currently dragging
+    int      *_widths;		// pointer to user's width[] array
+    int       _nowidths[1];	// default width array (non-const)
+    // CHANGE CURSOR
+    //     Does nothing if cursor already set to value specified.
+    //
+    void change_cursor(Fl_Cursor newcursor) {
+        if ( newcursor != _last_cursor ) {
+            fl_cursor(newcursor, FL_BLACK, FL_WHITE);
+            _last_cursor = newcursor;
+        }
+    }
+    // RETURN THE COLUMN MOUSE IS 'NEAR'
+    //     Returns -1 if none.
+    //
+    int which_col_near_mouse() {
+        int X,Y,W,H;
+        Fl_Browser::bbox(X,Y,W,H);		// area inside browser's box()
+        // EVENT NOT INSIDE BROWSER AREA? (eg. on a scrollbar)
+        if ( ! Fl::event_inside(X,Y,W,H) ) {
+            return(-1);
+        }
+        int mousex = Fl::event_x() + hposition();
+        int colx = this->x();
+        for ( int t=0; _widths[t]; t++ ) {
+            colx += _widths[t];
+            int diff = mousex - colx;
+            // MOUSE 'NEAR' A COLUMN?
+	    //     Return column #
+	    //
+            if ( diff >= -4 && diff <= 4 ) {
+                return(t);
+            }
+        }
+        return(-1);
+    }
 
-class PackageBrowser : public Fl_Browser
+protected:
+    // MANAGE EVENTS TO HANDLE COLUMN RESIZING
+    int handle(int e) {
+	// Not showing column separators? Use default Fl_Browser::handle() logic
+	if ( ! showcolsep() ) return(Fl_Browser::handle(e));
+        // Handle column resizing
+        int ret = 0;
+        switch ( e ) {
+            case FL_ENTER: {
+                ret = 1;
+                break;
+            }
+            case FL_MOVE: {
+                if ( which_col_near_mouse() >= 0 ) {
+                    change_cursor(FL_CURSOR_WE);
+                } else {
+                    change_cursor(FL_CURSOR_DEFAULT);
+                }
+                ret = 1;
+                break;
+            }
+            case FL_PUSH: {
+                int whichcol = which_col_near_mouse();
+                if ( whichcol >= 0 ) {
+                    // CLICKED ON RESIZER? START DRAGGING
+                    ret = 1;
+                    _dragging = 1;
+                    _dragcol = whichcol;
+                    change_cursor(FL_CURSOR_DEFAULT);
+                }
+                break;
+            }
+            case FL_DRAG: {
+                if ( _dragging ) {
+                    ret = 1;
+		    // Sum up column widths to determine position
+                    int mousex = Fl::event_x() + hposition();
+                    int newwidth = mousex - x();
+                    for ( int t=0; _widths[t] && t<_dragcol; t++ ) {
+                        newwidth -= _widths[t];
+                    }
+                    if ( newwidth > 0 ) {
+			// Apply new width, redraw interface
+                        _widths[_dragcol] = newwidth;
+                        if ( _widths[_dragcol] < 2 ) {
+                            _widths[_dragcol] = 2;
+                        }
+                        redraw();
+                    }
+                }
+                break;
+            }
+            case FL_LEAVE:
+            case FL_RELEASE: {
+		_dragging = 0;				// disable drag mode
+                change_cursor(FL_CURSOR_DEFAULT);	// ensure normal cursor
+                ret = 1;
+                break;
+            }
+        }
+        if ( _dragging ) return(1);			// dragging? don't pass event to Fl_Browser
+	return(Fl_Browser::handle(e) ? 1 : ret);
+    }
+    void draw() {
+        // DRAW BROWSER
+        Fl_Browser::draw();
+        if ( _showcolsep ) {
+            // DRAW COLUMN SEPARATORS
+            int colx = this->x() - hposition();
+            int X,Y,W,H;
+            Fl_Browser::bbox(X,Y,W,H);
+            fl_color(_colsepcolor);
+            for ( int t=0; _widths[t]; t++ ) {
+                colx += _widths[t];
+                if ( colx > X && colx < (X+W) ) {
+                    fl_line(colx, Y, colx, Y+H-1);
+                }
+            }
+        }
+    }
+public:
+    // CTOR
+    VersatileBrowser(int X,int Y,int W,int H,const char*L=NULL) : Fl_Browser(X,Y,W,H,L) {
+        _colsepcolor = Fl_Color(FL_GRAY);
+        _last_cursor = FL_CURSOR_DEFAULT;
+        _showcolsep  = 0;
+        _dragging    = 0;
+        _nowidths[0] = 0;
+        _widths      = _nowidths;
+    }
+    // GET/SET COLUMN SEPARATOR LINE COLOR
+    Fl_Color colsepcolor() const {
+        return(_colsepcolor);
+    }
+    void colsepcolor(Fl_Color val) {
+        _colsepcolor = val;
+    }
+    // GET/SET DISPLAY OF COLUMN SEPARATOR LINES
+    //     1: show lines, 0: don't show lines
+    //
+    int showcolsep() const {
+        return(_showcolsep);
+    }
+    void showcolsep(int val) {
+        _showcolsep = val;
+    }
+    // GET/SET COLUMN WIDTHS ARRAY
+    //    Just like fltk method, but array is non-const.
+    //
+    int *column_widths() const {
+        return(_widths);
+    }
+    void column_widths(int *val) {
+        _widths = val;
+        Fl_Browser::column_widths(val);
+    }
+};
+
+class PackageBrowser : public VersatileBrowser
 {
 public:
 	PackageBrowser(int x, int y, int w, int h, const char *l = NULL);
@@ -34,30 +203,4 @@
 	virtual int handle(int e);
 };
 
-#include <FL/Fl.H>
-#include <FL/Fl_Double_Window.H>
-#include <FL/Fl_Group.H>
-#include <FL/Fl_Scroll.H>
-#include <FL/Fl_Button.H>
-#include <FL/Fl_Box.H>
-
-class PackageViewer : public Fl_Scroll {
-public:
-	class Item : public Fl_Group
-	{
-		private:
-			Fl_Box* FixedBox;
-			Fl_Box* StretchBox;
-		public:
-			Item(int X, int Y, int W, int H, int FW, int DH, const char* L = NULL);
-	};
-
-	PackageViewer(int X, int Y, int W, int H, const char* L = NULL);
-	void resize(int X, int Y, int W, int H);
-	void Add();
-
-private:
-	int nchild;
-};
-
 #endif

Modified: software/ui/src/ui.fld
===================================================================
--- software/ui/src/ui.fld	2007-06-20 20:46:59 UTC (rev 3038)
+++ software/ui/src/ui.fld	2007-06-20 21:36:06 UTC (rev 3039)
@@ -16,7 +16,7 @@
   Function {CreateMainWindow()} {open
   } {
     Fl_Window {} {open
-      xywh {598 111 385 430} type Double resizable visible
+      xywh {633 58 385 430} type Double resizable visible
     } {
       Fl_Group {} {open
         xywh {5 14 375 139} box UP_FRAME




More information about the Pkg-games-commits mailing list