Ejemplo n.º 1
0
static VALUE
rbclt_model_filter_iter (VALUE self, VALUE iter)
{
    return clutter_model_filter_iter (CLUTTER_MODEL (RVAL2GOBJ (self)),
                                      CLUTTER_MODEL_ITER (RVAL2GOBJ (iter)))
           ? Qtrue : Qfalse;
}
Ejemplo n.º 2
0
static gboolean
clutter_list_model_iter_is_last (ClutterModelIter *iter)
{
  ClutterListModelIter *iter_default;
  ClutterModelIter *temp_iter;
  ClutterModel *model;
  GSequence *sequence;
  GSequenceIter *begin, *end;

  iter_default = CLUTTER_LIST_MODEL_ITER (iter);
  g_assert (iter_default->seq_iter != NULL);

  if (g_sequence_iter_is_end (iter_default->seq_iter))
    return TRUE;

  model = clutter_model_iter_get_model (iter);

  sequence = CLUTTER_LIST_MODEL (model)->priv->sequence;

  begin = g_sequence_get_end_iter (sequence);
  begin = g_sequence_iter_prev (begin);
  end   = iter_default->seq_iter;

  temp_iter = CLUTTER_LIST_MODEL (model)->priv->temp_iter;

  while (!g_sequence_iter_is_begin (begin))
    {
      CLUTTER_LIST_MODEL_ITER (temp_iter)->seq_iter = begin;

      if (clutter_model_filter_iter (model, temp_iter))
        {
          end = begin;
          break;
        }

      begin = g_sequence_iter_prev (begin);
    }

  /* This is because the 'end_iter' is always *after* the last valid iter.
   * Otherwise we'd have endless loops 
   */
  end = g_sequence_iter_next (end);

  return iter_default->seq_iter == end;
}
Ejemplo n.º 3
0
static ClutterModelIter *
clutter_list_model_iter_prev (ClutterModelIter *iter)
{
  ClutterListModelIter *iter_default;
  ClutterModelIter *temp_iter;
  ClutterModel *model;
  GSequenceIter *filter_prev;
  guint row;

  iter_default = CLUTTER_LIST_MODEL_ITER (iter);
  g_assert (iter_default->seq_iter != NULL);

  model = clutter_model_iter_get_model (iter);
  row   = clutter_model_iter_get_row (iter);

  filter_prev = g_sequence_iter_prev (iter_default->seq_iter);
  g_assert (filter_prev != NULL);

  temp_iter = CLUTTER_LIST_MODEL (model)->priv->temp_iter;

  while (!g_sequence_iter_is_begin (filter_prev))
    {
      CLUTTER_LIST_MODEL_ITER (temp_iter)->seq_iter = filter_prev;

      if (clutter_model_filter_iter (model, temp_iter))
        {
          row -= 1;
          break;
        }

      filter_prev = g_sequence_iter_prev (filter_prev);
    }

  if (g_sequence_iter_is_begin (filter_prev))
    row -= 1;

  /* update the iterator and return it */
  clutter_model_iter_set_row (CLUTTER_MODEL_ITER (iter_default), row);
  iter_default->seq_iter = filter_prev;

  return CLUTTER_MODEL_ITER (iter_default);
}
Ejemplo n.º 4
0
static ClutterModelIter *
clutter_list_model_get_iter_at_row (ClutterModel *model,
                                    guint         row)
{
  ClutterListModel *model_default = CLUTTER_LIST_MODEL (model);
  GSequence *sequence = model_default->priv->sequence;
  gint seq_length = g_sequence_get_length (sequence);
  ClutterListModelIter *retval;

  if (row >= seq_length)
    return NULL;

  retval = g_object_new (CLUTTER_TYPE_LIST_MODEL_ITER,
                         "model", model,
                         "row", row,
                         NULL);

  /* short-circuit in case we don't have a filter in place */
  if (!clutter_model_get_filter_set (model))
    {
      retval->seq_iter = g_sequence_get_iter_at_pos (sequence, row);

      return CLUTTER_MODEL_ITER (retval);
    }

  if (row == 0)
    {
      GSequenceIter *filter_next;
      gboolean row_found = FALSE;

      filter_next = g_sequence_get_begin_iter (sequence);
      g_assert (filter_next != NULL);

      while (!g_sequence_iter_is_end (filter_next))
        {
          retval->seq_iter = filter_next;

          if (clutter_model_filter_iter (model, CLUTTER_MODEL_ITER (retval)))
            {
              /* We've found a row that is valid under the filter */
              row_found = TRUE;
              break;
            }

          filter_next = g_sequence_iter_next (filter_next);
        }

      /* Everything has been filtered -> there is no first row */
      if (!row_found)
        {
          g_object_unref (retval);
          return NULL;
        }
    }
  else
    {
      GSequenceIter *filter_prev;

      filter_prev = g_sequence_get_end_iter (sequence);
      g_assert (filter_prev != NULL);

      filter_prev = g_sequence_iter_prev (filter_prev);

      while (!g_sequence_iter_is_begin (filter_prev))
        {
          retval->seq_iter = filter_prev;

          if (clutter_model_filter_iter (model, CLUTTER_MODEL_ITER (retval)))
            break;

          filter_prev = g_sequence_iter_prev (filter_prev);
        }
    }

  return CLUTTER_MODEL_ITER (retval);
}