Display Table data from a csv and return the rowID when the user clicks on a row

I want to display some of the columns from a Table object (it is loaded from a csv file) and then retrieve the row of information when the user clicks on the row. I do not see a “native” mechanism to do this in processing…

1 Like

// shows a table
//    on mouse over: status bar text 
//    on mouse click: Info box

// class with tools 
ToolsForTable toolsForTable = new ToolsForTable(); 

// the table
Table tableResources; 

//----------------------------------------------------------------------------------------------------------------

void setup() {
  size(1600, 660);
  background(toolsForTable.WHITE);

  // setting up table ---
  setupTable();
}

void draw() {
  background(0); 
  toolsForTable.showTable(tableResources, 
    20, 52);

  fill(toolsForTable.WHITE);
  text("The Settlers of Catan - Building Costs", 
    20, 27);
  text("Place the mouse over a word to show full text in the Status Bar. Click to show Info Box. ", 
    20, height/2-110);
}

//----------------------------------------------------------------------------------------------------------------

void setupTable() { 
  // Make entire table 

  // setting up table (column names / headlines) ---
  tableResources = toolsForTable.newTable("Item", "brick", "wood", "sheep", "wheat", "ore", "points");

  // adding data (number of data must match number of headlines)
  println("Adding Road row");   
  tableResources = toolsForTable.tableAddDataAsNewRow ( tableResources, "Road (establishing the longest road: 2 victory points)", "1x", "1x", "", "", "", "0" );
  if (tableResources==null)
    return; 

  println("Adding Settlement row");   
  tableResources = toolsForTable.tableAddDataAsNewRow ( tableResources, "Settlement. Players with a settlement adjacent to a hex containing the number just rolled with the dice receive one card of the corresponding resource.", "1x", "1x", "1x", "1x", "", "1" );  
  if (tableResources==null)
    return; 

  println("Adding City row");   
  tableResources = toolsForTable.tableAddDataAsNewRow ( tableResources, "City (which must replace existing settlement). Cities produce two cards of the corresponding resource.", "", "", "", "2x", "3x", "2");
  if (tableResources==null)
    return; 

  println("Adding 'Development Card' row");   
  String textDevelopmentCard = 
    "Development Card - Three types of development cards include cards worth one victory point; "
    +"knight cards, which allow the player to move the robber as if they had rolled a 7 (but without the remove-half rule); "
    +"and a third set of cards which allow the player one of three abilities when played.";
  tableResources = toolsForTable.tableAddDataAsNewRow ( tableResources, textDevelopmentCard, 
    "", "", "1x", "1x", "1x", "?"  );  
  if (tableResources==null)
    return; 
  //
}

// ------------------------------------------------------------------------------

void mousePressed() {
  // use class: 
  toolsForTable.mousePressedInClass(tableResources);
}//func 

void keyPressed() {
  key=0; // kill ESC 

  // use class: 
  toolsForTable.flagShowInfoBox=false;
}

//===============================================================================
// Tools collection 

class ToolsForTable {

  // class not like a car class Car for an object but a collection of tools. 

  final color RED   = color(255, 0, 0); 
  final color GREEN = color(0, 255, 0); 
  final color BLUE  = color(0, 0, 255); 

  final color WHITE = color(255); 
  final color BLACK = color(0); 
  final color GRAY  = color(255/2); 

  final color YELLOW  = color(255, 255, 13); 

  int factorX=122; // column width 

  boolean cursorSignShowFlag=false; 

  // show Info box?
  boolean flagShowInfoBox=false;
  int flagShowInfoBox_Row=0; 

  // ----------------------------------------------------------------

  void showTable(Table tableBtn, 
    int x, int y) { 

    //  int factorX=122; // column width 

    // rect
    stroke(WHITE);
    noFill();
    rect( x, y, 
      tableBtn.getColumnCount()*factorX-6, (tableBtn.getRowCount()+1) * 22 + 10 );

    // headline 
    showTableHeadline(tableBtn, x+6, y+19, factorX);

    // horizontal line 
    stroke(WHITE);
    line( x+2, y+5+19, 
      6+x+(tableBtn.getColumnCount())*factorX-13, y+5+19);

    // grid 
    // loop over rows (y)
    for (int i=0; i<tableBtn.getRowCount(); i++) {

      // current data row
      TableRow row = tableBtn.getRow(i);

      // loop over columns in that row (i2 is for x) 
      for (int i2=0; i2<tableBtn.getColumnCount(); i2++) {

        fill(WHITE);
        text(row.getString(i2), 
          i2*factorX+x+6, 25+ i * 22 +y+8, 
          factorX-8, 15);

        if (mouseInside(i2*factorX+x+6, 25+ i * 22 +y+8, 
          factorX-8, 15)) {
          statusBar(row.getString(i2));
        }//if

        // vertical line 
        stroke(WHITE);
        line( i2*factorX+x, +y, 
          i2*factorX+x, tableBtn.getRowCount() * 22 + y + 31);
      }//for
    }//for

    showInfoBox(tableBtn);
  }// method

