[gtkmm] ScrolledWindow - nur vertikales scrollen



  • Hi,

    ich würde gern ein scrolledwindow erstellen, das nur vertikal scrollt, sich horizontal wie ein normaler container verhält. Dabei ist das zweite wichtiger als das erste. Es bedeutet vor allem, dass ich mehrere solche scrolledwindows in eine hbox stecken kann, und der platz dann entsprechend den proportionen verteilt wird. Hier etwas beispielcode:

    #include <gtkmm.h>
    
    class window1
      : public Gtk::Window
    {
    private:
      Gtk::HBox box;
        Gtk::Button b1;
        Gtk::Button b2;
        Gtk::Button b3;
    
    public:
      window1 ()
        : b1 ("foo"), b2 ("foobarbazoo"), b3 ("foobar")
      {
        add (box);
        box.add (b1);
        box.add (b2);
        box.add (b3);
    
        show_all_children ();
      }
    };
    
    class window2
      : public Gtk::Window
    {
    private:
      Gtk::HBox box;
        Gtk::ScrolledWindow s1, s2, s3;
        Gtk::Button b1, b2, b3;
    
    public:
      window2 ()
        : b1 ("foo"), b2 ("foobarbazoo"), b3 ("foobar")
      {
        add (box);
    
        box.add (s1);
        s1.add (b1);
    
        box.add (s2);
        s2.add (b2);
    
        box.add (s3);
        s3.add (b3);
    
        show_all_children ();
      }
    };
    
    int
    main (int argc, char** argv)
    {
      Gtk::Main kit (argc, argv);
    
      window1 w1;
      window2 w2;
      w2.show ();
    
      Gtk::Main::run (w1);
    
      return 0;
    }
    

    In window1 wird den buttons platz zugestanden, in abhängigkeit davon, wie breit der text ist. In window2 ist jedes ScrolledWindow gleich breit, obwohl die buttons in ihnen es nicht sind. _das_ würde ich gerne abschaffen.
    Was ich schon versucht habe:

    • die scolling-policy in x-richtung auf Gtk::POLICY_NEVER setzen. Das bewirkt nur, dass die scrollbars nicht angezeigt werden, aber immer noch sind alle scrolledwindows gleich breit.
    • s.set_size_request (b.get_width ()) - geht nicht, weil b.get_width () scheinbar immer 1 zurückgibt.


  • Hi,

    nicht dass du denkst ich habe dich vergessen, ich denk schon dran, habe aber grad nur keine Zeit. Über's Osterwochenende werd' ich danach schauen (sofern das Problem noch besteht?).

    Grüße

    GPC



  • Ja, das Problem besteht noch, ich bin aber ein stück weitergekommen:

    die klasse VScrolledWindow

    class VScrolledWindow
      : public Gtk::ScrolledWindow
    {
    public:
      VScrolledWindow()
      {
        set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
      }
    
      virtual ~VScrolledWindow() {}
    
    protected:
      virtual void
      on_size_request (Gtk::Requisition* requisition)
      {
        Gtk::ScrolledWindow::on_size_request (requisition);
    
        Gtk::Widget* child = get_child ();
        Gtk::Widget* vsb = get_vscrollbar ();
    
        Gtk::Requisition c_req = {0, 0};
        Gtk::Requisition sb_req = {0, 0};
    
        if (child && child -> is_visible ())
          c_req = child -> size_request ();
    
        if (vsb && vsb -> is_visible())
          sb_req = vsb -> size_request();
      }
    };
    

    verhält sich nahezu wie erwartet. Der einzige Mangel ist, dass sie die größe nicht ändert, wenn sich die größe des gewrappten wigdets ändert. Soll heißen: wenn child z.B. eine vbox ist, und ich zur laufzeit einen größeren button einfüge, ändert sich die größenanforderung der vbox, nicht aber des VScrolledWindows.

    @GPC: klasse



  • Mir scheint als fehlt eine letzte Zeile

    requisition -> width = c_req.width + sb_req.width;
    

    in VScrolledWindow::on_size_request. Komisch, das es überhaupt mehr oder weniger funktioniert hat ohne. Wenn ich die Zeile hinzufüge sind jedenfalls alle probleme beseitigt.



  • okay, dass heißt weniger Arbeit für GPC 😃


Log in to reply