1
require 'sitepage'
2
3
require 'Qt4'
4
5
class MainWindow < Qt::MainWindow
6
7
    attr_reader :sites
8
    attr_reader :trayIcon
9
    
10
    def initialize( parent )
11
        super( parent )
12
13
        @sites = Array.new
14
        
15
        setWindowTitle( tr( "RPProj" ) )
16
        createActions
17
        createMenus
18
        createUI
19
        createTrayIcon
20
        loadSettings
21
    end
22
23
    def addSite( sitepage )
24
        @sites.push( sitepage )
25
        @pages.addTab( sitepage, sitepage.name )
26
        @settingsMenu.addAction( sitepage.configureAction )
27
        sitepage.refreshView
28
    end
29
30
    def closeEvent( event )
31
        saveSettings
32
        super event
33
    end
34
35
    def toggleVisibility
36
        if isVisible then
37
            hide
38
        else
39
            show
40
        end
41
    end
42
43
    def trayIconActivated( reason )
44
        if reason == Qt::SystemTrayIcon.Trigger then
45
            toggleVisibility
46
        end
47
    end
48
49
    def createAccount
50
        name = ""
51
        while name.empty? or accountExists( name ) do
52
            name = Qt::InputDialog::getText( self, tr( "Select Name" ),
53
                                             tr( "Please input a name for the new account:") )
54
            if name.nil? then
55
                return
56
            end
57
        end
58
        addSite( SitePage.new( name, self ) )
59
    end
60
61
    def accountExists( name )
62
        @sites.each do |site|
63
            if site.name.equal?( name ) then
64
                return true
65
            end
66
        end
67
        return false
68
    end
69
70
    def saveAndQuit
71
        saveSettings
72
        Qt::Application.instance.quit
73
    end
74
75
    private
76
77
    def createActions
78
        @addAccountAction = Qt::Action.new( tr( "New Account" ), self )
79
        @addAccountAction.connect( SIGNAL(:triggered) ) { createAccount }
80
81
        @createIssueAction = Qt::Action.new( tr( "Create Issue" ), self )
82
        @createIssueAction.shortcut = 'Ctrl+N'
83
        @createIssueAction.connect( SIGNAL(:triggered) ) { createNewIssue }
84
85
        @editCurrentIssueAction = Qt::Action.new( tr( "Edit Selected Issue" ), self )
86
        @editCurrentIssueAction.shortcut = 'Ctrl+E'
87
        @editCurrentIssueAction.connect( SIGNAL(:triggered) ) { editCurrentIssue }
88
89
        @viewCurrentIssueAction = Qt::Action.new( tr( "View Issue Details" ), self )
90
        @viewCurrentIssueAction.shortcut = 'Enter'
91
        @viewCurrentIssueAction.connect( SIGNAL(:triggered) ) { viewCurrentIssue }
92
        
93
        @quitAppAction = Qt::Action.new( tr( "Quit" ), self )
94
        @quitAppAction.shortcut = 'Ctrl+Q'
95
        @quitAppAction.connect( SIGNAL(:triggered) ) { saveAndQuit }
96
    end
97
98
    def createMenus
99
        @fileMenu = Qt::Menu.new( tr( "File" ), self )
100
        @fileMenu.addAction( @addAccountAction )
101
        @fileMenu.addSeparator
102
        @fileMenu.addAction( @viewCurrentIssueAction )
103
        @fileMenu.addSeparator
104
        @fileMenu.addAction( @createIssueAction )
105
        @fileMenu.addAction( @editCurrentIssueAction )
106
        @fileMenu.addSeparator
107
        @fileMenu.addAction( @quitAppAction )
108
109
        @settingsMenu = Qt::Menu.new( tr( "Settings" ), self )
110
111
        menuBar.addMenu( @fileMenu )
112
        menuBar.addMenu( @settingsMenu )
113
114
        @trayMenu = Qt::Menu.new( self )
115
        @trayMenu.addAction( @quitAppAction )
116
    end
117
118
    def createUI
119
        @pages = Qt::TabWidget.new( self )
120
121
        @mainWidget = Qt::Widget.new( self )
122
        @mainLayout = Qt::HBoxLayout.new
123
        @mainLayout.addWidget( @pages )
124
        @mainWidget.setLayout( @mainLayout )
125
        setCentralWidget( @mainWidget )
126
    end
127
128
    def createTrayIcon
129
        @trayIcon = Qt::SystemTrayIcon.new( Qt::Icon.new( Qt::Application.instance.windowIcon ) )
130
        @trayIcon.setToolTip( tr( "RPProj - Project Management Client" ) )
131
        @trayIcon.connect( SIGNAL('activated(QSystemTrayIcon::ActivationReason)') ) do |r|
132
            trayIconActivated(r)
133
        end
134
        @trayIcon.contextMenu = @trayMenu
135
        @trayIcon.show
136
    end
137
138
    def saveSettings
139
        settings = Qt::Settings.new
140
141
        settings.beginGroup( "MainWindow" )
142
        settings.setValue( "geometry", Qt::Variant::fromValue( saveGeometry ) )
143
        settings.setValue( "state", Qt::Variant::fromValue( saveState.to_s ) )
144
        settings.endGroup
145
146
        settings.beginGroup( "Accounts" )
147
        @sites.each do |page|
148
            settings.beginGroup( page.name )
149
            settings.remove( "" )
150
            s = page.adapter.saveSettings
151
            s.keys.each do |k|
152
                settings.setValue( k, Qt::Variant::fromValue( s[k] ) )
153
            end
154
            settings.endGroup
155
        end
156
        settings.endGroup
157
        
158
        settings.sync
159
    end
160
161
    def loadSettings
162
        settings = Qt::Settings.new
163
164
        settings.beginGroup( "MainWindow" )
165
         restoreGeometry( settings.value( "geometry" ).toByteArray )
166
         restoreState( settings.value( "state" ).toByteArray )
167
        settings.endGroup
168
169
        settings.beginGroup( "Accounts" )
170
        settings.childGroups.each do |acc|
171
            site = SitePage.new( acc, self )
172
            s = {}
173
            settings.beginGroup( acc )
174
            settings.childKeys.each do |k|
175
                s[k] = settings.value( k )
176
            end
177
            settings.endGroup
178
            site.adapter.restoreSettings( s )
179
            addSite( site )
180
        end
181
        settings.endGroup
182
    end
183
184
    def createNewIssue
185
        if not @pages.currentWidget.nil? then
186
            @pages.currentWidget.createIssueAction.trigger
187
        end
188
    end
189
    
190
    def editCurrentIssue
191
        if not @pages.currentWidget.nil? then
192
            @pages.currentWidget.editCurrentAction.trigger
193
        end
194
    end
195
196
    def viewCurrentIssue
197
        if not @pages.currentWidget.nil? then
198
            @pages.currentWidget.viewCurrentAction.trigger
199
        end
200
    end
201
    
202
end