उपयोगकर्ता द्वारा विंडो का आकार बदलने पर GtkIconView स्वचालित रूप से आइकन के साथ स्थान नहीं भरता है


9

Ubuntu Accomplishments परियोजना में हम कुछ असामान्य कीड़े हैं:

अर्थात् हमारे पास एक पृष्ठ पर GtkNotebook और एक GtkIconView के साथ एक विंडो है और दूसरे पृष्ठ पर एक और।

जब उपयोगकर्ता विंडो को फिर से आकार देता है तो आइकनव्यू स्वचालित रूप से आइकन के साथ अंतरिक्ष को नहीं भरता है (वे अपने मूल कॉलम लेआउट में रहते हैं) लेकिन अगर उपयोगकर्ता GtkNotebook पृष्ठों को बदलता है और इस तरह से आइकन को देखता है तो अंतरिक्ष को अपेक्षित रूप से लिया जाता है। विंडो का आकार बदलते समय हम अपने आप अंतरिक्ष का उपयोग कैसे कर सकते हैं?

हालांकि इससे अधिक क्या है कि जब खिड़की दिखाई देती है, तो हम इसे छोटा आकार दे सकते हैं - ऐसा लगता है जैसे कि आइकॉव हमें आकार बदलने से रोक रहा है और फिर आइकन के लिए स्क्रॉल करने योग्य क्षेत्र है।

कोड इस तरह दिखता है। ListStores जो IconViews को चलाता है:

    self.trophystore = Gtk.ListStore(str, GdkPixbuf.Pixbuf, bool, bool, str, str) # title, icon accomplished, locked, app, accomplishment
    self.trophystore.set_sort_column_id(COL_TITLE, Gtk.SortType.ASCENDING)
    self.trophy_icon.set_model(self.trophystore)

    self.oppstore = Gtk.ListStore(str, GdkPixbuf.Pixbuf, bool, bool, str, str) # title, icon, accomplished, locked, app, accomplishment
    self.oppstore.set_sort_column_id(COL_TITLE, Gtk.SortType.ASCENDING)
    self.opp_icon.set_model(self.oppstore)

    self.trophy_icon.set_text_column(COL_TITLE)
    self.trophy_icon.set_pixbuf_column(COL_PIXBUF)

    self.opp_icon.set_text_column(COL_TITLE)
    self.opp_icon.set_pixbuf_column(COL_PIXBUF)

इसके अलावा, हम वास्तव में IconViews के साथ नहीं घूमते हैं, हम केवल दृश्यों को अपडेट करने के लिए सूची में सामग्री जोड़ते हैं।

परियोजना के लिए कोड यहाँ है - क्या कोई भी सिफारिश कर सकता है कि हम इन दो मुद्दों को कैसे ठीक कर सकते हैं?


बस एक स्पष्टीकरण: जब उपयोगकर्ता नोटबुक पृष्ठों को बदलता है, तो एप्लिकेशन कोड अंतर्निहित मॉडल को साफ़ करता है और सभी आइटम को फिर से जोड़ता है, जो खाली स्थान को ताज़ा करने और उपयोग करने के लिए GtkIconView का कारण लगता है।
राफेल Cieślak

जवाबों:


3

ठीक है, जैसा कि हमारे पास यह पता लगाना है कि इसे कैसे ठीक किया जाए, मैं यहां समाधान का वर्णन करूंगा, अगर किसी और को यह समस्या है।

चाल GtkIconView को GtkScrolledWindow में रखने के लिए है , और इसे "हमेशा" hscrollbar_policy सेट करें। फिर, एक चेक-रिसाइज़ सिग्नल का उपयोग किया जाता है, जब उपयोगकर्ता खिड़की का आकार बदलने के लिए प्रतिक्रिया करता है (ध्यान दें कि यह जांचना चाहिए कि क्या आकार बदल गया है, संकेत के लिए भी उत्सर्जित किया जाता है जैसे कि खिड़की को चारों ओर से घसीटा जाता है)।

जब आकार बदलता है, तो GtkIconView द्वारा उपयोग किए जाने वाले मॉडल को साफ़ करना और फिर से बनाना होगा, क्योंकि यह GtkIconView को नए प्राप्त स्थान (या सिकुड़ते) को ठीक से ट्रिगर करता है। इसके अलावा, परिणाम के रूप में क्षैतिज स्क्रॉलबार कभी नहीं देखा जाएगा, क्योंकि GtkIconView GtkScrolledWindow का उपयोग करता है, ठीक उसी स्थान का उपयोग करता है।


यह बहुत उपयोगी रहा है, उत्तर के लिए धन्यवाद! मैं lp: qreator पर इससे प्रभावित था और आपके फिक्स के साथ मुख्य आइकन दृश्य में आइकन कॉलम की संख्या फिर से आकार बदलने पर गतिशील है।
डेविड प्लेनेला

1

इस समस्या का मेरा पसंदीदा समाधान Gtk.IconView का एक बहुत छोटा उपवर्ग है:

class FluidIconView (Gtk.IconView):
    def __init__ (self):
        Gtk.IconView.__init__ (self)
        self.connect ("size-allocate", FluidIconView.on_size_allocate)

    def do_get_preferred_width (self):
        return (0,0)

    def on_size_allocate (self, allocation):
        [self.set_columns (m) for m in [1,self.get_columns ()]]

Get_preferred_width ओवरराइड दृश्य को मनमाने ढंग से संकीर्ण होने की अनुमति देता है। आकार-आवंटित कॉलबैक स्तंभों की संख्या को 1 और पीछे सेट करके एक रिलेआउट को बाध्य करता है।


1

आकार बदलने पर आप कॉलम को 0 और वापस -1 पर भी सेट कर सकते हैं। इस तरह से आइकन का चयन रद्द नहीं किया जाएगा:

iconview.set_columns(0)
iconview.set_columns(-1)

(यह किया जाना चाहिए , इसके अलावा में करने के लिए @ rafalcieslak का जवाब ।)


यह रफ़ालसीलकों के उत्तर के अतिरिक्त क्यों है? यदि आप कॉलम की संख्या बदलते हैं, तो आपको एक रिलेआउट मिलेगा; वैसे भी मॉडल का पुनर्निर्माण करना व्यर्थ होगा।
सीएसकेरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.