  void showInfoBox(Table tableBtn) {
    // abort? 
    if (!flagShowInfoBox)
      return; 

    // current data row
    TableRow row = tableBtn.getRow(flagShowInfoBox_Row);

    String builtText=""; 

    // loop over columns in that row (i2 is for x) 
    for (int i2=0; i2<tableBtn.getColumnCount(); i2++) {
      builtText+=row.getString(i2) + "\n";
    }//for

    // Yellow box
    fill(YELLOW);
    rect(width-212, 25 +33+8-6, 
      190, 400);
    // box frame
    noFill(); 
    stroke(BLACK);
    final int innerDist=4; 
    rect(width-212+innerDist, 25 +33+8-6+innerDist, 
      190-innerDist*2, 400-innerDist*2);

    // Text
    fill(BLACK);
    text(builtText, 
      width-200, 25 +33+8, 
      180, 915);
  }//method

  void mousePressedInClass(Table tableBtn) {
    //
    int x=22;
    int y=52;

    flagShowInfoBox=false;

    // loop over rows (y)
    for (int i=0; i<tableBtn.getRowCount(); i++) {

      // current data row
      TableRow row = tableBtn.getRow(i);

      //// loop over columns in that row (i2 is for x) 
      //for (int i2=0; i2<tableBtn.getColumnCount(); i2++) {

      if (mouseInsideRow(0, 25+ i * 22 +y+8, 
        factorX-8, 15)) {
        // statusBar(row.getString(i2));
        flagShowInfoBox=true; 
        flagShowInfoBox_Row = i; 
        return;
      }//if
      //   }
    }
  }

  // ---

  boolean mouseInsideRow( float x_, float y_, 
    float w_, float h_) {
    return 
      mouseY>y_ &&
      mouseY<y_+h_;
  }//func

  boolean mouseInside( float x_, float y_, 
    float w_, float h_) {
    return mouseX>x_ &&
      mouseX<x_+w_ &&
      mouseY>y_ &&
      mouseY<y_+h_;
  }//func

  // ---

  void statusBar(String textStatus) {
    if (textStatus.equals(""))
      return;

    fill(GRAY); 
    noStroke(); 
    rect(0, height-32, 
      width, 33);
    fill(WHITE); 
    text (textStatus, 
      3, height-12);
  }//func 

  void showTableHeadline(Table tableBtn, 
    int x, int y, 
    int factorX) { 
    // headline for table 
    TableRow row0 = tableBtn.getRow(0);
    for (int i=0; i<tableBtn.getColumnCount(); i++) {
      // headline 
      fill(GREEN);
      text(row0.getColumnTitle(i), 
        i*factorX+x, y-2);
    }
  }//method 

  // ---
  // make table 

  Table newTable (String... listColumnNames) { 

    Table newT = new Table();

    // make columns
    for (String s1 : listColumnNames) {
      newT.addColumn(s1);
    }

    return newT;
  }//method

  Table tableAddDataAsNewRow(Table table1, String... data1) {
    //
    //println(data1.length);
    //println(table1.getColumnCount());

    if (data1.length != table1.getColumnCount()) {
      // 
      println("Big Error: "+"tableAddData says: the number of values doesn't match the number of columns (values were: "
        +stringFromArray(data1)+").");
      exit();
      return null;
    }

    // add rows with data 
    TableRow newRow = table1.addRow();

    // add rows with data 
    int i=0; 
    for (String s1 : data1) {
      newRow.setString(newRow.getColumnTitle(i), s1);
      i++;
    }

    // return result 
    return table1;
  }//method

  // --- 

  String stringFromArray(String... data1) {
    String result=" | "; 

    for (String s1 : data1) {
      result += s1+" | ";
    }//for

    return result;
  }//method

  void printlnTable(Table tableBtn) { 

    // rect
    stroke(WHITE);
    noFill();

    println("------------------------------------");

    // headline 
    printlnTableHeadline(tableBtn);

    // grid 
    // loop over rows (y)
    for (int i=0; i<tableBtn.getRowCount(); i++) {

      // current data row
      TableRow row = tableBtn.getRow(i);

      // loop over columns in that row (i2 is for x)
      String s1="";
      for (int i2=0; i2<tableBtn.getColumnCount(); i2++) {
        s1+="   "+row.getString(i2);
        //
      }//for
      println(s1);
    }//for
    println("===========================================");
    //
  } // method 

  void printlnTableHeadline(Table tableBtn ) { 
    // headline for table 
    TableRow row0 = tableBtn.getRow(0);
    for (int i=0; i<tableBtn.getColumnCount(); i++) {
      // headline 
      print("   "+row0.getColumnTitle(i));
    }
    println("");
  }//method 

  // ------------------------------------------------------------------

  String cursorSign() {
    // blinking cursor sign | for Input Box 
    if (frameCount % 13 == 0)
      cursorSignShowFlag= ! cursorSignShowFlag;
    if (cursorSignShowFlag)
      return"|";
    else return"";
  }//method
  //
}//class
//

2 Likes

Hi @TEACHMYSTERY @Chrisir
Have you also considered other options than processing ? While it can be done with Processing there are certainly better options for that kind of application. Depending on your objectives you’re are going to face other challenges down the road.

This is for a beginning student project where they are making a song player. I wanted to build in some data concepts at the end. It does not need to be robust, but I’d like them to build a Song class and apply a linear search algorithm…

1 Like

This looks perfect - I will post again later in the school year once I have implemented. Thank you!!

1 Like