2016-07-05 9 views
20

मेरे ओएसएक्स इलेक्ट्रॉन ऐप में मेरे पास एक ट्रे आइकन है जिसे मैं इलेक्ट्रॉन ऐप विंडो खोलने और बंद करने के बीच टॉगल करना चाहता हूं। ओएसएक्स ड्रॉपबॉक्स ट्रे आइकन पर क्लिक करने के समान ही ड्रॉपबॉक्स ट्रे मेनू को खोल और बंद कर देगा, भले ही आप ट्रे आइकन पर कितनी तेजी से क्लिक करें।इलेक्ट्रॉन ट्रे क्लिक घटनाओं को विश्वसनीय रूप से काम करने के लिए कैसे करें?

यहाँ कोड मैं का उपयोग कर रहा है:

tray.on('click', function(e){ 
    if (mainWindow.isVisible()) { 
     mainWindow.hide() 
    } else { 
     mainWindow.show() 
    } 
    }); 

यह काम करता है अगर आप धीरे धीरे क्लिक करें (क्लिक के बीच एक दूसरे इंतजार) लेकिन यदि आप बार-बार क्लिक करें, एक दूसरे में 1x से ज्यादा, क्लिक विफल रहता है और कुछ नहीं हुआ। मुझे दस्तावेज़ों में किसी भी प्रकार की देरी नहीं मिली। क्या हो रहा है और क्लिक ईवेंट को कैसे विश्वसनीय तरीके से काम करने के बारे में कोई विचार विश्वसनीय है?

उत्तर

14

जो समस्या आप वर्णन कर रहे हैं वह पुन: उत्पन्न करना आसान है। नतीजा जो आप प्राप्त कर रहे हैं वह आपके पक्ष में एक बग या गलत कार्यान्वयन नहीं है, लेकिन मौजूदा तरीके से इलेक्ट्रान इन ट्रे घटनाओं को ट्रे तत्व पर संभालने का अनुमानित परिणाम है।

कक्षा Tray क्लिक करने के सापेक्ष 3 घटनाओं को उजागर करता है: click, double-click और right-click

यदि आप right-click ईवेंट का उपयोग करते हैं, तो आपको यह समस्या नहीं होगी, आप जितनी जल्दी चाहें क्लिक कर सकते हैं, आपको हर बार कॉलबैक मिलेगा।

उदाहरण इस घटना को संभालने के लिए के लिए MacOS के लिए इलेक्ट्रॉन कोड the following है:

- (void)rightMouseUp:(NSEvent*)event { 
    trayIcon_->NotifyRightClicked(
    [self getBoundsFromEvent:event], 
    ui::EventFlagsFromModifiers([event modifierFlags])); 
} 

हर सही क्लिक के लिए, वे right-click घटना फायरिंग कर रहे हैं और बस इतना ही।

अब अगर हम कैसे लेफ्ट क्लिक नियंत्रित किया जाता है पर एक नज़र डालें, the code थोड़ा अलग है:

- (void)mouseUp:(NSEvent*)event { 

    // ... 
    // Truncated to only show the relevant part... 
    // ... 

    // Single click event. 
    if (event.clickCount == 1) 
    trayIcon_->NotifyClicked(
     [self getBoundsFromEvent:event], 
     ui::EventFlagsFromModifiers([event modifierFlags])); 

    // Double click event. 
    if (event.clickCount == 2) 
    trayIcon_->NotifyDoubleClicked(
     [self getBoundsFromEvent:event], 
     ui::EventFlagsFromModifiers([event modifierFlags])); 

    [self setNeedsDisplay:YES]; 
} 

ट्रे आइकन कई बार क्लिक किया है, event.clickCount हमेशा 1 वापस नहीं करता है। इसके बजाए, यह एक मान देता है जो क्लिक किए गए समय की गणना करता है।

तो जब आप बहुत तेजी से ट्रे आइकन क्लिक करें, event.clickCount2 से अधिक मूल्य होगा और वे केवल एक घटना उत्सर्जन कर रहे हैं जब मूल्य 1 या 2 है और अगर यह मामला नहीं है, वे नहीं है कोई फॉलबैक है, वे बस किसी भी घटना को उत्सर्जित नहीं करते हैं। पर्याप्त परिणाम क्लिक करते समय आप अपने परीक्षणों में देख रहे हैं।

तो इलेक्ट्रॉन के कार्यान्वयन को संशोधित किए बिना, कोई समस्या या पुल अनुरोध सबमिट करने के बाद, आप इस व्यवहार से बचने के समय नहीं कर सकते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे