web-dev-qa-db-ja.com

Gtk.Iconviewをダブルクリックではなくシングルクリックに反応させる方法は?

アプリでGtk.IconViewウィジェットを使用して、さまざまな種類の要素を選択します。 IconViewの動作方法は次のとおりです。

  • ワンクリックでアイテムを選択します
  • 追加のダブルクリックを行って、アイテムをアクティブにします

デスクトップのほとんどのボタンのようなウィジェットではシングルクリックが必要なだけであるため、追加のダブルクリックが必要であることは常に紛らわしいことがわかりました。今、私はそれを混乱させるいくつかのユーザーからフィードバックを得ました(誰かが「何もしなかった」ボタンをクリックするとバグだと思った)、私はその動作を変更する方法を調べることにしました。

理想的には、IconViewが次のように動作するようにします。

  • ホバーしてアイテムを選択する(オプション)
  • シングルクリックでアイテムがアクティブになります

ウィジェットのプロパティにそのような動作をさせるための明らかなものが見つかりませんでした。誰がどのように、またはそれを達成できるかを知っていますか?

Gtk.IconView in action

6
David Planella

解決策の1つ(ただし、シングルクリックアクティベーションのみ)は、IconViewのselection_changed信号を使用することが原因です(IconViewの選択はシングルクリックベースであるため)。

有効なon_item_activatedシグナルを想定するサンプルは次のとおりです。

def on_icon_view_selection_changed(self, widget):
        self.on_item_activated(widget, widget.get_selected_items()[0])
5
xubuntix

GtkIconViewは、ボタンウィジェットをテーブルに配置するものではありません。基本的にGtkTreeViewの特殊なケースであり、リスト/ツリーではなくグリッドにアイテムがレイア​​ウトされます。ホバーのアイテムをハイライトするには、GTK +へのパッチが必要だと思います。 APIを追加してシングルクリックとダブルクリックを有効にするためのパッチも必要ですが、この機能は、ウィジェットのbutton_press_event信号をリッスンすることで、既存のウィジェットAPIの上に実装できます、それに応じて行動します。

2
dobey

あなたは最近Gtkの制限を探求しているようです:-)

まず第一に、dobeysの答えは正しいようです。

ツリーストアとリストストアは、コレクションに適しています。タイプが同じでメタコンテンツが異なる大量のデータ(たとえば、すべての作品にアーティスト、アルバム、タイトルが含まれるが、実際のアーティスト名、アルバム名、タイトル名が変更される音楽コレクション)。

これらのウィジェットの良いところは、簡単に並べ替えることができ、多くのアイテムを選択できることです(たとえば、「ゴムバンド」モードで)。また、数千の類似アイテムを追加するのに比較的少ないコード行が必要です。

TreeViewまたはListViewの動作をアプリケーションごとレベルでクリック/ホバーなどに変更する方法は、ユーザーの動作を混乱させるため、お勧めできませんexpectアプリケーションの動作。質問で説明した反応に基づいて、自分自身を見つけました。

ただし、あなたの問題は、ウィジェットがTreeView/ListViewであることをユーザーが理解せず、代わりに多数のボタンであると考えたことです。そして、それはスクリーンショットに基づいて、理にかなっているようです。

ボタンは、アクションを開始する(例:停止、再生、一時停止)か、プログラムと通信する(例:Ok、キャンセル)か、別のビューへのリンクとしても機能します(LinkBut​​tonを参照)。通常、それらには(抽象的な)オブジェクトまたはアイテムが関連付けられていません(例:アルバム「Out of my head」の「Movits!」による「Sammy Davis Jr」)。

そのため、設定できないクリック動作はgtkの欠点ですが、とにかくユーザーごとのグローバルレベルでのみ行う必要があります。

おそらく grid with Buttons です。 (ボタンにはアイコンを含めることもできます)。

1
xubuntix

以下に、Iconviewをポインター位置に反応させて、ホバー効果とシングルクリックおよび右クリックのアクションを取得する方法を示します。

ウィジェットのpointer-motion-notifyをアクティブにしてから、ポインターのx、y位置をiconviewのパスに変換する必要があります。

...
    self.iconview.add_events(Gdk.EventMask.POINTER_MOTION_MASK)
    self.iconview.connect("item-activated", self.iv_icon_activated)
    self.iconview.connect("button-press-event", self.on_mouse_click)
    self.iconview.connect("motion-notify-event", self.on_pointer_motion)

def on_pointer_motion(self, widget, event):
    path= self.iconview.get_path_at_pos(event.x, event.y)
    if path !=None:
            self.iconview.select_path(path)
    #If we're outside of an item, deselect all items (turn off highlighting)
    if path == None:
        self.iconview.unselect_all()

def on_mouse_click(self,widget, event):
    if event.type == Gdk.EventType.BUTTON_PRESS:
        path=self.iconview.get_selected_items()[0]
       #if right click activate a pop-up menu
        if event.button == 3 and path != None:
            self.popup.popup(None, None, None, None, event.button, event.time)
       #if left click, activate the item to execute
        if event.button == 1 and path != None:
            self.iv_icon_activated(widget, path)
1
Ian B.