Ticket #9906: 0001-drive-popup.patch

File 0001-drive-popup.patch, 8.3 KB (added by Freeman, 10 years ago)
  • MainWindow.cpp

    From 146d9162160543aaf044291ee664b9e8575899e8 Mon Sep 17 00:00:00 2001
    From: Freeman Lou <freemanlou2430@Yahoo.com>
    Date: Mon, 25 Nov 2013 00:52:15 +0000
    Subject: [PATCH] drive popup
    
    ---
     MainWindow.cpp | 109 ++++++++++++++++++++++++++++++++++++++++++++++-----------
     MainWindow.h   |  11 +++++-
     2 files changed, 99 insertions(+), 21 deletions(-)
    
    diff --git a/MainWindow.cpp b/MainWindow.cpp
    index 30b6c8f..421a4aa 100644
    a b MainWindow::MainWindow()  
    268268    menuBar->AddItem(fPartitionMenu);
    269269
    270270    AddChild(menuBar);
     271   
     272    //Popup Menu
     273    fPopUpMenu = new BPopUpMenu("Pop Up Options");
     274    fPopUpCreate = new BMenuItem(B_TRANSLATE("Create" B_UTF8_ELLIPSIS),
     275        new BMessage(MSG_CREATE), 'C');
     276    fPopUpChange = new BMenuItem(
     277        B_TRANSLATE("Change parameters" B_UTF8_ELLIPSIS),
     278        new BMessage(MSG_CHANGE));
     279    fPopUpDelete = new BMenuItem(B_TRANSLATE("Delete"),
     280        new BMessage(MSG_DELETE), 'D');
     281    fPopUpMount = new BMenuItem(B_TRANSLATE("Mount"),
     282        new BMessage(MSG_MOUNT), 'M');
     283    fPopUpUnmount = new BMenuItem(B_TRANSLATE("Unmount"),
     284        new BMessage(MSG_UNMOUNT), 'U');
     285    fPopUpFormat = new BMenu(B_TRANSLATE("Format"));
     286   
     287    fPopUpMenu->AddItem(fPopUpCreate);
     288    fPopUpMenu->AddItem(fPopUpFormat);
     289    fPopUpMenu->AddItem(fPopUpChange);
     290    fPopUpMenu->AddItem(fPopUpDelete);
     291    fPopUpMenu->AddSeparatorItem();
     292    fPopUpMenu->AddItem(fPopUpMount);
     293    fPopUpMenu->AddItem(fPopUpUnmount);
     294    fPopUpMenu->SetTargetForItems(this);
    271295
    272296    // add DiskView
    273297    BRect r(Bounds());
    MainWindow::MessageReceived(BMessage* message)  
    324348        case MSG_UNMOUNT:
    325349            _Unmount(fCurrentDisk, fCurrentPartitionID);
    326350            break;
    327 
     351       
    328352        case MSG_FORMAT:
    329353            printf("MSG_FORMAT\n");
    330354            break;
    331 
     355       
    332356        case MSG_CREATE:
    333357            _Create(fCurrentDisk, fCurrentPartitionID);
    334358            break;
    MainWindow::MessageReceived(BMessage* message)  
    340364            _Initialize(fCurrentDisk, fCurrentPartitionID, diskSystemName);
    341365            break;
    342366        }
    343 
     367       
    344368        case MSG_CHANGE:
    345369            _ChangeParameters(fCurrentDisk, fCurrentPartitionID);
    346370            break;
    347 
     371       
    348372        case MSG_DELETE:
    349373            _Delete(fCurrentDisk, fCurrentPartitionID);
    350374            break;
    MainWindow::MessageReceived(BMessage* message)  
    369393            _ScanDrives();
    370394            break;
    371395
    372         case MSG_PARTITION_ROW_SELECTED:
     396        case MSG_PARTITION_ROW_SELECTED: {
    373397            // selection of partitions via list view
    374398            _AdaptToSelectedPartition();
     399
     400            BPoint where;
     401            uint32 buttons;
     402            fListView->GetMouse(&where, &buttons);
     403            if (buttons & B_SECONDARY_MOUSE_BUTTON)
     404                fPopUpMenu->Go(fListView->ConvertToScreen(where),true,false,true);
    375405            break;
     406        }
    376407        case MSG_SELECTED_PARTITION_ID: {
    377408            // selection of partitions via disk view
    378409            partition_id id;
    MainWindow::MessageReceived(BMessage* message)  
    383414                    _AdaptToSelectedPartition();
    384415                }
    385416            }
     417            BPoint where;
     418            uint32 buttons;
     419            fListView->GetMouse(&where, &buttons);
     420            if (buttons & B_SECONDARY_MOUSE_BUTTON)
     421                fPopUpMenu->Go(fListView->ConvertToScreen(where),true,false,true);
    386422            break;
    387423        }
    388 
    389424        default:
    390425            BWindow::MessageReceived(message);
    391426            break;
    MainWindow::_UpdateMenus(BDiskDevice* disk,  
    576611        delete item;
    577612    while (BMenuItem* item = fDiskInitMenu->RemoveItem((int32)0))
    578613        delete item;
    579 
     614    while (BMenuItem* item = fPopUpFormat->RemoveItem((int32)0))
     615        delete item;
     616       
    580617    fCreateMenuItem->SetEnabled(false);
    581618    fUnmountMenuItem->SetEnabled(false);
    582619    fDiskInitMenu->SetEnabled(false);
    583620    fFormatMenu->SetEnabled(false);
    584 
     621   
     622    fPopUpCreate->SetEnabled(false);
     623    fPopUpUnmount->SetEnabled(false);
     624    fPopUpFormat->SetEnabled(false);
     625   
    585626    if (!disk) {
    586627        fWipeMenuItem->SetEnabled(false);
    587628        fEjectMenuItem->SetEnabled(false);
    588629        fSurfaceTestMenuItem->SetEnabled(false);
    589630    } else {
    590 //      fWipeMenuItem->SetEnabled(true);
     631        //fWipeMenuItem->SetEnabled(true);
    591632        fWipeMenuItem->SetEnabled(false);
    592633        fEjectMenuItem->SetEnabled(disk->IsRemovableMedia());
    593 //      fSurfaceTestMenuItem->SetEnabled(true);
     634        //fSurfaceTestMenuItem->SetEnabled(true);
    594635        fSurfaceTestMenuItem->SetEnabled(false);
    595636
    596637        // Create menu and items
    MainWindow::_UpdateMenus(BDiskDevice* disk,  
    600641            parentPartition = disk->FindDescendant(parentID);
    601642        }
    602643
    603         if (parentPartition && parentPartition->ContainsPartitioningSystem())
     644        if (parentPartition && parentPartition->ContainsPartitioningSystem()) {
    604645            fCreateMenuItem->SetEnabled(true);
    605 
     646            fPopUpCreate->SetEnabled(true);
     647        }
    606648        bool prepared = disk->PrepareModifications() == B_OK;
     649       
    607650        fFormatMenu->SetEnabled(prepared);
    608651        fDeleteMenuItem->SetEnabled(prepared);
    609652        fChangeMenuItem->SetEnabled(prepared);
    610 
     653       
     654        fPopUpChange->SetEnabled(prepared);
     655        fPopUpDelete->SetEnabled(prepared);
     656        fPopUpFormat->SetEnabled(prepared);
     657       
    611658        BPartition* partition = disk->FindDescendant(selectedPartition);
    612659
    613660        BDiskSystem diskSystem;
    MainWindow::_UpdateMenus(BDiskDevice* disk,  
    623670            BString label = diskSystem.PrettyName();
    624671            label << B_UTF8_ELLIPSIS;
    625672            BMenuItem* item = new BMenuItem(label.String(), message);
    626 
    627673            // TODO: Very unintuitive that we have to use PrettyName (vs Name)
    628674            item->SetEnabled(partition != NULL
    629675                && partition->CanInitialize(diskSystem.PrettyName()));
    MainWindow::_UpdateMenus(BDiskDevice* disk,  
    635681            } else if (diskSystem.IsFileSystem()) {
    636682                // Otherwise a filesystem
    637683                fFormatMenu->AddItem(item);
     684               
     685                //For Popup format menu
     686                BMessage* message = new BMessage(MSG_INITIALIZE);
     687                message->AddInt32("parent id", parentID);
     688                message->AddString("disk system", diskSystem.PrettyName());
     689                BMenuItem* popUpItem = new BMenuItem(label.String(), message);
     690                popUpItem->SetEnabled(partition != NULL
     691                    && partition->CanInitialize(diskSystem.PrettyName()));
     692                fPopUpFormat->AddItem(popUpItem);
     693                fPopUpFormat->SetTargetForItems(this);
    638694            }
    639695        }
    640696
    MainWindow::_UpdateMenus(BDiskDevice* disk,  
    643699            bool notMountedAndWritable = !partition->IsMounted()
    644700                && !partition->IsReadOnly()
    645701                && partition->Device()->HasMedia();
    646 
     702   
    647703            fFormatMenu->SetEnabled(notMountedAndWritable
    648704                && fFormatMenu->CountItems() > 0);
    649 
    650705            fDiskInitMenu->SetEnabled(notMountedAndWritable
    651706                && partition->IsDevice()
    652707                && fDiskInitMenu->CountItems() > 0);
    653 
    654708            fChangeMenuItem->SetEnabled(notMountedAndWritable);
    655 
    656709            fDeleteMenuItem->SetEnabled(notMountedAndWritable
    657710                && !partition->IsDevice());
    658 
    659711            fMountMenuItem->SetEnabled(!partition->IsMounted());
    660 
     712           
     713            fPopUpFormat->SetEnabled(notMountedAndWritable
     714                && fPopUpFormat->CountItems() > 0);
     715            fPopUpChange->SetEnabled(notMountedAndWritable);
     716            fPopUpDelete->SetEnabled(notMountedAndWritable
     717                && !partition->IsDevice());
     718            fPopUpMount->SetEnabled(notMountedAndWritable);
     719           
    661720            bool unMountable = false;
    662721            if (partition->IsMounted()) {
    663722                // see if this partition is the boot volume
    MainWindow::_UpdateMenus(BDiskDevice* disk,  
    670729                    unMountable = true;
    671730            }
    672731            fUnmountMenuItem->SetEnabled(unMountable);
     732            fPopUpUnmount->SetEnabled(unMountable);
    673733        } else {
    674734            fDeleteMenuItem->SetEnabled(false);
    675735            fChangeMenuItem->SetEnabled(false);
    676736            fMountMenuItem->SetEnabled(false);
    677737            fFormatMenu->SetEnabled(false);
    678738            fDiskInitMenu->SetEnabled(false);
     739           
     740            fPopUpDelete->SetEnabled(false);
     741            fPopUpChange->SetEnabled(false);
     742            fPopUpMount->SetEnabled(false);
     743            fPopUpFormat->SetEnabled(false);
    679744        }
    680745
    681746        if (prepared)
    MainWindow::_UpdateMenus(BDiskDevice* disk,  
    687752        fDeleteMenuItem->SetEnabled(false);
    688753        fChangeMenuItem->SetEnabled(false);
    689754        fMountMenuItem->SetEnabled(false);
     755       
     756        fPopUpDelete->SetEnabled(false);
     757        fPopUpChange->SetEnabled(false);
     758        fPopUpMount->SetEnabled(false);
    690759    }
    691760}
    692761
  • MainWindow.h

    diff --git a/MainWindow.h b/MainWindow.h
    index dbf3f59..3cd214a 100644
    a b  
    1111
    1212
    1313#include <DiskDeviceRoster.h>
     14#include <PopUpMenu.h>
    1415#include <Window.h>
    1516
    1617#include "Support.h"
    class PartitionListView;  
    2526
    2627
    2728enum {
    28     MSG_SELECTED_PARTITION_ID   = 'spid'
     29    MSG_SELECTED_PARTITION_ID   = 'spid',
    2930};
    3031
    3132
    private:  
    101102            BMenuItem*          fMountMenuItem;
    102103            BMenuItem*          fUnmountMenuItem;
    103104            BMenuItem*          fMountAllMenuItem;
     105           
     106            BMenu*              fPopUpFormat;
     107            BMenuItem*          fPopUpCreate;
     108            BMenuItem*          fPopUpChange;
     109            BMenuItem*          fPopUpDelete;
     110            BMenuItem*          fPopUpMount;
     111            BMenuItem*          fPopUpUnmount;
     112            BPopUpMenu*         fPopUpMenu;
    104113};
    105114
    106115